Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 7 May 2019 00:50:10 +0000
From:      Rick Macklem <rmacklem@uoguelph.ca>
To:        Peter Eriksson <pen@lysator.liu.se>
Cc:        "freebsd-fs@freebsd.org" <freebsd-fs@FreeBSD.org>
Subject:   patch to improve perf for handling exports of large numbers of file systems
Message-ID:  <YQBPR0101MB22608FE3367E1DBD64ED01E1DD310@YQBPR0101MB2260.CANPRD01.PROD.OUTLOOK.COM>

next in thread | raw e-mail | index | archive | help
--_002_YQBPR0101MB22608FE3367E1DBD64ED01E1DD310YQBPR0101MB2260_
Content-Type: text/plain; charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable

Hi,

Peter has reported to me via email that updating exports when mountd receiv=
es
a SIGHUP takes about 16seconds.  This isn't surprising, since he has 20,000=
+
file systems to export.
The current code deletes all 20,000+ exports in the kernel and then re-expo=
rts
everything in the exports file while having the nfsd suspended (assuming th=
e "-S"
option is being used). It was designed decades ago when a system only had a
few file systems, but sometimes many exported directories within a file sys=
tem.

The attached patch is a first draft (minimally tested) for the addition of =
a "-I" option
for mountd. When mountd is started with this "-I" option, it processes the =
exports
file(s) into the structures that mountd uses and then compares the old and =
new
structures, only doing unexport/re-export for the ones that have changed,
when it receives a SIGHUP.

At the moment, the algorithm for doing the comparison isn't efficient, but =
at least
it isn't doing a lot of system calls to unexport/re-export. (A simple chang=
e from using a single linked list to a hash table of linked lists for the "=
struct exportlist" would help the
comparison algorithm a lot, but I wanted to hold off on that until what I h=
ave
has seen more testing, since it will make the patch even more complex.)

I hope that Peter can test this (and anyone else willing to do so, please d=
o
since there are many variants within the exports file(s) and I might not th=
ink
of them all to test).
The patch is "noisy", since it puts a bunch of debug stuff out via syslog()=
.
You can get rid of this by simply deleting the syslog(..); lines that are n=
ot indented.

Anyone who can test this, it would be appreciated, rick
ps: Without "-I", the behaviour should not have changed.

--_002_YQBPR0101MB22608FE3367E1DBD64ED01E1DD310YQBPR0101MB2260_
Content-Type: application/octet-stream; name="mountd-exp.patch"
Content-Description: mountd-exp.patch
Content-Disposition: attachment; filename="mountd-exp.patch"; size=23798;
	creation-date="Tue, 07 May 2019 00:44:23 GMT";
	modification-date="Tue, 07 May 2019 00:44:23 GMT"
Content-Transfer-Encoding: base64

LS0tIHVzci5zYmluL21vdW50ZC9tb3VudGQuYy5zYXYJMjAxOS0wNC0zMCAyMTo0ODoyMy4xNTU0
MTkwMDAgLTA0MDAKKysrIHVzci5zYmluL21vdW50ZC9tb3VudGQuYwkyMDE5LTA1LTA2IDIwOjE2
OjAwLjk4MTY3NDAwMCAtMDQwMApAQCAtMTE0LDEwICsxMTQsMTMgQEAgc3RydWN0IGRpcmxpc3Qg
ewogc3RydWN0IGV4cG9ydGxpc3QgewogCXN0cnVjdCBkaXJsaXN0CSpleF9kaXJsOwogCXN0cnVj
dCBkaXJsaXN0CSpleF9kZWZkaXI7CisJc3RydWN0IGdyb3VwbGlzdCAqZXhfZ3JwaGVhZDsKIAlp
bnQJCWV4X2ZsYWc7CiAJZnNpZF90CQlleF9mczsKIAljaGFyCQkqZXhfZnNkaXI7CiAJY2hhcgkJ
KmV4X2luZGV4ZmlsZTsKKwlzdHJ1Y3QgeHVjcmVkCWV4X2RlZmFub247CisJaW50CQlleF9kZWZl
eGZsYWdzOwogCWludAkJZXhfbnVtc2VjZmxhdm9yczsKIAlpbnQJCWV4X3NlY2ZsYXZvcnNbTUFY
U0VDRkxBVk9SU107CiAJaW50CQlleF9kZWZudW1zZWNmbGF2b3JzOwpAQCAtMTI3LDYgKzEzMCw5
IEBAIHN0cnVjdCBleHBvcnRsaXN0IHsKIH07CiAvKiBleF9mbGFnIGJpdHMgKi8KICNkZWZpbmUJ
RVhfTElOS0VECTB4MQorI2RlZmluZQlFWF9ET05FCQkweDIKKworU0xJU1RfSEVBRChleHBvcnRs
aXN0aGVhZCwgZXhwb3J0bGlzdCk7CiAKIHN0cnVjdCBuZXRtc2sgewogCXN0cnVjdCBzb2NrYWRk
cl9zdG9yYWdlIG50X25ldDsKQEAgLTE0Myw2ICsxNDksOSBAQCBzdHJ1Y3QgZ3JvdXBsaXN0IHsK
IAlpbnQgZ3JfdHlwZTsKIAl1bmlvbiBncm91cHR5cGVzIGdyX3B0cjsKIAlzdHJ1Y3QgZ3JvdXBs
aXN0ICpncl9uZXh0OworCXN0cnVjdCB4dWNyZWQgZ3JfYW5vbjsKKwlpbnQgZ3JfZXhmbGFnczsK
KwlpbnQgZ3JfZmxhZzsKIAlpbnQgZ3JfbnVtc2VjZmxhdm9yczsKIAlpbnQgZ3Jfc2VjZmxhdm9y
c1tNQVhTRUNGTEFWT1JTXTsKIH07CkBAIC0xNTMsNiArMTYyLDkgQEAgc3RydWN0IGdyb3VwbGlz
dCB7CiAjZGVmaW5lCUdUX0RFRkFVTFQJMHgzCiAjZGVmaW5lIEdUX0lHTk9SRQkweDUKIAorLyog
R3JvdXAgZmxhZ3MgKi8KKyNkZWZpbmUJR1JfRk5ECQkweDEKKwogc3RydWN0IGhvc3RsaXN0IHsK
IAlpbnQJCSBodF9mbGFnOwkvKiBVc2VzIERQX3h4IGJpdHMgKi8KIAlzdHJ1Y3QgZ3JvdXBsaXN0
ICpodF9ncnA7CkBAIC0xODUsNiArMTk3LDcgQEAgc3RhdGljIHZvaWQJY29tcGxldGVfc2Vydmlj
ZShzdHJ1Y3QgbmV0Ywogc3RhdGljIHZvaWQJY2xlYXJvdXRfc2VydmljZSh2b2lkKTsKIHN0YXRp
YyB2b2lkCWRlbF9tbGlzdChjaGFyICpob3N0cCwgY2hhciAqZGlycCk7CiBzdGF0aWMgc3RydWN0
IGRpcmxpc3QJKmRpcnBfc2VhcmNoKHN0cnVjdCBkaXJsaXN0ICosIGNoYXIgKik7CitzdGF0aWMg
aW50CWRvX2V4cG9ydF9tb3VudChzdHJ1Y3QgZXhwb3J0bGlzdCAqLCBzdHJ1Y3Qgc3RhdGZzICop
Owogc3RhdGljIGludAlkb19tb3VudChzdHJ1Y3QgZXhwb3J0bGlzdCAqLCBzdHJ1Y3QgZ3JvdXBs
aXN0ICosIGludCwKIAkJICAgIHN0cnVjdCB4dWNyZWQgKiwgY2hhciAqLCBpbnQsIHN0cnVjdCBz
dGF0ZnMgKik7CiBzdGF0aWMgaW50CWRvX29wdChjaGFyICoqLCBjaGFyICoqLCBzdHJ1Y3QgZXhw
b3J0bGlzdCAqLApAQCAtMTk1LDcgKzIwOCwxNiBAQCBzdGF0aWMgdm9pZAlmcmVlX2RpcihzdHJ1
Y3QgZGlybGlzdCAqKTsKIHN0YXRpYyB2b2lkCWZyZWVfZXhwKHN0cnVjdCBleHBvcnRsaXN0ICop
Owogc3RhdGljIHZvaWQJZnJlZV9ncnAoc3RydWN0IGdyb3VwbGlzdCAqKTsKIHN0YXRpYyB2b2lk
CWZyZWVfaG9zdChzdHJ1Y3QgaG9zdGxpc3QgKik7Ci1zdGF0aWMgdm9pZAlnZXRfZXhwb3J0bGlz
dCh2b2lkKTsKK3N0YXRpYyB2b2lkCWZyZWVfdjRyb290ZXhwKHZvaWQpOworc3RhdGljIHZvaWQJ
Z2V0X2V4cG9ydGxpc3Rfb25lKGludCk7CitzdGF0aWMgdm9pZAlnZXRfZXhwb3J0bGlzdChpbnQg
cGFzc25vKTsKK3N0YXRpYyB2b2lkCXJlYWRfZXhwb3J0ZmlsZShpbnQgcGFzc25vKTsKK3N0YXRp
YyB2b2lkCWZyZWVfZXhwb3J0cyhzdHJ1Y3QgZXhwb3J0bGlzdGhlYWQgKik7CitzdGF0aWMgaW50
CWNvbXBhcmVfbm1vdW50X2V4cG9ydGxpc3Qoc3RydWN0IGlvdmVjICosIGludCwgY2hhciAqKTsK
K3N0YXRpYyBpbnQJY29tcGFyZV9leHBvcnQoc3RydWN0IGV4cG9ydGxpc3QgKiwgc3RydWN0IGV4
cG9ydGxpc3QgKik7CitzdGF0aWMgaW50CWNvbXBhcmVfY3JlZChzdHJ1Y3QgeHVjcmVkICosIHN0
cnVjdCB4dWNyZWQgKik7CitzdGF0aWMgaW50CWNvbXBhcmVfc2VjZmxhdm9yKGludCAqLCBpbnQg
KiwgaW50KTsKK3N0YXRpYyB2b2lkCWRlbGV0ZV9leHBvcnQoc3RydWN0IGlvdmVjICosIGludCwg
c3RydWN0IHN0YXRmcyAqLCBjaGFyICopOwogc3RhdGljIGludAlnZXRfaG9zdChjaGFyICosIHN0
cnVjdCBncm91cGxpc3QgKiwgc3RydWN0IGdyb3VwbGlzdCAqKTsKIHN0YXRpYyBzdHJ1Y3QgaG9z
dGxpc3QgKmdldF9odCh2b2lkKTsKIHN0YXRpYyBpbnQJZ2V0X2xpbmUodm9pZCk7CkBAIC0yMDQs
NyArMjI2LDcgQEAgc3RhdGljIGludAlnZXRfbmV0KGNoYXIgKiwgc3RydWN0IG5ldG1zawogc3Rh
dGljIHZvaWQJZ2V0ZXhwX2VycihzdHJ1Y3QgZXhwb3J0bGlzdCAqLCBzdHJ1Y3QgZ3JvdXBsaXN0
ICosIGNvbnN0IGNoYXIgKik7CiBzdGF0aWMgc3RydWN0IGdyb3VwbGlzdAkqZ2V0X2dycCh2b2lk
KTsKIHN0YXRpYyB2b2lkCWhhbmdfZGlycChzdHJ1Y3QgZGlybGlzdCAqLCBzdHJ1Y3QgZ3JvdXBs
aXN0ICosCi0JCQkJc3RydWN0IGV4cG9ydGxpc3QgKiwgaW50KTsKKwkJICAgIHN0cnVjdCBleHBv
cnRsaXN0ICosIGludCwgc3RydWN0IHh1Y3JlZCAqLCBpbnQpOwogc3RhdGljIHZvaWQJaHVwaGFu
ZGxlcihpbnQgc2lnKTsKIHN0YXRpYyBpbnQJbWFrZW1hc2soc3RydWN0IHNvY2thZGRyX3N0b3Jh
Z2UgKnNzcCwgaW50IGJpdGxlbik7CiBzdGF0aWMgdm9pZAltbnRzcnYoc3RydWN0IHN2Y19yZXEg
KiwgU1ZDWFBSVCAqKTsKQEAgLTIyNyw5ICsyNDksOSBAQCBzdGF0aWMgaW50CXhkcl9maHMoWERS
ICosIGNhZGRyX3QpOwogc3RhdGljIGludAl4ZHJfbWxpc3QoWERSICosIGNhZGRyX3QpOwogc3Rh
dGljIHZvaWQJdGVybWluYXRlKGludCk7CiAKLXN0YXRpYyBTTElTVF9IRUFEKCwgZXhwb3J0bGlz
dCkgZXhwaGVhZCA9IFNMSVNUX0hFQURfSU5JVElBTElaRVIoZXhwaGVhZCk7Ci1zdGF0aWMgU0xJ
U1RfSEVBRCgsIG1vdW50bGlzdCkgbWxoZWFkID0gU0xJU1RfSEVBRF9JTklUSUFMSVpFUihtbGhl
YWQpOwotc3RhdGljIHN0cnVjdCBncm91cGxpc3QgKmdycGhlYWQ7CitzdGF0aWMgc3RydWN0IGV4
cG9ydGxpc3RoZWFkIGV4cGhlYWQgPSBTTElTVF9IRUFEX0lOSVRJQUxJWkVSKCZleHBoZWFkKTsK
K3N0YXRpYyBzdHJ1Y3QgZXhwb3J0bGlzdGhlYWQgb2xkZXhwaGVhZDsKK3N0YXRpYyBTTElTVF9I
RUFEKCwgbW91bnRsaXN0KSBtbGhlYWQgPSBTTElTVF9IRUFEX0lOSVRJQUxJWkVSKCZtbGhlYWQp
Owogc3RhdGljIGNoYXIgKmV4bmFtZXNfZGVmYXVsdFsyXSA9IHsgX1BBVEhfRVhQT1JUUywgTlVM
TCB9Owogc3RhdGljIGNoYXIgKipleG5hbWVzOwogc3RhdGljIGNoYXIgKipob3N0cyA9IE5VTEw7
CkBAIC0yNjAsNiArMjgyLDggQEAgc3RhdGljIGludCBoYXZlX3Y2ID0gMTsKIAogc3RhdGljIGlu
dCB2NHJvb3RfcGhhc2UgPSAwOwogc3RhdGljIGNoYXIgdjRyb290X2RpcnBhdGhbUEFUSF9NQVgg
KyAxXTsKK3N0YXRpYyBzdHJ1Y3QgZXhwb3J0bGlzdCAqdjRyb290X2VwID0gTlVMTDsKK3N0YXRp
YyBzdHJ1Y3QgZ3JvdXBsaXN0ICp2NHJvb3RfZ3JwID0gTlVMTDsKIHN0YXRpYyBpbnQgaGFzX3B1
YmxpY2ZoID0gMDsKIAogc3RhdGljIHN0cnVjdCBwaWRmaCAqcGZoID0gTlVMTDsKQEAgLTM2OCw5
ICszOTIsMTAgQEAgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCiAJaW5fcG9ydF90IHN2Y3Bv
cnQ7CiAJaW50IGMsIGssIHM7CiAJaW50IG1heHJlYyA9IFJQQ19NQVhEQVRBU0laRTsKLQlpbnQg
YXR0ZW1wdF9jbnQsIHBvcnRfbGVuLCBwb3J0X3BvcywgcmV0OworCWludCBhdHRlbXB0X2NudCwg
cGFzc25vLCBwb3J0X2xlbiwgcG9ydF9wb3MsIHJldDsKIAljaGFyICoqcG9ydF9saXN0OwogCisJ
cGFzc25vID0gMDsKIAkvKiBDaGVjayB0aGF0IGFub3RoZXIgbW91bnRkIGlzbid0IGFscmVhZHkg
cnVubmluZy4gKi8KIAlwZmggPSBwaWRmaWxlX29wZW4oX1BBVEhfTU9VTlREUElELCAwNjAwLCAm
b3RoZXJwaWQpOwogCWlmIChwZmggPT0gTlVMTCkgewpAQCAtMzg1LDcgKzQxMCw3IEBAIG1haW4o
aW50IGFyZ2MsIGNoYXIgKiphcmd2KQogCWVsc2UKIAkJY2xvc2Uocyk7CiAKLQl3aGlsZSAoKGMg
PSBnZXRvcHQoYXJnYywgYXJndiwgIjJkZWg6bG5wOnJTIikpICE9IC0xKQorCXdoaWxlICgoYyA9
IGdldG9wdChhcmdjLCBhcmd2LCAiMmRlaDpJbG5wOnJTIikpICE9IC0xKQogCQlzd2l0Y2ggKGMp
IHsKIAkJY2FzZSAnMic6CiAJCQlmb3JjZV92MiA9IDE7CkBAIC00MzcsNiArNDYyLDkgQEAgbWFp
bihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCiAJCWNhc2UgJ1MnOgogCQkJc3VzcGVuZF9uZnNkID0g
MTsKIAkJCWJyZWFrOworCQljYXNlICdJJzoKKwkJCXBhc3NubyA9IDE7CisJCQlicmVhazsKIAkJ
ZGVmYXVsdDoKIAkJCXVzYWdlKCk7CiAJCX0KQEAgLTQ0OSw3ICs0NzcsNiBAQCBtYWluKGludCBh
cmdjLCBjaGFyICoqYXJndikKIAogCWFyZ2MgLT0gb3B0aW5kOwogCWFyZ3YgKz0gb3B0aW5kOwot
CWdycGhlYWQgPSAoc3RydWN0IGdyb3VwbGlzdCAqKU5VTEw7CiAJaWYgKGFyZ2MgPiAwKQogCQll
eG5hbWVzID0gYXJndjsKIAllbHNlCkBAIC00NTcsNyArNDg0LDcgQEAgbWFpbihpbnQgYXJnYywg
Y2hhciAqKmFyZ3YpCiAJb3BlbmxvZygibW91bnRkIiwgTE9HX1BJRCwgTE9HX0RBRU1PTik7CiAJ
aWYgKGRlYnVnKQogCQl3YXJueCgiZ2V0dGluZyBleHBvcnQgbGlzdCIpOwotCWdldF9leHBvcnRs
aXN0KCk7CisJZ2V0X2V4cG9ydGxpc3QoMCk7CiAJaWYgKGRlYnVnKQogCQl3YXJueCgiZ2V0dGlu
ZyBtb3VudCBsaXN0Iik7CiAJZ2V0X21vdW50bGlzdCgpOwpAQCAtNjI4LDcgKzY1NSw3IEBAIG1h
aW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQogCS8qIEV4cGFuZCBzdmNfcnVuKCkgaGVyZSBzbyB0
aGF0IHdlIGNhbiBjYWxsIGdldF9leHBvcnRsaXN0KCkuICovCiAJZm9yICg7OykgewogCQlpZiAo
Z290X3NpZ2h1cCkgewotCQkJZ2V0X2V4cG9ydGxpc3QoKTsKKwkJCWdldF9leHBvcnRsaXN0KHBh
c3Nubyk7CiAJCQlnb3Rfc2lnaHVwID0gMDsKIAkJfQogCQlyZWFkZmRzID0gc3ZjX2Zkc2V0OwpA
QCAtMTQxNiw3ICsxNDQzLDcgQEAgc3RhdGljIEZJTEUgKmV4cF9maWxlOwogICogR2V0IHRoZSBl
eHBvcnQgbGlzdCBmcm9tIG9uZSwgY3VycmVudGx5IG9wZW4gZmlsZQogICovCiBzdGF0aWMgdm9p
ZAotZ2V0X2V4cG9ydGxpc3Rfb25lKHZvaWQpCitnZXRfZXhwb3J0bGlzdF9vbmUoaW50IHBhc3Nu
bykKIHsKIAlzdHJ1Y3QgZXhwb3J0bGlzdCAqZXA7CiAJc3RydWN0IGdyb3VwbGlzdCAqZ3JwLCAq
dGdycDsKQEAgLTE2NTMsMTEgKzE2ODAsMTUgQEAgZ2V0X2V4cG9ydGxpc3Rfb25lKHZvaWQpCiAJ
CSAqIExvb3AgdGhyb3VnaCBob3N0cywgcHVzaGluZyB0aGUgZXhwb3J0cyBpbnRvIHRoZSBrZXJu
ZWwuCiAJCSAqIEFmdGVyIGxvb3AsIHRncnAgcG9pbnRzIHRvIHRoZSBzdGFydCBvZiB0aGUgbGlz
dCBhbmQKIAkJICogZ3JwIHBvaW50cyB0byB0aGUgbGFzdCBlbnRyeSBpbiB0aGUgbGlzdC4KKwkJ
ICogRG8gbm90IGRvIHRoZSBkb19tb3VudCgpIGZvciBwYXNzbm8gPT0gMSwgc2luY2UgdGhlCisJ
CSAqIHNlY29uZCBwYXNzIHdpbGwgZG8gaXQsIGFzIHJlcXVpcmVkLgogCQkgKi8KIAkJZ3JwID0g
dGdycDsKIAkJZG8gewotCQkJaWYgKGRvX21vdW50KGVwLCBncnAsIGV4ZmxhZ3MsICZhbm9uLCBk
aXJwLCBkaXJwbGVuLAotCQkJICAgICZmc2IpKSB7CisJCQlncnAtPmdyX2V4ZmxhZ3MgPSBleGZs
YWdzOworCQkJZ3JwLT5ncl9hbm9uID0gYW5vbjsKKwkJCWlmIChwYXNzbm8gIT0gMSAmJiBkb19t
b3VudChlcCwgZ3JwLCBleGZsYWdzLCAmYW5vbiwKKwkJCSAgICBkaXJwLCBkaXJwbGVuLCAmZnNi
KSkgewogCQkJCWdldGV4cF9lcnIoZXAsIHRncnAsIE5VTEwpOwogCQkJCWdvdG8gbmV4dGxpbmU7
CiAJCQl9CkBAIC0xNjY4LDE1ICsxNjk5LDI2IEBAIGdldF9leHBvcnRsaXN0X29uZSh2b2lkKQog
CQkgKi8KIAkJaWYgKHY0cm9vdF9waGFzZSA+IDAgJiYgdjRyb290X3BoYXNlIDw9IDIpIHsKIAkJ
CS8qCi0JCQkgKiBTaW5jZSB0aGVzZSBzdHJ1Y3R1cmVzIGFyZW4ndCB1c2VkIGJ5IG1vdW50ZCwK
KwkJCSAqIFRoZXNlIHN0cnVjdHVyZXMgYXJlIHVzZWQgZm9yIHRoZSAiLUkiIHJlbG9hZCwKKwkJ
CSAqIHNvIHNhdmUgdGhlbSBmb3IgdGhhdCBjYXNlLiAgT3RoZXJ3aXNlLCBqdXN0CiAJCQkgKiBm
cmVlIHRoZW0gdXAgbm93LgogCQkJICovCi0JCQlpZiAoZXAgIT0gTlVMTCkKLQkJCQlmcmVlX2V4
cChlcCk7Ci0JCQl3aGlsZSAodGdycCAhPSBOVUxMKSB7Ci0JCQkJZ3JwID0gdGdycDsKLQkJCQl0
Z3JwID0gdGdycC0+Z3JfbmV4dDsKLQkJCQlmcmVlX2dycChncnApOworCQkJaWYgKHBhc3NubyA9
PSAxKSB7CisJCQkJaWYgKHY0cm9vdF9lcCAhPSBOVUxMKSB7CisJCQkJCWdldGV4cF9lcnIoZXAs
IHRncnAsCisJCQkJCSAgICAibXVsdGlwbGUgVjQgbGluZXMiKTsKKwkJCQkJZ290byBuZXh0bGlu
ZTsKKwkJCQl9CisJCQkJdjRyb290X2VwID0gZXA7CisJCQkJdjRyb290X2dycCA9IHRncnA7CisJ
CQl9IGVsc2UgeworCQkJCWlmIChlcCAhPSBOVUxMKQorCQkJCQlmcmVlX2V4cChlcCk7CisJCQkJ
d2hpbGUgKHRncnAgIT0gTlVMTCkgeworCQkJCQlncnAgPSB0Z3JwOworCQkJCQl0Z3JwID0gdGdy
cC0+Z3JfbmV4dDsKKwkJCQkJZnJlZV9ncnAoZ3JwKTsKKwkJCQl9CiAJCQl9CiAJCQlnb3RvIG5l
eHRsaW5lOwogCQl9CkBAIC0xNjg1LDEyICsxNzI3LDEyIEBAIGdldF9leHBvcnRsaXN0X29uZSh2
b2lkKQogCQkgKiBTdWNjZXNzLiBVcGRhdGUgdGhlIGRhdGEgc3RydWN0dXJlcy4KIAkJICovCiAJ
CWlmIChoYXNfaG9zdCkgewotCQkJaGFuZ19kaXJwKGRpcmhlYWQsIHRncnAsIGVwLCBvcHRfZmxh
Z3MpOwotCQkJZ3JwLT5ncl9uZXh0ID0gZ3JwaGVhZDsKLQkJCWdycGhlYWQgPSB0Z3JwOworCQkJ
aGFuZ19kaXJwKGRpcmhlYWQsIHRncnAsIGVwLCBvcHRfZmxhZ3MsICZhbm9uLCBleGZsYWdzKTsK
KwkJCWdycC0+Z3JfbmV4dCA9IGVwLT5leF9ncnBoZWFkOworCQkJZXAtPmV4X2dycGhlYWQgPSB0
Z3JwOwogCQl9IGVsc2UgewogCQkJaGFuZ19kaXJwKGRpcmhlYWQsIChzdHJ1Y3QgZ3JvdXBsaXN0
ICopTlVMTCwgZXAsCi0JCQkJb3B0X2ZsYWdzKTsKKwkJCQlvcHRfZmxhZ3MsICZhbm9uLCBleGZs
YWdzKTsKIAkJCWZyZWVfZ3JwKGdycCk7CiAJCX0KIAkJZGlyaGVhZCA9IChzdHJ1Y3QgZGlybGlz
dCAqKU5VTEw7CkBAIC0xNzEyLDQ1ICsxNzU0LDQzIEBAIG5leHRsaW5lOgogICogR2V0IHRoZSBl
eHBvcnQgbGlzdCBmcm9tIGFsbCBzcGVjaWZpZWQgZmlsZXMKICAqLwogc3RhdGljIHZvaWQKLWdl
dF9leHBvcnRsaXN0KHZvaWQpCitnZXRfZXhwb3J0bGlzdChpbnQgcGFzc25vKQogewotCXN0cnVj
dCBleHBvcnRsaXN0ICplcCwgKmVwMjsKLQlzdHJ1Y3QgZ3JvdXBsaXN0ICpncnAsICp0Z3JwOwog
CXN0cnVjdCBleHBvcnRfYXJncyBleHBvcnQ7CiAJc3RydWN0IGlvdmVjICppb3Y7CiAJc3RydWN0
IHN0YXRmcyAqZnNwLCAqbW50YnVmcDsKLQlzdHJ1Y3QgeHZmc2NvbmYgdmZjOwogCWNoYXIgZXJy
bXNnWzI1NV07CiAJaW50IG51bSwgaTsKIAlpbnQgaW92bGVuOwotCWludCBkb25lOwogCXN0cnVj
dCBuZnNleF9hcmdzIGVhcmdzOwogCi0JaWYgKHN1c3BlbmRfbmZzZCAhPSAwKQotCQkodm9pZClu
ZnNzdmMoTkZTU1ZDX1NVU1BFTkRORlNELCBOVUxMKTsKK3N5c2xvZyhMT0dfRVJSLCAicGFzc25v
PSVkIiwgcGFzc25vKTsKIAl2NHJvb3RfZGlycGF0aFswXSA9ICdcMCc7CisJZnJlZV92NHJvb3Rl
eHAoKTsKKwlpZiAocGFzc25vID09IDEpIHsKKwkJLyoKKwkJICogU2F2ZSB0aGUgY3VycmVudCBs
aXN0cyBhcyBvbGQgb25lcywgc28gdGhhdCB0aGUgbmV3IGxpc3RzCisJCSAqIGNhbiBiZSBjb21w
YXJlZCB3aXRoIHRoZSBvbGQgb25lcyBpbiB0aGUgMm5kIHBhc3MuCisJCSAqLworCQlTTElTVF9G
SVJTVCgmb2xkZXhwaGVhZCkgPSBTTElTVF9GSVJTVCgmZXhwaGVhZCk7CisJCVNMSVNUX0lOSVQo
JmV4cGhlYWQpOworCisJCS8qIFJlYWQgdGhlIGV4cG9ydCBmaWxlKHMpIGFuZCBwcm9jZXNzIHRo
ZW0gKi8KKwkJcmVhZF9leHBvcnRmaWxlKHBhc3Nubyk7CitzeXNsb2coTE9HX0VSUiwgInJlYWRl
eHAxIik7CisJfSBlbHNlIHsKKwkJLyogSnVzdCBtYWtlIHRoZSBvbGQgbGlzdHMgZW1wdHkuICov
CisJCVNMSVNUX0lOSVQoJm9sZGV4cGhlYWQpOworCX0KKwogCWJ6ZXJvKCZleHBvcnQsIHNpemVv
ZihleHBvcnQpKTsKIAlleHBvcnQuZXhfZmxhZ3MgPSBNTlRfREVMRVhQT1JUOwogCWlvdiA9IE5V
TEw7CiAJaW92bGVuID0gMDsKIAliemVybyhlcnJtc2csIHNpemVvZihlcnJtc2cpKTsKIAotCS8q
Ci0JICogRmlyc3QsIGdldCByaWQgb2YgdGhlIG9sZCBsaXN0Ci0JICovCi0JU0xJU1RfRk9SRUFD
SF9TQUZFKGVwLCAmZXhwaGVhZCwgZW50cmllcywgZXAyKSB7Ci0JCVNMSVNUX1JFTU9WRSgmZXhw
aGVhZCwgZXAsIGV4cG9ydGxpc3QsIGVudHJpZXMpOwotCQlmcmVlX2V4cChlcCk7Ci0JfQotCi0J
Z3JwID0gZ3JwaGVhZDsKLQl3aGlsZSAoZ3JwKSB7Ci0JCXRncnAgPSBncnA7Ci0JCWdycCA9IGdy
cC0+Z3JfbmV4dDsKLQkJZnJlZV9ncnAodGdycCk7Ci0JfQotCWdycGhlYWQgPSAoc3RydWN0IGdy
b3VwbGlzdCAqKU5VTEw7Ci0KKwlpZiAoc3VzcGVuZF9uZnNkICE9IDApCisJCSh2b2lkKW5mc3N2
YyhORlNTVkNfU1VTUEVORE5GU0QsIE5VTEwpOwogCS8qCiAJICogYW5kIHRoZSBvbGQgVjQgcm9v
dCBkaXIuCiAJICovCkBAIC0xNzY1LDYyICsxODA1LDUyIEBAIGdldF9leHBvcnRsaXN0KHZvaWQp
CiAJICovCiAJaGFzX3B1YmxpY2ZoID0gMDsKIAorCWJ1aWxkX2lvdmVjKCZpb3YsICZpb3ZsZW4s
ICJmc3R5cGUiLCBOVUxMLCAwKTsKKwlidWlsZF9pb3ZlYygmaW92LCAmaW92bGVuLCAiZnNwYXRo
IiwgTlVMTCwgMCk7CisJYnVpbGRfaW92ZWMoJmlvdiwgJmlvdmxlbiwgImZyb20iLCBOVUxMLCAw
KTsKKwlidWlsZF9pb3ZlYygmaW92LCAmaW92bGVuLCAidXBkYXRlIiwgTlVMTCwgMCk7CisJYnVp
bGRfaW92ZWMoJmlvdiwgJmlvdmxlbiwgImV4cG9ydCIsICZleHBvcnQsCisJICAgIHNpemVvZihl
eHBvcnQpKTsKKwlidWlsZF9pb3ZlYygmaW92LCAmaW92bGVuLCAiZXJybXNnIiwgZXJybXNnLAor
CSAgICBzaXplb2YoZXJybXNnKSk7CisKIAkvKgotCSAqIEFuZCBkZWxldGUgZXhwb3J0cyB0aGF0
IGFyZSBpbiB0aGUga2VybmVsIGZvciBhbGwgbG9jYWwKLQkgKiBmaWxlc3lzdGVtcy4KLQkgKiBY
WFg6IFNob3VsZCBrbm93IGhvdyB0byBoYW5kbGUgYWxsIGxvY2FsIGV4cG9ydGFibGUgZmlsZXN5
c3RlbXMuCisJICogRm9yIHBhc3NubyA9PSAxLCBjb21wYXJlIHRoZSBvbGQgYW5kIG5ldyBsaXN0
cyB1cGRhdGluZyB0aGUga2VybmVsCisJICogZXhwb3J0cyBmb3IgYW55IGNhc2VzIHRoYXQgaGF2
ZSBjaGFuZ2VkLgorCSAqIFRoaXMgY2FsbCBpcyBkb2luZyB0aGUgc2Vjb25kIHBhc3MgdGhyb3Vn
aCB0aGUgbGlzdHMuCisJICogSWYgaXQgZmFpbHMsIGZhbGwgYmFjayBvbiB0aGUgYnVsayByZWxv
YWQuCiAJICovCi0JbnVtID0gZ2V0bW50aW5mbygmbW50YnVmcCwgTU5UX05PV0FJVCk7Ci0KLQlp
ZiAobnVtID4gMCkgewotCQlidWlsZF9pb3ZlYygmaW92LCAmaW92bGVuLCAiZnN0eXBlIiwgTlVM
TCwgMCk7Ci0JCWJ1aWxkX2lvdmVjKCZpb3YsICZpb3ZsZW4sICJmc3BhdGgiLCBOVUxMLCAwKTsK
LQkJYnVpbGRfaW92ZWMoJmlvdiwgJmlvdmxlbiwgImZyb20iLCBOVUxMLCAwKTsKLQkJYnVpbGRf
aW92ZWMoJmlvdiwgJmlvdmxlbiwgInVwZGF0ZSIsIE5VTEwsIDApOwotCQlidWlsZF9pb3ZlYygm
aW92LCAmaW92bGVuLCAiZXhwb3J0IiwgJmV4cG9ydCwgc2l6ZW9mKGV4cG9ydCkpOwotCQlidWls
ZF9pb3ZlYygmaW92LCAmaW92bGVuLCAiZXJybXNnIiwgZXJybXNnLCBzaXplb2YoZXJybXNnKSk7
Ci0JfQotCi0JZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKSB7Ci0JCWZzcCA9ICZtbnRidWZwW2ld
OwotCQlpZiAoZ2V0dmZzYnluYW1lKGZzcC0+Zl9mc3R5cGVuYW1lLCAmdmZjKSAhPSAwKSB7Ci0J
CQlzeXNsb2coTE9HX0VSUiwgImdldHZmc2J5bmFtZSgpIGZhaWxlZCBmb3IgJXMiLAotCQkJICAg
IGZzcC0+Zl9mc3R5cGVuYW1lKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KKwlpZiAocGFzc25vID09
IDEgJiYgY29tcGFyZV9ubW91bnRfZXhwb3J0bGlzdChpb3YsIGlvdmxlbiwgZXJybXNnKSA9PQor
CSAgICAwKSB7CitzeXNsb2coTE9HX0VSUiwgImNvbXBhcmVvayIpOworCQkvKiBGcmVlIHVwIHRo
ZSBvbGQgbGlzdHMuICovCisJCWZyZWVfZXhwb3J0cygmb2xkZXhwaGVhZCk7CisJfSBlbHNlIHsK
K3N5c2xvZyhMT0dfRVJSLCAiZG9pbiBwYXNzbm89MCIpOwogCQkvKgotCQkgKiBXZSBkbyBub3Qg
bmVlZCB0byBkZWxldGUgImV4cG9ydCIgZmxhZyBmcm9tCi0JCSAqIGZpbGVzeXN0ZW1zIHRoYXQg
ZG8gbm90IGhhdmUgaXQgc2V0LgorCQkgKiBGaXJzdCwgZ2V0IHJpZCBvZiB0aGUgb2xkIGxpc3Rz
LgogCQkgKi8KLQkJaWYgKCEoZnNwLT5mX2ZsYWdzICYgTU5UX0VYUE9SVEVEKSkKLQkJICAgIGNv
bnRpbnVlOworCQlmcmVlX2V4cG9ydHMoJmV4cGhlYWQpOworCQlmcmVlX2V4cG9ydHMoJm9sZGV4
cGhlYWQpOworCQlmcmVlX3Y0cm9vdGV4cCgpOworCiAJCS8qCi0JCSAqIERvIG5vdCBkZWxldGUg
ZXhwb3J0IGZvciBuZXR3b3JrIGZpbGVzeXN0ZW0gYnkKLQkJICogcGFzc2luZyAiZXhwb3J0IiBh
cmcgdG8gbm1vdW50KCkuCi0JCSAqIEl0IG9ubHkgbWFrZXMgc2Vuc2UgdG8gZG8gdGhpcyBmb3Ig
bG9jYWwgZmlsZXN5c3RlbXMuCisJCSAqIEFuZCBkZWxldGUgZXhwb3J0cyB0aGF0IGFyZSBpbiB0
aGUga2VybmVsIGZvciBhbGwgbG9jYWwKKwkJICogZmlsZXN5c3RlbXMuCisJCSAqIFhYWDogU2hv
dWxkIGtub3cgaG93IHRvIGhhbmRsZSBhbGwgbG9jYWwgZXhwb3J0YWJsZQorCQkgKiBmaWxlc3lz
dGVtcy4KIAkJICovCi0JCWlmICh2ZmMudmZjX2ZsYWdzICYgVkZDRl9ORVRXT1JLKQotCQkJY29u
dGludWU7Ci0KLQkJaW92WzFdLmlvdl9iYXNlID0gZnNwLT5mX2ZzdHlwZW5hbWU7Ci0JCWlvdlsx
XS5pb3ZfbGVuID0gc3RybGVuKGZzcC0+Zl9mc3R5cGVuYW1lKSArIDE7Ci0JCWlvdlszXS5pb3Zf
YmFzZSA9IGZzcC0+Zl9tbnRvbm5hbWU7Ci0JCWlvdlszXS5pb3ZfbGVuID0gc3RybGVuKGZzcC0+
Zl9tbnRvbm5hbWUpICsgMTsKLQkJaW92WzVdLmlvdl9iYXNlID0gZnNwLT5mX21udGZyb21uYW1l
OwotCQlpb3ZbNV0uaW92X2xlbiA9IHN0cmxlbihmc3AtPmZfbW50ZnJvbW5hbWUpICsgMTsKLQkJ
ZXJybXNnWzBdID0gJ1wwJzsKLQotCQkvKgotCQkgKiBFWERFViBpcyByZXR1cm5lZCB3aGVuIHBh
dGggZXhpc3RzIGJ1dCBpcyBub3QgYQotCQkgKiBtb3VudCBwb2ludC4gIE1heSBoYXBwZW5zIGlm
IHJhY2VkIHdpdGggdW5tb3VudC4KLQkJICovCi0JCWlmIChubW91bnQoaW92LCBpb3ZsZW4sIGZz
cC0+Zl9mbGFncykgPCAwICYmCi0JCSAgICBlcnJubyAhPSBFTk9FTlQgJiYgZXJybm8gIT0gRU5P
VFNVUCAmJiBlcnJubyAhPSBFWERFVikgewotCQkJc3lzbG9nKExPR19FUlIsCi0JCQkgICAgImNh
bid0IGRlbGV0ZSBleHBvcnRzIGZvciAlczogJW0gJXMiLAotCQkJICAgIGZzcC0+Zl9tbnRvbm5h
bWUsIGVycm1zZyk7CisJCW51bSA9IGdldG1udGluZm8oJm1udGJ1ZnAsIE1OVF9OT1dBSVQpOwor
CQorCQlmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspIHsKKwkJCWZzcCA9ICZtbnRidWZwW2ldOwor
CQkJZGVsZXRlX2V4cG9ydChpb3YsIGlvdmxlbiwgZnNwLCBlcnJtc2cpOwogCQl9CisKKworCQkv
KiBSZWFkIHRoZSBleHBvcnQgZmlsZShzKSBhbmQgcHJvY2VzcyB0aGVtICovCisJCXJlYWRfZXhw
b3J0ZmlsZSgwKTsKK3N5c2xvZyhMT0dfRVJSLCAicmVhZGV4cDAiKTsKIAl9CiAKIAlpZiAoaW92
ICE9IE5VTEwpIHsKQEAgLTE4MzgsNiArMTg2OCwyNSBAQCBnZXRfZXhwb3J0bGlzdCh2b2lkKQog
CX0KIAogCS8qCisJICogSWYgdGhlcmUgd2FzIG5vIHB1YmxpYyBmaCwgY2xlYXIgYW55IHByZXZp
b3VzIG9uZSBzZXQuCisJICovCisJaWYgKGhhc19wdWJsaWNmaCA9PSAwKQorCQkodm9pZCkgbmZz
c3ZjKE5GU1NWQ19OT1BVQkxJQ0ZILCBOVUxMKTsKKworCS8qIFJlc3VtZSB0aGUgbmZzZC4gSWYg
dGhleSB3ZXJlbid0IHN1c3BlbmRlZCwgdGhpcyBpcyBoYXJtbGVzcy4gKi8KKwkodm9pZCluZnNz
dmMoTkZTU1ZDX1JFU1VNRU5GU0QsIE5VTEwpOworc3lzbG9nKExPR19FUlIsICJlbyBnZXRfZXhw
b3J0bGlzdCIpOworfQorCisvKgorICogUmVhZCB0aGUgZXhwb3J0cyBmaWxlKHMpIGFuZCBjYWxs
IGdldF9leHBvcnRsaXN0X29uZSgpIGZvciBlYWNoIGxpbmUuCisgKi8KK3N0YXRpYyB2b2lkCity
ZWFkX2V4cG9ydGZpbGUoaW50IHBhc3NubykKK3sKKwlpbnQgZG9uZSwgaTsKKworCS8qCiAJICog
UmVhZCBpbiB0aGUgZXhwb3J0cyBmaWxlIGFuZCBidWlsZCB0aGUgbGlzdCwgY2FsbGluZwogCSAq
IG5tb3VudCgpIGFzIHdlIGdvIGFsb25nIHRvIHB1c2ggdGhlIGV4cG9ydCBydWxlcyBpbnRvIHRo
ZSBrZXJuZWwuCiAJICovCkBAIC0xODQ5LDcgKzE4OTgsNyBAQCBnZXRfZXhwb3J0bGlzdCh2b2lk
KQogCQkJc3lzbG9nKExPR19XQVJOSU5HLCAiY2FuJ3Qgb3BlbiAlcyIsIGV4bmFtZXNbaV0pOwog
CQkJY29udGludWU7CiAJCX0KLQkJZ2V0X2V4cG9ydGxpc3Rfb25lKCk7CisJCWdldF9leHBvcnRs
aXN0X29uZShwYXNzbm8pOwogCQlmY2xvc2UoZXhwX2ZpbGUpOwogCQlkb25lKys7CiAJfQpAQCAt
MTg1NywxNSArMTkwNiwyNjcgQEAgZ2V0X2V4cG9ydGxpc3Qodm9pZCkKIAkJc3lzbG9nKExPR19F
UlIsICJjYW4ndCBvcGVuIGFueSBleHBvcnRzIGZpbGUiKTsKIAkJZXhpdCgyKTsKIAl9Cit9CisK
Ky8qCisgKiBDb21wYXJlIHRoZSBleHBvcnQgbGlzdHMgYWdhaW5zdCB0aGUgb2xkIG9uZXMgYW5k
IGRvIG5tb3VudCgpIG9wZXJhdGlvbnMKKyAqIGZvciBhbnkgY2FzZXMgdGhhdCBoYXZlIGNoYW5n
ZWQuICBUaGlzIGF2b2lkcyBkb2luZyBubW91bnQoKSBmb3IgZW50cmllcworICogdGhhdCBoYXZl
IG5vdCBjaGFuZ2VkLgorICogUmV0dXJuIDAgdXBvbiBzdWNjZXNzLCAxIG90aGVyd2lzZS4KKyAq
Lworc3RhdGljIGludAorY29tcGFyZV9ubW91bnRfZXhwb3J0bGlzdChzdHJ1Y3QgaW92ZWMgKmlv
diwgaW50IGlvdmxlbiwgY2hhciAqZXJybXNnKQoreworCXN0cnVjdCBleHBvcnRsaXN0ICplcCwg
Km9lcDsKKwlzdHJ1Y3QgZ3JvdXBsaXN0ICpncnA7CisJc3RydWN0IHN0YXRmcyBmcywgb2ZzOwor
CWludCByZXQ7CiAKIAkvKgotCSAqIElmIHRoZXJlIHdhcyBubyBwdWJsaWMgZmgsIGNsZWFyIGFu
eSBwcmV2aW91cyBvbmUgc2V0LgorCSAqIExvb3AgdGhyb3VnaCB0aGUgY3VycmVudCBsaXN0IGFu
ZCBsb29rIGZvciBhbiBlbnRyeSBpbiB0aGUgb2xkCisJICogbGlzdC4KKwkgKiBJZiBmb3VuZCwg
Y2hlY2sgdG8gc2VlIGlmIGl0IHRoZSBzYW1lLgorCSAqICAgICAgICBJZiBpdCBpcyBub3QgdGhl
IHNhbWUsIGRlbGV0ZSBhbmQgcmUtZXhwb3J0LgorCSAqICAgICAgICBUaGVuIG1hcmsgaXQgZG9u
ZSBvbiB0aGUgb2xkIGxpc3QuCisJICogZWxzZSAobm90IGZvdW5kKQorCSAqICAgICAgICBleHBv
cnQgaXQuCisJICogQW55IGVudHJpZXMgbGVmdCBpbiB0aGUgb2xkIGxpc3QgYWZ0ZXIgcHJvY2Vz
c2luZyBtdXN0IGhhdmUgdGhlaXIKKwkgKiBleHBvcnRzIGRlbGV0ZWQuCiAJICovCi0JaWYgKGhh
c19wdWJsaWNmaCA9PSAwKQotCQkodm9pZCkgbmZzc3ZjKE5GU1NWQ19OT1BVQkxJQ0ZILCBOVUxM
KTsKKwlTTElTVF9GT1JFQUNIKGVwLCAmZXhwaGVhZCwgZW50cmllcykgeworc3lzbG9nKExPR19F
UlIsICJmb3JlYWNoIGVwIik7CisJCWlmIChzdGF0ZnMoZXAtPmV4X2ZzZGlyLCAmZnMpIDwgMCkK
KwkJCXJldHVybiAoMSk7CitzeXNsb2coTE9HX0VSUiwgImZzdjA9JWQgZnN2MT0lZCIsIGZzLmZf
ZnNpZC52YWxbMF0sIGZzLmZfZnNpZC52YWxbMV0pOworCQlTTElTVF9GT1JFQUNIKG9lcCwgJm9s
ZGV4cGhlYWQsIGVudHJpZXMpIHsKK3N5c2xvZyhMT0dfRVJSLCAiZm9yZWFjaCBvZXAiKTsKKwkJ
CWlmIChlcC0+ZXhfZnMudmFsWzBdID09IG9lcC0+ZXhfZnMudmFsWzBdICYmCisJCQkgICAgZXAt
PmV4X2ZzLnZhbFsxXSA9PSBvZXAtPmV4X2ZzLnZhbFsxXSkgeworCQkJCS8qCisJCQkJICogU3Rh
dGZzIGJvdGggZmlsZSBzeXN0ZW1zIGFuZCBzYW5pdHkgY2hlY2sKKwkJCQkgKiB0aGF0IHRoZXkg
c3RpbGwgcmVmZXIgdG8gdGhlIHNhbWUgZmlsZQorCQkJCSAqIHN5c3RlbS4KKwkJCQkgKiBJZiBu
b3QsIHJldHVybiAxIHNvIHRoYXQgdGhlIHJlbG9hZCBvZiB0aGUKKwkJCQkgKiBleHBvcnRzIHdp
bGwgYmUgZG9uZSBpbiBidWxrLCB0aGUKKwkJCQkgKiBwYXNzbm8gPT0gMCB3YXkuCisJCQkJICov
CitzeXNsb2coTE9HX0VSUiwgImZuZCBleCIpOworCQkJCWlmIChzdGF0ZnMob2VwLT5leF9mc2Rp
ciwgJm9mcykgPCAwIHx8CisJCQkJICAgIGVwLT5leF9mcy52YWxbMF0gIT0gZnMuZl9mc2lkLnZh
bFswXSB8fAorCQkJCSAgICBlcC0+ZXhfZnMudmFsWzFdICE9IGZzLmZfZnNpZC52YWxbMV0gfHwK
KwkJCQkgICAgZnMuZl9mc2lkLnZhbFswXSAhPSBvZnMuZl9mc2lkLnZhbFswXSB8fAorCQkJCSAg
ICBmcy5mX2ZzaWQudmFsWzFdICE9IG9mcy5mX2ZzaWQudmFsWzFdKQorCQkJCQlyZXR1cm4gKDEp
OworCQkJCS8qCisJCQkJICogVGVzdCB0byBzZWUgaWYgdGhlIGVudHJ5IGlzIHRoZSBzYW1lLgor
CQkJCSAqIElmIG5vdCB0aGUgc2FtZSBkZWxldGUgZXhwb3J0cyBhbmQKKwkJCQkgKiByZS1leHBv
cnQuCisJCQkJICovCitzeXNsb2coTE9HX0VSUiwgImF0IGNvbXBhcmUiKTsKKwkJCQlpZiAoY29t
cGFyZV9leHBvcnQoZXAsIG9lcCkgIT0gMCkgeworCQkJCQlkZWxldGVfZXhwb3J0KGlvdiwgaW92
bGVuLCAmZnMsIGVycm1zZyk7CisJCQkJCXJldCA9IGRvX2V4cG9ydF9tb3VudChlcCwgJmZzKTsK
KwkJCQkJaWYgKHJldCAhPSAwKQorCQkJCQkJcmV0dXJuIChyZXQpOworCQkJCX0KKwkJCQlvZXAt
PmV4X2ZsYWcgfD0gRVhfRE9ORTsKK3N5c2xvZyhMT0dfRVJSLCAiZXhkb25lIik7CisJCQkJYnJl
YWs7CisJCQl9CisJCX0KKwkJaWYgKG9lcCA9PSBOVUxMKSB7CitzeXNsb2coTE9HX0VSUiwgIm5v
dCBmbmQgc28gZXgiKTsKKwkJCS8qIE5vdCBmb3VuZCwgc28gZG8gZXhwb3J0LiAqLworCQkJcmV0
ID0gZG9fZXhwb3J0X21vdW50KGVwLCAmZnMpOworCQkJaWYgKHJldCAhPSAwKQorCQkJCXJldHVy
biAocmV0KTsKKwkJfQorCX0KKwlTTElTVF9GT1JFQUNIKG9lcCwgJm9sZGV4cGhlYWQsIGVudHJp
ZXMpIHsKKwkJLyogRGVsZXRlIGV4cG9ydHMgbm90IGRvbmUuICovCisJCWlmICgob2VwLT5leF9m
bGFnICYgRVhfRE9ORSkgPT0gMCkgeworc3lzbG9nKExPR19FUlIsICJub3QgZG9uZSBkZWxldGUi
KTsKKwkJCWlmIChzdGF0ZnMob2VwLT5leF9mc2RpciwgJm9mcykgPj0gMCAmJgorCQkJICAgIG9l
cC0+ZXhfZnMudmFsWzBdID09IG9mcy5mX2ZzaWQudmFsWzBdICYmCisJCQkgICAgb2VwLT5leF9m
cy52YWxbMV0gPT0gb2ZzLmZfZnNpZC52YWxbMV0pCitzeXNsb2coTE9HX0VSUiwgImRvIGRlbGV0
ZSIpOworCQkJCWRlbGV0ZV9leHBvcnQoaW92LCBpb3ZsZW4sICZvZnMsIGVycm1zZyk7CisJCX0K
Kwl9CiAKLQkvKiBSZXN1bWUgdGhlIG5mc2QuIElmIHRoZXkgd2VyZW4ndCBzdXNwZW5kZWQsIHRo
aXMgaXMgaGFybWxlc3MuICovCi0JKHZvaWQpbmZzc3ZjKE5GU1NWQ19SRVNVTUVORlNELCBOVUxM
KTsKKwkvKiBEbyB0aGUgVjQgcm9vdCBleHBvcnRzLCBhcyByZXF1aXJlZC4gKi8KKwlncnAgPSB2
NHJvb3RfZ3JwOworCXY0cm9vdF9waGFzZSA9IDI7CisJd2hpbGUgKHY0cm9vdF9lcCAhPSBOVUxM
ICYmIGdycCAhPSBOVUxMKSB7CitzeXNsb2coTE9HX0VSUiwgInY0ZXggcGF0aD0lcyBncl90eXBl
PTB4JXggZ3JfZXhmbGFncz0weCV4IiwgdjRyb290X2RpcnBhdGgsIGdycC0+Z3JfdHlwZSwgZ3Jw
LT5ncl9leGZsYWdzKTsKK3N5c2xvZyhMT0dfRVJSLCAidjRyb290ZD0lcyIsIHY0cm9vdF9kaXJw
YXRoKTsKKwkJcmV0ID0gZG9fbW91bnQodjRyb290X2VwLCBncnAsIGdycC0+Z3JfZXhmbGFncywg
JmdycC0+Z3JfYW5vbiwKKwkJICAgIHY0cm9vdF9kaXJwYXRoLCBzdHJsZW4odjRyb290X2RpcnBh
dGgpLCAmZnMpOworCQlpZiAocmV0ICE9IDApIHsKKwkJCXY0cm9vdF9waGFzZSA9IDA7CisJCQly
ZXR1cm4gKHJldCk7CisJCX0KKwkJZ3JwID0gZ3JwLT5ncl9uZXh0OworCX0KKwl2NHJvb3RfcGhh
c2UgPSAwOworCWZyZWVfdjRyb290ZXhwKCk7CisJcmV0dXJuICgwKTsKK30KKworLyoKKyAqIENv
bXBhcmUgb2xkIGFuZCBjdXJyZW50IGV4cG9ydGxpc3QgZW50cmllcyBmb3IgdGhlIGZzaWQgYW5k
IHJldHVybiAwCisgKiBpZiB0aGV5IGFyZSB0aGUgc2FtZSwgMSBvdGhlcndpc2UuCisgKi8KK3N0
YXRpYyBpbnQKK2NvbXBhcmVfZXhwb3J0KHN0cnVjdCBleHBvcnRsaXN0ICplcCwgc3RydWN0IGV4
cG9ydGxpc3QgKm9lcCkKK3sKKwlzdHJ1Y3QgZ3JvdXBsaXN0ICpncnAsICpvZ3JwOworCisJaWYg
KHN0cmNtcChlcC0+ZXhfZnNkaXIsIG9lcC0+ZXhfZnNkaXIpICE9IDApCisJCXJldHVybiAoMSk7
CisJaWYgKChlcC0+ZXhfZGVmZGlyICE9IE5VTEwgJiYgb2VwLT5leF9kZWZkaXIgPT0gTlVMTCkg
fHwKKwkgICAgKGVwLT5leF9kZWZkaXIgPT0gTlVMTCAmJiBvZXAtPmV4X2RlZmRpciAhPSBOVUxM
KSkKKwkJcmV0dXJuICgxKTsKKwlpZiAoZXAtPmV4X2RlZmRpciAhPSBOVUxMKSB7CisJCWlmICgo
ZXAtPmV4X2RlZmRpci0+ZHBfZmxhZyAmIERQX0RFRlNFVCkgIT0gMCkgeworCQkJaWYgKChvZXAt
PmV4X2RlZmRpci0+ZHBfZmxhZyAmIERQX0RFRlNFVCkgPT0gMCkKKwkJCQlyZXR1cm4gKDEpOwor
CQkJaWYgKGVwLT5leF9kZWZudW1zZWNmbGF2b3JzICE9CisJCQkgICAgb2VwLT5leF9kZWZudW1z
ZWNmbGF2b3JzIHx8CisJCQkgICAgZXAtPmV4X2RlZmV4ZmxhZ3MgIT0gb2VwLT5leF9kZWZleGZs
YWdzIHx8CisJCQkgICAgY29tcGFyZV9jcmVkKCZlcC0+ZXhfZGVmYW5vbiwgJm9lcC0+ZXhfZGVm
YW5vbikgIT0KKwkJCSAgICAwIHx8IGNvbXBhcmVfc2VjZmxhdm9yKGVwLT5leF9kZWZzZWNmbGF2
b3JzLAorCQkJICAgIG9lcC0+ZXhfZGVmc2VjZmxhdm9ycywgZXAtPmV4X2RlZm51bXNlY2ZsYXZv
cnMpICE9CisJCQkgICAgMCkKKwkJCQlyZXR1cm4gKDEpOworCQl9CisJfQorCisJLyogTm93LCBj
aGVjayBhbGwgdGhlIGdyb3Vwcy4gKi8KKwlmb3IgKG9ncnAgPSBvZXAtPmV4X2dycGhlYWQ7IG9n
cnAgIT0gTlVMTDsgb2dycCA9IG9ncnAtPmdyX25leHQpCisJCW9ncnAtPmdyX2ZsYWcgPSAwOwor
CWZvciAoZ3JwID0gZXAtPmV4X2dycGhlYWQ7IGdycCAhPSBOVUxMOyBncnAgPSBncnAtPmdyX25l
eHQpIHsKKwkJZm9yIChvZ3JwID0gb2VwLT5leF9ncnBoZWFkOyBvZ3JwICE9IE5VTEw7IG9ncnAg
PQorCQkgICAgb2dycC0+Z3JfbmV4dCkKKwkJCWlmICgob2dycC0+Z3JfZmxhZyAmIEdSX0ZORCkg
PT0gMCAmJgorCQkJICAgIGdycC0+Z3JfbnVtc2VjZmxhdm9ycyA9PSBvZ3JwLT5ncl9udW1zZWNm
bGF2b3JzICYmCisJCQkgICAgZ3JwLT5ncl9leGZsYWdzID09IG9ncnAtPmdyX2V4ZmxhZ3MgJiYK
KwkJCSAgICBjb21wYXJlX2NyZWQoJmdycC0+Z3JfYW5vbiwgJm9ncnAtPmdyX2Fub24pID09IDAg
JiYKKwkJCSAgICBjb21wYXJlX3NlY2ZsYXZvcihncnAtPmdyX3NlY2ZsYXZvcnMsCisJCQkgICAg
b2dycC0+Z3Jfc2VjZmxhdm9ycywgZ3JwLT5ncl9udW1zZWNmbGF2b3JzKSA9PSAwKQorCQkJCWJy
ZWFrOworCQlpZiAob2dycCAhPSBOVUxMKQorCQkJb2dycC0+Z3JfZmxhZyB8PSBHUl9GTkQ7CisJ
CWVsc2UKKwkJCXJldHVybiAoMSk7CisJfQorCWZvciAob2dycCA9IG9lcC0+ZXhfZ3JwaGVhZDsg
b2dycCAhPSBOVUxMOyBvZ3JwID0gb2dycC0+Z3JfbmV4dCkKKwkJaWYgKChvZ3JwLT5ncl9mbGFn
ICYgR1JfRk5EKSA9PSAwKQorCQkJcmV0dXJuICgxKTsKKwlyZXR1cm4gKDApOworfQorCisvKgor
ICogQ29tcGFyZSB0byBzdHJ1Y3QgeHVjcmVkJ3MuICBSZXR1cm4gMCBpZiB0aGUgc2FtZSBhbmQg
MSBvdGhlcndpc2UuCisgKiBUaGlzIGFsZ29yaXRobSBpcyBPKE4qKjIpIGJ1dCBmb3J0dW5hdGVs
eSBOIGlzIGFsd2F5cyBzbWFsbC4KKyAqLworc3RhdGljIGludAorY29tcGFyZV9jcmVkKHN0cnVj
dCB4dWNyZWQgKmNyMCwgc3RydWN0IHh1Y3JlZCAqY3IxKQoreworCWludCBpLCBqOworCisJaWYg
KGNyMC0+Y3JfdWlkICE9IGNyMS0+Y3JfdWlkIHx8IGNyMC0+Y3Jfbmdyb3VwcyAhPSBjcjEtPmNy
X25ncm91cHMpCisJCXJldHVybiAoMSk7CisJZm9yIChpID0gMDsgaSA8IGNyMC0+Y3Jfbmdyb3Vw
czsgaSsrKSB7CisJCWZvciAoaiA9IDA7IGogPCBjcjAtPmNyX25ncm91cHM7IGorKykKKwkJCWlm
IChjcjAtPmNyX2dyb3Vwc1tpXSA9PSBjcjEtPmNyX2dyb3Vwc1tqXSkKKwkJCQlicmVhazsKKwkJ
aWYgKGogPT0gY3IwLT5jcl9uZ3JvdXBzKQorCQkJcmV0dXJuICgxKTsKKwl9CisJcmV0dXJuICgw
KTsKK30KKworLyoKKyAqIENvbXBhcmUgdHdvIGxpc3RzIG9mIHNlY3VyaXR5IGZsYXZvcnMuICBS
ZXR1cm4gMCBpZiB0aGUgc2FtZSBhbmQgMSBvdGhlcndpc2UuCisgKiBUaGlzIGFsZ29yaXRobSBp
cyBPKE4qKjIpIGJ1dCBmb3J0dW5hdGVseSBOIGlzIGFsd2F5cyBzbWFsbC4KKyAqLworc3RhdGlj
IGludAorY29tcGFyZV9zZWNmbGF2b3IoaW50ICpzZWMxLCBpbnQgKnNlYzIsIGludCBuc2VjKQor
eworCWludCBpLCBqOworCisJZm9yIChpID0gMDsgaSA8IG5zZWM7IGkrKykgeworCQlmb3IgKGog
PSAwOyBqIDwgbnNlYzsgaisrKQorCQkJaWYgKHNlYzFbaV0gPT0gc2VjMltqXSkKKwkJCQlicmVh
azsKKwkJaWYgKGogPT0gbnNlYykKKwkJCXJldHVybiAoMSk7CisJfQorCXJldHVybiAoMCk7Cit9
CisKKy8qCisgKiBEZWxldGUgYW4gZXhwb3J0cyBlbnRyeS4KKyAqLworc3RhdGljIHZvaWQKK2Rl
bGV0ZV9leHBvcnQoc3RydWN0IGlvdmVjICppb3YsIGludCBpb3ZsZW4sIHN0cnVjdCBzdGF0ZnMg
KmZzcCwgY2hhciAqZXJybXNnKQoreworCXN0cnVjdCB4dmZzY29uZiB2ZmM7CisKKwlpZiAoZ2V0
dmZzYnluYW1lKGZzcC0+Zl9mc3R5cGVuYW1lLCAmdmZjKSAhPSAwKSB7CisJCXN5c2xvZyhMT0df
RVJSLCAiZ2V0dmZzYnluYW1lKCkgZmFpbGVkIGZvciAlcyIsCisJCSAgICBmc3AtPmZfZnN0eXBl
bmFtZSk7CisJCXJldHVybjsKKwl9CisJCisJLyoKKwkgKiBXZSBkbyBub3QgbmVlZCB0byBkZWxl
dGUgImV4cG9ydCIgZmxhZyBmcm9tCisJICogZmlsZXN5c3RlbXMgdGhhdCBkbyBub3QgaGF2ZSBp
dCBzZXQuCisJICovCisJaWYgKCEoZnNwLT5mX2ZsYWdzICYgTU5UX0VYUE9SVEVEKSkKKwkJcmV0
dXJuOworCS8qCisJICogRG8gbm90IGRlbGV0ZSBleHBvcnQgZm9yIG5ldHdvcmsgZmlsZXN5c3Rl
bSBieQorCSAqIHBhc3NpbmcgImV4cG9ydCIgYXJnIHRvIG5tb3VudCgpLgorCSAqIEl0IG9ubHkg
bWFrZXMgc2Vuc2UgdG8gZG8gdGhpcyBmb3IgbG9jYWwgZmlsZXN5c3RlbXMuCisJICovCisJaWYg
KHZmYy52ZmNfZmxhZ3MgJiBWRkNGX05FVFdPUkspCisJCXJldHVybjsKKwkKKwlpb3ZbMV0uaW92
X2Jhc2UgPSBmc3AtPmZfZnN0eXBlbmFtZTsKKwlpb3ZbMV0uaW92X2xlbiA9IHN0cmxlbihmc3At
PmZfZnN0eXBlbmFtZSkgKyAxOworCWlvdlszXS5pb3ZfYmFzZSA9IGZzcC0+Zl9tbnRvbm5hbWU7
CisJaW92WzNdLmlvdl9sZW4gPSBzdHJsZW4oZnNwLT5mX21udG9ubmFtZSkgKyAxOworCWlvdls1
XS5pb3ZfYmFzZSA9IGZzcC0+Zl9tbnRmcm9tbmFtZTsKKwlpb3ZbNV0uaW92X2xlbiA9IHN0cmxl
bihmc3AtPmZfbW50ZnJvbW5hbWUpICsgMTsKKwllcnJtc2dbMF0gPSAnXDAnOworCQorCS8qCisJ
ICogRVhERVYgaXMgcmV0dXJuZWQgd2hlbiBwYXRoIGV4aXN0cyBidXQgaXMgbm90IGEKKwkgKiBt
b3VudCBwb2ludC4gIE1heSBoYXBwZW5zIGlmIHJhY2VkIHdpdGggdW5tb3VudC4KKwkgKi8KKwlp
ZiAobm1vdW50KGlvdiwgaW92bGVuLCBmc3AtPmZfZmxhZ3MpIDwgMCAmJiBlcnJubyAhPSBFTk9F
TlQgJiYKKwkgICAgZXJybm8gIT0gRU5PVFNVUCAmJiBlcnJubyAhPSBFWERFVikgeworCQlzeXNs
b2coTE9HX0VSUiwKKwkJICAgICJjYW4ndCBkZWxldGUgZXhwb3J0cyBmb3IgJXM6ICVtICVzIiwK
KwkJICAgIGZzcC0+Zl9tbnRvbm5hbWUsIGVycm1zZyk7CisJfQorfQorCisvKgorICogRnJlZSB1
cCB0aGUgZXhwb3J0cyBsaXN0cyBwYXNzZWQgaW4gYXMgYXJndW1lbnRzLgorICovCitzdGF0aWMg
dm9pZAorZnJlZV9leHBvcnRzKHN0cnVjdCBleHBvcnRsaXN0aGVhZCAqZXhocCkKK3sKKwlzdHJ1
Y3QgZXhwb3J0bGlzdCAqZXAsICplcDI7CisKKwlTTElTVF9GT1JFQUNIX1NBRkUoZXAsIGV4aHAs
IGVudHJpZXMsIGVwMikgeworCQlTTElTVF9SRU1PVkUoZXhocCwgZXAsIGV4cG9ydGxpc3QsIGVu
dHJpZXMpOworCQlmcmVlX2V4cChlcCk7CisJfQorCVNMSVNUX0lOSVQoZXhocCk7CiB9CiAKIC8q
CkBAIC0xOTY1LDcgKzIyNjYsNyBAQCBhZGRfZXhwZGlyKHN0cnVjdCBkaXJsaXN0ICoqZHBwLCBj
aGFyICpjCiAgKi8KIHN0YXRpYyB2b2lkCiBoYW5nX2RpcnAoc3RydWN0IGRpcmxpc3QgKmRwLCBz
dHJ1Y3QgZ3JvdXBsaXN0ICpncnAsIHN0cnVjdCBleHBvcnRsaXN0ICplcCwKLQlpbnQgZmxhZ3Mp
CisJaW50IGZsYWdzLCBzdHJ1Y3QgeHVjcmVkICphbm9uY3JwLCBpbnQgZXhmbGFncykKIHsKIAlz
dHJ1Y3QgaG9zdGxpc3QgKmhwOwogCXN0cnVjdCBkaXJsaXN0ICpkcDI7CkBAIC0xOTgyLDYgKzIy
ODMsOCBAQCBoYW5nX2RpcnAoc3RydWN0IGRpcmxpc3QgKmRwLCBzdHJ1Y3QgZ3JvCiAJCQlpZiAo
ZXAtPmV4X251bXNlY2ZsYXZvcnMgPiAwKQogCQkJCW1lbWNweShlcC0+ZXhfZGVmc2VjZmxhdm9y
cywgZXAtPmV4X3NlY2ZsYXZvcnMsCiAJCQkJICAgIHNpemVvZihlcC0+ZXhfc2VjZmxhdm9ycykp
OworCQkJZXAtPmV4X2RlZmFub24gPSAqYW5vbmNycDsKKwkJCWVwLT5leF9kZWZleGZsYWdzID0g
ZXhmbGFnczsKIAkJfSBlbHNlIHdoaWxlIChncnApIHsKIAkJCWhwID0gZ2V0X2h0KCk7CiAJCQlo
cC0+aHRfZ3JwID0gZ3JwOwpAQCAtMjQwMyw2ICsyNzA2LDcgQEAgZ2V0X2hvc3QoY2hhciAqY3As
IHN0cnVjdCBncm91cGxpc3QgKmdycAogc3RhdGljIHZvaWQKIGZyZWVfZXhwKHN0cnVjdCBleHBv
cnRsaXN0ICplcCkKIHsKKwlzdHJ1Y3QgZ3JvdXBsaXN0ICpncnAsICp0Z3JwOwogCiAJaWYgKGVw
LT5leF9kZWZkaXIpIHsKIAkJZnJlZV9ob3N0KGVwLT5leF9kZWZkaXItPmRwX2hvc3RzKTsKQEAg
LTI0MTMsMTAgKzI3MTcsMzcgQEAgZnJlZV9leHAoc3RydWN0IGV4cG9ydGxpc3QgKmVwKQogCWlm
IChlcC0+ZXhfaW5kZXhmaWxlKQogCQlmcmVlKGVwLT5leF9pbmRleGZpbGUpOwogCWZyZWVfZGly
KGVwLT5leF9kaXJsKTsKKwl0Z3JwID0gZXAtPmV4X2dycGhlYWQ7CisJd2hpbGUgKHRncnAgIT0g
TlVMTCkgeworCQlncnAgPSB0Z3JwOworCQl0Z3JwID0gdGdycC0+Z3JfbmV4dDsKKwkJZnJlZV9n
cnAoZ3JwKTsKKwl9CiAJZnJlZSgoY2FkZHJfdCllcCk7CiB9CiAKIC8qCisgKiBGcmVlIHVwIHRo
ZSB2NHJvb3QgZXhwb3J0cy4KKyAqLworc3RhdGljIHZvaWQKK2ZyZWVfdjRyb290ZXhwKHZvaWQp
Cit7CisJc3RydWN0IGdyb3VwbGlzdCAqZ3JwLCAqdGdycDsKKworCWlmICh2NHJvb3RfZXAgIT0g
TlVMTCkgeworCQlmcmVlX2V4cCh2NHJvb3RfZXApOworCQl2NHJvb3RfZXAgPSBOVUxMOworCX0K
Kwl0Z3JwID0gdjRyb290X2dycDsKKwl2NHJvb3RfZ3JwID0gTlVMTDsKKwl3aGlsZSAodGdycCAh
PSBOVUxMKSB7CisJCWdycCA9IHRncnA7CisJCXRncnAgPSB0Z3JwLT5ncl9uZXh0OworCQlmcmVl
X2dycChncnApOworCX0KK30KKworLyoKICAqIEZyZWUgaG9zdHMuCiAgKi8KIHN0YXRpYyB2b2lk
CkBAIC0yNDU2LDYgKzI3ODcsNDQgQEAgb3V0X29mX21lbSh2b2lkKQogfQogCiAvKgorICogQ2Fs
bCBkb19tb3VudCgpIGZyb20gdGhlIHN0cnVjdCBleHBvcnRsaXN0LCBmb3IgZWFjaCBjYXNlIG5l
ZWRlZC4KKyAqLworc3RhdGljIGludAorZG9fZXhwb3J0X21vdW50KHN0cnVjdCBleHBvcnRsaXN0
ICplcCwgc3RydWN0IHN0YXRmcyAqZnNwKQoreworCXN0cnVjdCBkaXJsaXN0ICpkcDsKKwlzdHJ1
Y3QgZ3JvdXBsaXN0ICpncnAsIGRlZmdycDsKKwlpbnQgcmV0OworCXNpemVfdCBkaXJsZW47CisK
K3N5c2xvZyhMT0dfRVJSLCAiZG9fbW91bnRfZXhwb3J0PSVzIiwgZXAtPmV4X2ZzZGlyKTsKKwlk
aXJsZW4gPSBzdHJsZW4oZXAtPmV4X2ZzZGlyKTsKKwlkcCA9IGVwLT5leF9kZWZkaXI7CisJaWYg
KGRwICE9IE5VTEwgJiYgKGRwLT5kcF9mbGFnICYgRFBfREVGU0VUKSAhPSAwKSB7CisJCWRlZmdy
cC5ncl90eXBlID0gR1RfREVGQVVMVDsKKwkJZGVmZ3JwLmdyX25leHQgPSBOVUxMOworCQkvKiBX
ZSBoYXZlIGFuIGVudHJ5IGZvciBhbGwgb3RoZXIgaG9zdHMvbmV0cy4gKi8KK3N5c2xvZyhMT0df
RVJSLCAiZXhfZGVmZXhmbGFncz0weCV4IiwgZXAtPmV4X2RlZmV4ZmxhZ3MpOworCQlyZXQgPSBk
b19tb3VudChlcCwgJmRlZmdycCwgZXAtPmV4X2RlZmV4ZmxhZ3MsICZlcC0+ZXhfZGVmYW5vbiwK
KwkJICAgIGVwLT5leF9mc2RpciwgZGlybGVuLCBmc3ApOworCQlpZiAocmV0ICE9IDApCisJCQly
ZXR1cm4gKHJldCk7CisJfQorCisJLyogRG8gYSBtb3VudCBmb3IgZWFjaCBncm91cC4gKi8KKwln
cnAgPSBlcC0+ZXhfZ3JwaGVhZDsKKwl3aGlsZSAoZ3JwICE9IE5VTEwpIHsKK3N5c2xvZyhMT0df
RVJSLCAiZG8gbW91bnQgZ3JfdHlwZT0weCV4IGdyX2V4ZmxhZ3M9MHgleCIsIGdycC0+Z3JfdHlw
ZSwgZ3JwLT5ncl9leGZsYWdzKTsKKwkJcmV0ID0gZG9fbW91bnQoZXAsIGdycCwgZ3JwLT5ncl9l
eGZsYWdzLCAmZ3JwLT5ncl9hbm9uLAorCQkgICAgZXAtPmV4X2ZzZGlyLCBkaXJsZW4sIGZzcCk7
CisJCWlmIChyZXQgIT0gMCkKKwkJCXJldHVybiAocmV0KTsKKwkJZ3JwID0gZ3JwLT5ncl9uZXh0
OworCX0KKwlyZXR1cm4gKDApOworfQorCisvKgogICogRG8gdGhlIG5tb3VudCgpIHN5c2NhbGwg
d2l0aCB0aGUgdXBkYXRlIGZsYWcgdG8gcHVzaCB0aGUgZXhwb3J0IGluZm8gaW50bwogICogdGhl
IGtlcm5lbC4KICAqLwpAQCAtMjQ4Nyw2ICsyODU2LDcgQEAgZG9fbW91bnQoc3RydWN0IGV4cG9y
dGxpc3QgKmVwLCBzdHJ1Y3QgZwogCWJ6ZXJvKGVycm1zZywgc2l6ZW9mKGVycm1zZykpOwogCWVh
cC0+ZXhfZmxhZ3MgPSBleGZsYWdzOwogCWVhcC0+ZXhfYW5vbiA9ICphbm9uY3JwOworc3lzbG9n
KExPR19FUlIsICJkb19leGZsYWdzPTB4JXgiLCBleGZsYWdzKTsKIAllYXAtPmV4X2luZGV4Zmls
ZSA9IGVwLT5leF9pbmRleGZpbGU7CiAJaWYgKGdycC0+Z3JfdHlwZSA9PSBHVF9IT1NUKQogCQlh
aSA9IGdycC0+Z3JfcHRyLmd0X2FkZHJpbmZvOwo=

--_002_YQBPR0101MB22608FE3367E1DBD64ED01E1DD310YQBPR0101MB2260_--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?YQBPR0101MB22608FE3367E1DBD64ED01E1DD310>