Proposed kernel changes to dquot 5.6.0

Chris Rankin (rankinc@bellsouth.net)
Fri, 9 Jan 1998 08:53:50 -0500


------ =_NextPart_000_01BD1CDC.213BEC40
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit

Hi,

I have been experimenting with Linux disk quotas v5.6.0, and have
discovered several flaws. I am listing them below in order of decreasing
confidence so that someone else can verify my hacking :-). All changes
are w.r.t. linux/fs/dquot.c

a) quotactl() can only retrieve quota data from ONE of the groups that
you belong to:
This problem is in sys_quotactl(). The kernel verifies the requested
group-id against current->gid instead of using in_group_p(). The code
should read:

...
case Q_GETQUOTA:
if (((type == USRQUOTA && current->uid != id) ||
(type == GRPQUOTA && !in_group_p(id))) && !fsuser())
return(-EPERM);
break;
...

b) quotactl() never returns a useful error code when it fails to turn
disk quotas off:
The error code for quotactl(QCMD(Q_QUOTAOFF,... comes directly from the
quota_off() routine, which always returns 0. The only calls to
quota_off() that I have found in the kernel completely ignore this
return code (not surprisingly :-) and so I think that it is safe to be a
little more friendly to the person on the other end of quotactl(). To
this end, I suggest altering quota_off() as follows:

...
/*
** Fail with an error code if the device is bad ...
*/
if ( !(vfsmnt = lookup_vfsmnt(dev)) )
return -ENODEV;

for (cnt = 0; cnt < MAXQUOTAS; cnt++) {
if (type != -1 && cnt != type)
continue;

/*
** Return an error if the device doesn't have a quota enabled - unless
we are turning ALL quotas off (type==-1)
*/
if ( !(vfsmnt->mnt_quotas[cnt]) ) {
if (type == -1)
continue;
return -ESRCH;
}
...

c) quotactl(QMCD(Q_SYNC,..),NULL,...). does nothing.
When sys_quotactl() sees a NULL device for Q_SYNC, it is supposed to
sync ALL devices. To this end it passes 0 (NODEV) to the sync_dquots()
procedure. sync_dquots() then loops over its list of dquot structures
(TWICE ???!! I don't understand why the loop is for nr_dquots*2 !!!???)
looking for quotas to write to disk However, since the *empty* quota
structures in the list have dquot->dq_dev == NODEV, the current logic
skips the dev==NODEV case entirely. I propose the following:

...
for (i = nr_dquots; i > 0; i--, dquot = dquot->dq_next) {
if (dquot->dq_count == 0 || ((dev == NODEV) != (dquot->dq_dev !=
dev)))
continue;
...

This logic accepts EITHER quotas on the specific device you requested
(X)OR quotas on any device which isn't NODEV. It is worth pointing out
here that sys_sync() in linux/fs/buffer.c indirectly passes
sync_dquots() a device-number of 0, and then expects it to write
everything to disk (oops!).

d) Eliminated redundant code in check_bdq() and check_idq().

I have successfully compiled these changes into my 2.0.33 kernel and it
all seems to work. I would, however, appreciate a second/third/fourth
opinion.

Cheers,
Chris.

------ =_NextPart_000_01BD1CDC.213BEC40
Content-Type: application/octet-stream; name="dquot.c.diff"
Content-Transfer-Encoding: base64

LS0tIGRxdW90LmMJVGh1IEphbiAgOCAyMTozMzoyNyAxOTk4CisrKyAvdXNyL3NyYy9saW51eC9m
cy9kcXVvdC5jLm9sZAlTdW4gQXVnICAzIDE3OjMxOjM0IDE5OTcKQEAgLTE4LDE2ICsxOCwxMCBA
QAogICogQXV0aG9yOiAgTWFyY28gdmFuIFdpZXJpbmdlbiA8bXZ3QG1jcy5vdy5ubD4gPG12d0B0
bml4Lm5ldD4KICAqIAogICogRml4ZXM6ICAgRG1pdHJ5IEdvcm9kY2hhbmluIDxiZWdlbW90QGJn
bS5yb3NwcmludC5uZXQ+LCAxMSBGZWIgOTYKLSAqICAgICAgICAgIHJlbW92ZWQgcmFjZSBjb25k
aXRpb25zIGluIGRxcHV0KCksIGRxZ2V0KCkgYW5kIGlwdXQoKS4gCisgKgkgICAgcmVtb3ZlZCBy
YWNlIGNvbmRpdGlvbnMgaW4gZHFwdXQoKSwgZHFnZXQoKSBhbmQgaXB1dCgpLiAKICAqICAgICAg
ICAgIE5pY2sgS3JhbGV2aWNoIDxuaWNra3JhbEBjYWwuYWx1bW5pLmJlcmtlbGV5LmVkdT4sIDIx
IEp1bCA5NwogICogICAgICAgICAgRml4ZWQgYSBjb25kaXRpb24gd2hlcmUgdXNlciBhbmQgZ3Jv
dXAgcXVvdGFzIGNvdWxkIGdldCBtaXhlZCB1cC4KICAqCi0gKiAgICAgICAgICBDaHJpcyBSYW5r
aW4gPHJhbmtpbmNAYmVsbHNvdXRoLm5ldD4sIDMxIERlYyA5NywgMi00IEphbiA5OAotICogICAg
ICAgICAgRml4ZWQga2VybmVsIEFQSSBzbyB0aGF0IHRoZSB1c2VyIGNhbiBnZXQgdGhlIHF1b3Rh
IGZvciBhbnkKLSAqICAgICAgICAgIGdyb3VwIHMvaGUgYmVsb25ncyB0by4gQWxzbyByZXR1cm4g
dXNlZnVsIGVycm9yIGNvZGVzIHdoZW4KLSAqICAgICAgICAgIHR1cm5pbmcgcXVvdGFzIG9mZiwg
YW5kIGZpeGVkIHN5bmNfZHF1b3QoKSBzbyB0aGF0IGFsbCBkZXZpY2VzCi0gKiAgICAgICAgICBh
cmUgc3luY2VkIHdoZW4gZGV2PT1OT0RFVi4gCi0gKgogICogKEMpIENvcHlyaWdodCAxOTk0LCAx
OTk1IE1hcmNvIHZhbiBXaWVyaW5nZW4gCiAgKgogICovCkBAIC0yODcsMTcgKzI4MSw4IEBACiAJ
aW50IGk7CiAKIAlkcXN0YXRzLnN5bmNzKys7Ci0JZm9yIChpID0gbnJfZHF1b3RzOyBpID4gMDsg
aS0tLCBkcXVvdCA9IGRxdW90LT5kcV9uZXh0KSB7Ci0JCS8qCi0JCSoqIENocmlzIFJhbmtpbiAt
IDAzLzAxLzk4Ci0JCSoqIFdoZW4gZGV2ID09IE5PREVWLCBpdCBtZWFucyBzeW5jIHF1b3RhcyBv
biBBTEwgZmlsZS1zeXN0ZW1zIQotCQkqKiAgLSBhIHZhbGlkIHF1b3RhIHJlY29yZCBoYXMgZHFf
ZGV2IHVuZXF1YWwgdG8gTk9ERVYsIHNvIHRoZQotCQkqKiAgICBsb2dpYyBpcyAiaWYgc3luY2lu
ZyBhbGwgZGV2aWNlcyB0aGVuIGlnbm9yZSBpbnZhbGlkIHF1b3RhcywKLQkJKiogICAgICAgICAg
ICAgIGJ1dCBpZiBzeW5jaW5nIGEgc3BlY2lmaWMgZGV2aWNlIHRoZW4gaWdub3JlIHF1b3Rhcwot
CQkqKiAgICAgICAgICAgICAgb24gYWxsIG90aGVyIGRldmljZXMgKGluY2x1ZGluZyBpbnZhbGlk
IG9uZXMpLiIKLQkJKi8KLQkJaWYgKGRxdW90LT5kcV9jb3VudCA9PSAwIHx8ICgoZGV2ID09IE5P
REVWKSAhPSAoZHF1b3QtPmRxX2RldiAhPSBkZXYpKSkKLQkJLyoqLworCWZvciAoaSA9IDA7IGkg
PCBucl9kcXVvdHMgKiAyOyBpKyssIGRxdW90ID0gZHF1b3QtPmRxX25leHQpIHsKKwkJaWYgKGRl
diA9PSBOT0RFViB8fCBkcXVvdC0+ZHFfY291bnQgPT0gMCB8fCBkcXVvdC0+ZHFfZGV2ICE9IGRl
dikKIAkJCWNvbnRpbnVlOwogCQlpZiAodHlwZSAhPSAtMSAmJiBkcXVvdC0+ZHFfdHlwZSAhPSB0
eXBlKQogCQkJY29udGludWU7CkBAIC00MDMsMzAgKzM4OCwyNiBAQAogCQl9CiAJCXJldHVybihO
T19RVU9UQSk7CiAJfQotCS8qCi0JKiogQ2hyaXMgUmFua2luIC0gMDQvMDEvOTgKLQkqKiBFbGlt
aW5hdGVkIGNvbW1vbiBzdWJleHByZXNzaW9ucywgbWFraW5nIHRoaXMgZWFzaWVyIHRvIHJlYWQs
IHNob3J0ZXIsIC4uLgotCSovCiAJaWYgKGRxdW90LT5kcV9pc29mdGxpbWl0ICYmCi0JICAgKGRx
dW90LT5kcV9jdXJpbm9kZXMgKyBpbm9kZXMpID4gZHF1b3QtPmRxX2lzb2Z0bGltaXQgJiYgIWZz
dXNlcigpKSB7Ci0JCWlmICggIShkcXVvdC0+ZHFfaXRpbWUpICkgewotCQkJaWYgKG5lZWRfcHJp
bnRfd2FybmluZyh0eXBlLCBkcXVvdCkpIHsKLQkJCQlzcHJpbnRmKHF1b3RhbWVzc2FnZSwgIiVz
OiB3YXJuaW5nLCAlcyBmaWxlIHF1b3RhIGV4Y2VlZGVkXHJcbiIsCi0JCQkJICAgICAgICBkcXVv
dC0+ZHFfbW50LT5tbnRfZGlybmFtZSwgcXVvdGF0eXBlc1t0eXBlXSk7Ci0JCQkJdHR5X3dyaXRl
X21lc3NhZ2UoY3VycmVudC0+dHR5LCBxdW90YW1lc3NhZ2UpOwotCQkJfQotCQkJZHF1b3QtPmRx
X2l0aW1lID0gQ1VSUkVOVF9USU1FICsgZHF1b3QtPmRxX21udC0+bW50X2lleHBbdHlwZV07CisJ
ICAgKGRxdW90LT5kcV9jdXJpbm9kZXMgKyBpbm9kZXMpID4gZHF1b3QtPmRxX2lzb2Z0bGltaXQg
JiYKKwkgICAgZHF1b3QtPmRxX2l0aW1lICYmIENVUlJFTlRfVElNRSA+PSBkcXVvdC0+ZHFfaXRp
bWUgJiYgIWZzdXNlcigpKSB7CisgICAgICAgICAgICAgICAgaWYgKG5lZWRfcHJpbnRfd2Fybmlu
Zyh0eXBlLCBkcXVvdCkpIHsKKwkJCXNwcmludGYocXVvdGFtZXNzYWdlLCAiJXM6IHdhcm5pbmcs
ICVzIGZpbGUgcXVvdGEgZXhjZWVkZWQgdG9vIGxvbmcuXHJcbiIsCisJCSAgICAgICAgCWRxdW90
LT5kcV9tbnQtPm1udF9kaXJuYW1lLCBxdW90YXR5cGVzW3R5cGVdKTsKKwkJCXR0eV93cml0ZV9t
ZXNzYWdlKGN1cnJlbnQtPnR0eSwgcXVvdGFtZXNzYWdlKTsKIAkJfQotCQllbHNlIGlmIChDVVJS
RU5UX1RJTUUgPj0gZHF1b3QtPmRxX2l0aW1lKSB7Ci0JCQlpZiAobmVlZF9wcmludF93YXJuaW5n
KHR5cGUsIGRxdW90KSkgewotCQkJCXNwcmludGYocXVvdGFtZXNzYWdlLCAiJXM6IHdhcm5pbmcs
ICVzIGZpbGUgcXVvdGEgZXhjZWVkZWQgdG9vIGxvbmcuXHJcbiIsCi0JCQkJICAgICAgICBkcXVv
dC0+ZHFfbW50LT5tbnRfZGlybmFtZSwgcXVvdGF0eXBlc1t0eXBlXSk7Ci0JCQkJdHR5X3dyaXRl
X21lc3NhZ2UoY3VycmVudC0+dHR5LCBxdW90YW1lc3NhZ2UpOwotCQkJfQotCQkJcmV0dXJuKE5P
X1FVT1RBKTsKKwkJcmV0dXJuKE5PX1FVT1RBKTsKKwl9CisJaWYgKGRxdW90LT5kcV9pc29mdGxp
bWl0ICYmCisJICAgKGRxdW90LT5kcV9jdXJpbm9kZXMgKyBpbm9kZXMpID4gZHF1b3QtPmRxX2lz
b2Z0bGltaXQgJiYKKwkgICAgZHF1b3QtPmRxX2l0aW1lID09IDAgJiYgIWZzdXNlcigpKSB7Cisg
ICAgICAgICAgICAgICAgaWYgKG5lZWRfcHJpbnRfd2FybmluZyh0eXBlLCBkcXVvdCkpIHsKKwkJ
CXNwcmludGYocXVvdGFtZXNzYWdlLCAiJXM6IHdhcm5pbmcsICVzIGZpbGUgcXVvdGEgZXhjZWVk
ZWRcclxuIiwKKwkJICAgICAgICAJZHF1b3QtPmRxX21udC0+bW50X2Rpcm5hbWUsIHF1b3RhdHlw
ZXNbdHlwZV0pOworCQkJdHR5X3dyaXRlX21lc3NhZ2UoY3VycmVudC0+dHR5LCBxdW90YW1lc3Nh
Z2UpOwogCQl9CisJCWRxdW90LT5kcV9pdGltZSA9IENVUlJFTlRfVElNRSArIGRxdW90LT5kcV9t
bnQtPm1udF9pZXhwW3R5cGVdOwogCX0KLQkvKiovCiAJcmV0dXJuKFFVT1RBX09LKTsKIH0KIApA
QCAtNDQ1LDMwICs0MjYsMjYgQEAKIAkJfQogCQlyZXR1cm4oTk9fUVVPVEEpOwogCX0KLQkvKgot
CSoqIENocmlzIFJhbmtpbiAtIDA0LzAxLzk4Ci0JKiogRWxpbWluYXRlZCBjb21tb24gc3ViZXhw
cmVzc2lvbnMsIG1ha2luZyB0aGlzIGVhc2llciB0byByZWFkIGV0YyAuLi4KLQkqLwogCWlmIChk
cXVvdC0+ZHFfYnNvZnRsaW1pdCAmJgotCSAgIChkcXVvdC0+ZHFfY3VyYmxvY2tzICsgYmxvY2tz
KSA+IGRxdW90LT5kcV9ic29mdGxpbWl0ICYmICFmc3VzZXIoKSkgewotCQlpZiAoICEoZHF1b3Qt
PmRxX2J0aW1lKSApIHsKLQkJCWlmIChuZWVkX3ByaW50X3dhcm5pbmcodHlwZSwgZHF1b3QpKSB7
Ci0JCQkJc3ByaW50ZihxdW90YW1lc3NhZ2UsICIlczogd2FybmluZywgJXMgZGlzayBxdW90YSBl
eGNlZWRlZFxyXG4iLAotCQkJCSAgICAgICAgZHF1b3QtPmRxX21udC0+bW50X2Rpcm5hbWUsIHF1
b3RhdHlwZXNbdHlwZV0pOwotCQkJCXR0eV93cml0ZV9tZXNzYWdlKGN1cnJlbnQtPnR0eSwgcXVv
dGFtZXNzYWdlKTsKLQkJCX0KLQkJCWRxdW90LT5kcV9idGltZSA9IENVUlJFTlRfVElNRSArIGRx
dW90LT5kcV9tbnQtPm1udF9iZXhwW3R5cGVdOworCSAgIChkcXVvdC0+ZHFfY3VyYmxvY2tzICsg
YmxvY2tzKSA+IGRxdW90LT5kcV9ic29mdGxpbWl0ICYmCisJICAgIGRxdW90LT5kcV9idGltZSAm
JiBDVVJSRU5UX1RJTUUgPj0gZHF1b3QtPmRxX2J0aW1lICYmICFmc3VzZXIoKSkgeworICAgICAg
ICAgICAgICAgIGlmIChuZWVkX3ByaW50X3dhcm5pbmcodHlwZSwgZHF1b3QpKSB7CisJCQlzcHJp
bnRmKHF1b3RhbWVzc2FnZSwgIiVzOiB3cml0ZSBmYWlsZWQsICVzIGRpc2sgcXVvdGEgZXhjZWVk
ZWQgdG9vIGxvbmcuXHJcbiIsCisJCSAgICAgICAgCWRxdW90LT5kcV9tbnQtPm1udF9kaXJuYW1l
LCBxdW90YXR5cGVzW3R5cGVdKTsKKwkJCXR0eV93cml0ZV9tZXNzYWdlKGN1cnJlbnQtPnR0eSwg
cXVvdGFtZXNzYWdlKTsKIAkJfQotCQllbHNlIGlmIChDVVJSRU5UX1RJTUUgPj0gZHF1b3QtPmRx
X2J0aW1lKSB7Ci0JCQlpZiAobmVlZF9wcmludF93YXJuaW5nKHR5cGUsIGRxdW90KSkgewotCQkJ
CXNwcmludGYocXVvdGFtZXNzYWdlLCAiJXM6IHdyaXRlIGZhaWxlZCwgJXMgZGlzayBxdW90YSBl
eGNlZWRlZCB0b28gbG9uZy5cclxuIiwKLQkJCQkgICAgICAgIGRxdW90LT5kcV9tbnQtPm1udF9k
aXJuYW1lLCBxdW90YXR5cGVzW3R5cGVdKTsKLQkJCQl0dHlfd3JpdGVfbWVzc2FnZShjdXJyZW50
LT50dHksIHF1b3RhbWVzc2FnZSk7Ci0JCQl9Ci0JCQlyZXR1cm4oTk9fUVVPVEEpOworCQlyZXR1
cm4oTk9fUVVPVEEpOworCX0KKwlpZiAoZHF1b3QtPmRxX2Jzb2Z0bGltaXQgJiYKKwkgICAoZHF1
b3QtPmRxX2N1cmJsb2NrcyArIGJsb2NrcykgPiBkcXVvdC0+ZHFfYnNvZnRsaW1pdCAmJgorCSAg
ICBkcXVvdC0+ZHFfYnRpbWUgPT0gMCAmJiAhZnN1c2VyKCkpIHsKKyAgICAgICAgICAgICAgICBp
ZiAobmVlZF9wcmludF93YXJuaW5nKHR5cGUsIGRxdW90KSkgeworCQkJc3ByaW50ZihxdW90YW1l
c3NhZ2UsICIlczogd2FybmluZywgJXMgZGlzayBxdW90YSBleGNlZWRlZFxyXG4iLAorCQkgICAg
ICAgIAlkcXVvdC0+ZHFfbW50LT5tbnRfZGlybmFtZSwgcXVvdGF0eXBlc1t0eXBlXSk7CisJCQl0
dHlfd3JpdGVfbWVzc2FnZShjdXJyZW50LT50dHksIHF1b3RhbWVzc2FnZSk7CiAJCX0KKwkJZHF1
b3QtPmRxX2J0aW1lID0gQ1VSUkVOVF9USU1FICsgZHF1b3QtPmRxX21udC0+bW50X2JleHBbdHlw
ZV07CiAJfQotCS8qKi8KIAlyZXR1cm4oUVVPVEFfT0spOwogfQogCkBAIC01MjAsMTcgKzQ5Nywx
NyBAQAogcmVwZWF0OgogCWRxdW90ID0gZmlyc3RfZHF1b3Q7CiAJYmVzdCA9IE5PRFFVT1Q7Ci0J
Zm9yIChjbnQgPSBucl9kcXVvdHM7IGNudCA+IDA7IGRxdW90ID0gZHF1b3QtPmRxX25leHQsIGNu
dC0tKSB7CisJZm9yIChjbnQgPSAwOyBjbnQgPCBucl9kcXVvdHM7IGRxdW90ID0gZHF1b3QtPmRx
X25leHQsIGNudCsrKSB7CiAJCWlmICghZHF1b3QtPmRxX2NvdW50KSB7CiAJCQlpZiAoIWJlc3Qp
CiAJCQkJYmVzdCA9IGRxdW90OwotCQkJaWYgKCAhKGRxdW90LT5kcV9mbGFncyAmIChEUV9NT0Qg
fCBEUV9MT0NLRUQpKSApIHsKKwkJCWlmICghKGRxdW90LT5kcV9mbGFncyAmIERRX01PRCkgJiYg
IShkcXVvdC0+ZHFfZmxhZ3MgJiBEUV9MT0NLRUQpKSB7CiAJCQkJYmVzdCA9IGRxdW90OwogCQkJ
CWJyZWFrOwogCQkJfQogCQl9CiAJfQotCWlmICghYmVzdCB8fCAoYmVzdC0+ZHFfZmxhZ3MgJiAo
RFFfTU9EIHwgRFFfTE9DS0VEKSkpCisJaWYgKCFiZXN0IHx8IGJlc3QtPmRxX2ZsYWdzICYgRFFf
TU9EIHx8IGJlc3QtPmRxX2ZsYWdzICYgRFFfTE9DS0VEKQogCQlpZiAobnJfZHF1b3RzIDwgTlJf
RFFVT1RTKSB7CiAJCQlncm93X2RxdW90cygpOwogCQkJZ290byByZXBlYXQ7CkBAIC02MjYsMTMg
KzYwMywxMyBAQAogCX0KIAlpZiAoKGRxdW90ID0gZHFnZXQoZGV2LCBpZCwgdHlwZSkpICE9IE5P
RFFVT1QpIHsKIAkJbG9ja19kcXVvdChkcXVvdCk7Ci0JCWlmIChpZCA+IDAgJiYgKGZsYWdzICYg
KFNFVF9RVU9UQSB8IFNFVF9RTElNSVQpKSkgeworCQlpZiAoaWQgPiAwICYmICgoZmxhZ3MgJiBT
RVRfUVVPVEEpIHx8IChmbGFncyAmIFNFVF9RTElNSVQpKSkgewogCQkJZHF1b3QtPmRxX2JoYXJk
bGltaXQgPSBkcV9kcWJsay5kcWJfYmhhcmRsaW1pdDsKIAkJCWRxdW90LT5kcV9ic29mdGxpbWl0
ID0gZHFfZHFibGsuZHFiX2Jzb2Z0bGltaXQ7CiAJCQlkcXVvdC0+ZHFfaWhhcmRsaW1pdCA9IGRx
X2RxYmxrLmRxYl9paGFyZGxpbWl0OwogCQkJZHF1b3QtPmRxX2lzb2Z0bGltaXQgPSBkcV9kcWJs
ay5kcWJfaXNvZnRsaW1pdDsKIAkJfQotCQlpZiAoZmxhZ3MgJiAoU0VUX1FVT1RBIHwgU0VUX1VT
RSkpIHsKKwkJaWYgKChmbGFncyAmIFNFVF9RVU9UQSkgfHwgKGZsYWdzICYgU0VUX1VTRSkpIHsK
IAkJCWlmIChkcXVvdC0+ZHFfaXNvZnRsaW1pdCAmJgogCQkJICAgIGRxdW90LT5kcV9jdXJpbm9k
ZXMgPCBkcXVvdC0+ZHFfaXNvZnRsaW1pdCAmJgogCQkJICAgIGRxX2RxYmxrLmRxYl9jdXJpbm9k
ZXMgPj0gZHF1b3QtPmRxX2lzb2Z0bGltaXQpCkBAIC05NTksMzMgKzkzNiwxMiBAQAogCXN0cnVj
dCB2ZnNtb3VudCAqdmZzbW50OwogCXNob3J0IGNudDsKIAotCS8qCi0JKiogQ2hyaXMgUmFua2lu
IC0gMDIvMDEvOTgKLQkqKiBGYWlsIHdpdGggYW4gZXJyb3IgY29kZSBpZiB0aGUgZGV2aWNlIGlz
IGJhZCAuLi4KLQkqLwotCWlmICggISh2ZnNtbnQgPSBsb29rdXBfdmZzbW50KGRldikpICkKLQkJ
cmV0dXJuIC1FTk9ERVY7Ci0JLyoqLwotCiAJZm9yIChjbnQgPSAwOyBjbnQgPCBNQVhRVU9UQVM7
IGNudCsrKSB7CiAJCWlmICh0eXBlICE9IC0xICYmIGNudCAhPSB0eXBlKQogCQkJY29udGludWU7
Ci0JCS8qCi0JCSoqIENocmlzIFJhbmtpbiAtIDAyLzAxLzk4Ci0JCSoqIENoZWNrIHRoZSBkZXZp
Y2UgT1VUU0lERSB0aGUgbG9vcCwgc2luY2UgaXQgZG9lc24ndCBjaGFuZ2UKLQkJKiogYW5kIHdl
IG5lZWQgdGhlIGVycm9yIGNvZGUgaWYgaXQgZmFpbHMuIEFsc28gcmV0dXJuIGFuIGVycm9yCi0J
CSoqIGNvZGUgaWYgdGhlIGRldmljZSBkb2Vzbid0IGhhdmUgYSBxdW90YSB0byB0dXJuIG9mZiAu
Li4KLQkJKioKLQkJKiogaWYgKCh2ZnNtbnQgPSBsb29rdXBfdmZzbW50KGRldikpID09IChzdHJ1
Y3QgdmZzbW91bnQgKilOVUxMIHx8Ci0JCSoqICAgICAgdmZzbW50LT5tbnRfcXVvdGFzW2NudF0g
PT0gKHN0cnVjdCBmaWxlICopTlVMTCkKLQkJKioJCWNvbnRpbnVlOwotCQkqLwotCQlpZiAoICEo
dmZzbW50LT5tbnRfcXVvdGFzW2NudF0pICkgewotCQkJaWYgKHR5cGUgPT0gLTEpCi0JCQkJY29u
dGludWU7Ci0JCQlyZXR1cm4gLUVTUkNIOwotCQl9Ci0JCS8qKi8KKwkJaWYgKCh2ZnNtbnQgPSBs
b29rdXBfdmZzbW50KGRldikpID09IChzdHJ1Y3QgdmZzbW91bnQgKilOVUxMIHx8CisJICAgICAJ
ICAgICB2ZnNtbnQtPm1udF9xdW90YXNbY250XSA9PSAoc3RydWN0IGZpbGUgKilOVUxMKQorCQkJ
Y29udGludWU7CiAJCXZmc21udC0+bW50X3NiLT5kcV9vcCA9IChzdHJ1Y3QgZHF1b3Rfb3BlcmF0
aW9ucyAqKU5VTEw7CiAJCXJlc2V0X2RxdW90X3B0cnMoZGV2LCBjbnQpOwogCQlpbnZhbGlkYXRl
X2RxdW90cyhkZXYsIGNudCk7CkBAIC0xMDc0LDE1ICsxMDMwLDcgQEAKIAkJCWJyZWFrOwogCQlj
YXNlIFFfR0VUUVVPVEE6CiAJCQlpZiAoKCh0eXBlID09IFVTUlFVT1RBICYmIGN1cnJlbnQtPnVp
ZCAhPSBpZCkgfHwKLQkJCS8qCi0JCQkqKiBDaHJpcyBSYW5raW4gLSAzMS8xMi85NwotCQkJKiog
VGhlIGtlcm5lbCBtdXN0IGNoZWNrIEFMTCBncm91cHMgdGhhdCB0aGUKLQkJCSoqIHVzZXIgYmVs
b25ncyB0byAuLi4KLQkJCSoqCi0JCQkqKiAuLi4gJiYgY3VycmVudC0+Z2lkICE9IGlkKSAuLi4K
LQkJCSovCi0JCQkgICAgICh0eXBlID09IEdSUFFVT1RBICYmICFpbl9ncm91cF9wKGlkKSkpICYm
ICFmc3VzZXIoKSkKLQkJCS8qKi8KKwkJCSAgICAgKHR5cGUgPT0gR1JQUVVPVEEgJiYgY3VycmVu
dC0+Z2lkICE9IGlkKSkgJiYgIWZzdXNlcigpKQogCQkJCXJldHVybigtRVBFUk0pOwogCQkJYnJl
YWs7CiAJCWRlZmF1bHQ6CkBAIC0xMDkxLDcgKzEwMzksNyBAQAogCX0KIAogCWlmIChzcGVjaWFs
ID09IChjaGFyICopTlVMTCAmJiAoY21kcyA9PSBRX1NZTkMgfHwgY21kcyA9PSBRX0dFVFNUQVRT
KSkKLQkJZGV2ID0gTk9ERVY7CisJCWRldiA9IDA7CiAJZWxzZSB7CiAJCWlmIChuYW1laShzcGVj
aWFsLCAmaW5vKSkKIAkJCXJldHVybigtRUlOVkFMKTsK

------ =_NextPart_000_01BD1CDC.213BEC40--