Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 7 May 2019 23:04: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:   Re: patch to improve perf for handling exports of large numbers of file systems
Message-ID:  <YQBPR0101MB2260008E1767646E9DFBB790DD310@YQBPR0101MB2260.CANPRD01.PROD.OUTLOOK.COM>
In-Reply-To: <YQBPR0101MB22608FE3367E1DBD64ED01E1DD310@YQBPR0101MB2260.CANPRD01.PROD.OUTLOOK.COM>
References:  <YQBPR0101MB22608FE3367E1DBD64ED01E1DD310@YQBPR0101MB2260.CANPRD01.PROD.OUTLOOK.COM>

next in thread | previous in thread | raw e-mail | index | archive | help
--_002_YQBPR0101MB2260008E1767646E9DFBB790DD310YQBPR0101MB2260_
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: quoted-printable

Here is an updated patch. I haven't found anything broken in the
previous one, but this one uses hash tables of lists for the exportlist
structures instead of a single linked list and that should help for large
numbers of file systems exported.

Good luck with the testing, rick

________________________________________
From: owner-freebsd-fs@freebsd.org <owner-freebsd-fs@freebsd.org> on behalf=
 of Rick Macklem <rmacklem@uoguelph.ca>
Sent: Monday, May 6, 2019 8:50:10 PM
To: Peter Eriksson
Cc: freebsd-fs@freebsd.org
Subject: patch to improve perf for handling exports of large numbers of fil=
e systems

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_YQBPR0101MB2260008E1767646E9DFBB790DD310YQBPR0101MB2260_
Content-Type: application/octet-stream; name="mountd-exp2.patch"
Content-Description: mountd-exp2.patch
Content-Disposition: attachment; filename="mountd-exp2.patch"; size=27128;
	creation-date="Tue, 07 May 2019 23:04:05 GMT";
	modification-date="Tue, 07 May 2019 23:04:05 GMT"
Content-Transfer-Encoding: base64

LS0tIHVzci5zYmluL21vdW50ZC9tb3VudGQuYy5zYXYJMjAxOS0wNC0zMCAyMTo0ODoyMy4xNTU0
MTkwMDAgLTA0MDAKKysrIHVzci5zYmluL21vdW50ZC9tb3VudGQuYwkyMDE5LTA1LTA3IDE4OjM5
OjMzLjE2ODEwMTAwMCAtMDQwMApAQCAtNDksNiArNDksNyBAQCBfX0ZCU0RJRCgiJEZyZWVCU0Q6
IGhlYWQvdXNyLnNiaW4vbW91bnRkCiAKICNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KICNpbmNsdWRl
IDxzeXMvZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvZm52X2hhc2guaD4KICNpbmNsdWRlIDxzeXMv
bGlua2VyLmg+CiAjaW5jbHVkZSA8c3lzL21vZHVsZS5oPgogI2luY2x1ZGUgPHN5cy9tb3VudC5o
PgpAQCAtMTE0LDEwICsxMTUsMTMgQEAgc3RydWN0IGRpcmxpc3Qgewogc3RydWN0IGV4cG9ydGxp
c3QgewogCXN0cnVjdCBkaXJsaXN0CSpleF9kaXJsOwogCXN0cnVjdCBkaXJsaXN0CSpleF9kZWZk
aXI7CisJc3RydWN0IGdyb3VwbGlzdCAqZXhfZ3JwaGVhZDsKIAlpbnQJCWV4X2ZsYWc7CiAJZnNp
ZF90CQlleF9mczsKIAljaGFyCQkqZXhfZnNkaXI7CiAJY2hhcgkJKmV4X2luZGV4ZmlsZTsKKwlz
dHJ1Y3QgeHVjcmVkCWV4X2RlZmFub247CisJaW50CQlleF9kZWZleGZsYWdzOwogCWludAkJZXhf
bnVtc2VjZmxhdm9yczsKIAlpbnQJCWV4X3NlY2ZsYXZvcnNbTUFYU0VDRkxBVk9SU107CiAJaW50
CQlleF9kZWZudW1zZWNmbGF2b3JzOwpAQCAtMTI3LDYgKzEzMSw5IEBAIHN0cnVjdCBleHBvcnRs
aXN0IHsKIH07CiAvKiBleF9mbGFnIGJpdHMgKi8KICNkZWZpbmUJRVhfTElOS0VECTB4MQorI2Rl
ZmluZQlFWF9ET05FCQkweDIKKworU0xJU1RfSEVBRChleHBvcnRsaXN0aGVhZCwgZXhwb3J0bGlz
dCk7CiAKIHN0cnVjdCBuZXRtc2sgewogCXN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIG50X25ldDsK
QEAgLTE0Myw2ICsxNTAsOSBAQCBzdHJ1Y3QgZ3JvdXBsaXN0IHsKIAlpbnQgZ3JfdHlwZTsKIAl1
bmlvbiBncm91cHR5cGVzIGdyX3B0cjsKIAlzdHJ1Y3QgZ3JvdXBsaXN0ICpncl9uZXh0OworCXN0
cnVjdCB4dWNyZWQgZ3JfYW5vbjsKKwlpbnQgZ3JfZXhmbGFnczsKKwlpbnQgZ3JfZmxhZzsKIAlp
bnQgZ3JfbnVtc2VjZmxhdm9yczsKIAlpbnQgZ3Jfc2VjZmxhdm9yc1tNQVhTRUNGTEFWT1JTXTsK
IH07CkBAIC0xNTMsNiArMTYzLDkgQEAgc3RydWN0IGdyb3VwbGlzdCB7CiAjZGVmaW5lCUdUX0RF
RkFVTFQJMHgzCiAjZGVmaW5lIEdUX0lHTk9SRQkweDUKIAorLyogR3JvdXAgZmxhZ3MgKi8KKyNk
ZWZpbmUJR1JfRk5ECQkweDEKKwogc3RydWN0IGhvc3RsaXN0IHsKIAlpbnQJCSBodF9mbGFnOwkv
KiBVc2VzIERQX3h4IGJpdHMgKi8KIAlzdHJ1Y3QgZ3JvdXBsaXN0ICpodF9ncnA7CkBAIC0xODUs
MTcgKzE5OCwyOCBAQCBzdGF0aWMgdm9pZAljb21wbGV0ZV9zZXJ2aWNlKHN0cnVjdCBuZXRjCiBz
dGF0aWMgdm9pZAljbGVhcm91dF9zZXJ2aWNlKHZvaWQpOwogc3RhdGljIHZvaWQJZGVsX21saXN0
KGNoYXIgKmhvc3RwLCBjaGFyICpkaXJwKTsKIHN0YXRpYyBzdHJ1Y3QgZGlybGlzdAkqZGlycF9z
ZWFyY2goc3RydWN0IGRpcmxpc3QgKiwgY2hhciAqKTsKK3N0YXRpYyBpbnQJZG9fZXhwb3J0X21v
dW50KHN0cnVjdCBleHBvcnRsaXN0ICosIHN0cnVjdCBzdGF0ZnMgKik7CiBzdGF0aWMgaW50CWRv
X21vdW50KHN0cnVjdCBleHBvcnRsaXN0ICosIHN0cnVjdCBncm91cGxpc3QgKiwgaW50LAogCQkg
ICAgc3RydWN0IHh1Y3JlZCAqLCBjaGFyICosIGludCwgc3RydWN0IHN0YXRmcyAqKTsKIHN0YXRp
YyBpbnQJZG9fb3B0KGNoYXIgKiosIGNoYXIgKiosIHN0cnVjdCBleHBvcnRsaXN0ICosCiAJCSAg
ICBzdHJ1Y3QgZ3JvdXBsaXN0ICosIGludCAqLCBpbnQgKiwgc3RydWN0IHh1Y3JlZCAqKTsKLXN0
YXRpYyBzdHJ1Y3QgZXhwb3J0bGlzdAkqZXhfc2VhcmNoKGZzaWRfdCAqKTsKK3N0YXRpYyBzdHJ1
Y3QgZXhwb3J0bGlzdAkqZXhfc2VhcmNoKGZzaWRfdCAqLCBzdHJ1Y3QgZXhwb3J0bGlzdGhlYWQg
Kik7CiBzdGF0aWMgc3RydWN0IGV4cG9ydGxpc3QJKmdldF9leHAodm9pZCk7CiBzdGF0aWMgdm9p
ZAlmcmVlX2RpcihzdHJ1Y3QgZGlybGlzdCAqKTsKIHN0YXRpYyB2b2lkCWZyZWVfZXhwKHN0cnVj
dCBleHBvcnRsaXN0ICopOwogc3RhdGljIHZvaWQJZnJlZV9ncnAoc3RydWN0IGdyb3VwbGlzdCAq
KTsKIHN0YXRpYyB2b2lkCWZyZWVfaG9zdChzdHJ1Y3QgaG9zdGxpc3QgKik7Ci1zdGF0aWMgdm9p
ZAlnZXRfZXhwb3J0bGlzdCh2b2lkKTsKK3N0YXRpYyB2b2lkCWZyZWVfdjRyb290ZXhwKHZvaWQp
Oworc3RhdGljIHZvaWQJZ2V0X2V4cG9ydGxpc3Rfb25lKGludCk7CitzdGF0aWMgdm9pZAlnZXRf
ZXhwb3J0bGlzdChpbnQgcGFzc25vKTsKK3N0YXRpYyB2b2lkCXJlYWRfZXhwb3J0ZmlsZShpbnQg
cGFzc25vKTsKK3N0YXRpYyB2b2lkCWluc2VydF9leHBvcnRzKHN0cnVjdCBleHBvcnRsaXN0ICos
IHN0cnVjdCBleHBvcnRsaXN0aGVhZCAqKTsKK3N0YXRpYyB2b2lkCWZyZWVfZXhwb3J0cyhzdHJ1
Y3QgZXhwb3J0bGlzdGhlYWQgKik7CitzdGF0aWMgaW50CWNvbXBhcmVfbm1vdW50X2V4cG9ydGxp
c3Qoc3RydWN0IGlvdmVjICosIGludCwgY2hhciAqKTsKK3N0YXRpYyBpbnQJY29tcGFyZV9leHBv
cnQoc3RydWN0IGV4cG9ydGxpc3QgKiwgc3RydWN0IGV4cG9ydGxpc3QgKik7CitzdGF0aWMgaW50
CWNvbXBhcmVfY3JlZChzdHJ1Y3QgeHVjcmVkICosIHN0cnVjdCB4dWNyZWQgKik7CitzdGF0aWMg
aW50CWNvbXBhcmVfc2VjZmxhdm9yKGludCAqLCBpbnQgKiwgaW50KTsKK3N0YXRpYyB2b2lkCWRl
bGV0ZV9leHBvcnQoc3RydWN0IGlvdmVjICosIGludCwgc3RydWN0IHN0YXRmcyAqLCBjaGFyICop
Owogc3RhdGljIGludAlnZXRfaG9zdChjaGFyICosIHN0cnVjdCBncm91cGxpc3QgKiwgc3RydWN0
IGdyb3VwbGlzdCAqKTsKIHN0YXRpYyBzdHJ1Y3QgaG9zdGxpc3QgKmdldF9odCh2b2lkKTsKIHN0
YXRpYyBpbnQJZ2V0X2xpbmUodm9pZCk7CkBAIC0yMDQsNyArMjI4LDcgQEAgc3RhdGljIGludAln
ZXRfbmV0KGNoYXIgKiwgc3RydWN0IG5ldG1zawogc3RhdGljIHZvaWQJZ2V0ZXhwX2VycihzdHJ1
Y3QgZXhwb3J0bGlzdCAqLCBzdHJ1Y3QgZ3JvdXBsaXN0ICosIGNvbnN0IGNoYXIgKik7CiBzdGF0
aWMgc3RydWN0IGdyb3VwbGlzdAkqZ2V0X2dycCh2b2lkKTsKIHN0YXRpYyB2b2lkCWhhbmdfZGly
cChzdHJ1Y3QgZGlybGlzdCAqLCBzdHJ1Y3QgZ3JvdXBsaXN0ICosCi0JCQkJc3RydWN0IGV4cG9y
dGxpc3QgKiwgaW50KTsKKwkJICAgIHN0cnVjdCBleHBvcnRsaXN0ICosIGludCwgc3RydWN0IHh1
Y3JlZCAqLCBpbnQpOwogc3RhdGljIHZvaWQJaHVwaGFuZGxlcihpbnQgc2lnKTsKIHN0YXRpYyBp
bnQJbWFrZW1hc2soc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgKnNzcCwgaW50IGJpdGxlbik7CiBz
dGF0aWMgdm9pZAltbnRzcnYoc3RydWN0IHN2Y19yZXEgKiwgU1ZDWFBSVCAqKTsKQEAgLTIyNyw5
ICsyNTEsMTEgQEAgc3RhdGljIGludAl4ZHJfZmhzKFhEUiAqLCBjYWRkcl90KTsKIHN0YXRpYyBp
bnQJeGRyX21saXN0KFhEUiAqLCBjYWRkcl90KTsKIHN0YXRpYyB2b2lkCXRlcm1pbmF0ZShpbnQp
OwogCi1zdGF0aWMgU0xJU1RfSEVBRCgsIGV4cG9ydGxpc3QpIGV4cGhlYWQgPSBTTElTVF9IRUFE
X0lOSVRJQUxJWkVSKGV4cGhlYWQpOwotc3RhdGljIFNMSVNUX0hFQUQoLCBtb3VudGxpc3QpIG1s
aGVhZCA9IFNMSVNUX0hFQURfSU5JVElBTElaRVIobWxoZWFkKTsKLXN0YXRpYyBzdHJ1Y3QgZ3Jv
dXBsaXN0ICpncnBoZWFkOworI2RlZmluZQlFWFBIQVNIU0laRQkyNTYKKyNkZWZpbmUJRVhQSEFT
SChmKQkoZm52XzMyX2J1ZigoZiksIHNpemVvZihmc2lkX3QpLCAwKSAlIEVYUEhBU0hTSVpFKQor
c3RhdGljIHN0cnVjdCBleHBvcnRsaXN0aGVhZCBleHBoZWFkW0VYUEhBU0hTSVpFXTsKK3N0YXRp
YyBzdHJ1Y3QgZXhwb3J0bGlzdGhlYWQgb2xkZXhwaGVhZFtFWFBIQVNIU0laRV07CitzdGF0aWMg
U0xJU1RfSEVBRCgsIG1vdW50bGlzdCkgbWxoZWFkID0gU0xJU1RfSEVBRF9JTklUSUFMSVpFUigm
bWxoZWFkKTsKIHN0YXRpYyBjaGFyICpleG5hbWVzX2RlZmF1bHRbMl0gPSB7IF9QQVRIX0VYUE9S
VFMsIE5VTEwgfTsKIHN0YXRpYyBjaGFyICoqZXhuYW1lczsKIHN0YXRpYyBjaGFyICoqaG9zdHMg
PSBOVUxMOwpAQCAtMjYwLDYgKzI4Niw4IEBAIHN0YXRpYyBpbnQgaGF2ZV92NiA9IDE7CiAKIHN0
YXRpYyBpbnQgdjRyb290X3BoYXNlID0gMDsKIHN0YXRpYyBjaGFyIHY0cm9vdF9kaXJwYXRoW1BB
VEhfTUFYICsgMV07CitzdGF0aWMgc3RydWN0IGV4cG9ydGxpc3QgKnY0cm9vdF9lcCA9IE5VTEw7
CitzdGF0aWMgc3RydWN0IGdyb3VwbGlzdCAqdjRyb290X2dycCA9IE5VTEw7CiBzdGF0aWMgaW50
IGhhc19wdWJsaWNmaCA9IDA7CiAKIHN0YXRpYyBzdHJ1Y3QgcGlkZmggKnBmaCA9IE5VTEw7CkBA
IC0zNjgsOSArMzk2LDEwIEBAIG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQogCWluX3BvcnRf
dCBzdmNwb3J0OwogCWludCBjLCBrLCBzOwogCWludCBtYXhyZWMgPSBSUENfTUFYREFUQVNJWkU7
Ci0JaW50IGF0dGVtcHRfY250LCBwb3J0X2xlbiwgcG9ydF9wb3MsIHJldDsKKwlpbnQgYXR0ZW1w
dF9jbnQsIGksIHBhc3NubywgcG9ydF9sZW4sIHBvcnRfcG9zLCByZXQ7CiAJY2hhciAqKnBvcnRf
bGlzdDsKIAorCXBhc3NubyA9IDA7CiAJLyogQ2hlY2sgdGhhdCBhbm90aGVyIG1vdW50ZCBpc24n
dCBhbHJlYWR5IHJ1bm5pbmcuICovCiAJcGZoID0gcGlkZmlsZV9vcGVuKF9QQVRIX01PVU5URFBJ
RCwgMDYwMCwgJm90aGVycGlkKTsKIAlpZiAocGZoID09IE5VTEwpIHsKQEAgLTM4NSw3ICs0MTQs
NyBAQCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKIAllbHNlCiAJCWNsb3NlKHMpOwogCi0J
d2hpbGUgKChjID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICIyZGVoOmxucDpyUyIpKSAhPSAtMSkKKwl3
aGlsZSAoKGMgPSBnZXRvcHQoYXJnYywgYXJndiwgIjJkZWg6SWxucDpyUyIpKSAhPSAtMSkKIAkJ
c3dpdGNoIChjKSB7CiAJCWNhc2UgJzInOgogCQkJZm9yY2VfdjIgPSAxOwpAQCAtNDM3LDYgKzQ2
Niw5IEBAIG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQogCQljYXNlICdTJzoKIAkJCXN1c3Bl
bmRfbmZzZCA9IDE7CiAJCQlicmVhazsKKwkJY2FzZSAnSSc6CisJCQlwYXNzbm8gPSAxOworCQkJ
YnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQl1c2FnZSgpOwogCQl9CkBAIC00NDksNyArNDgxLDYgQEAg
bWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCiAKIAlhcmdjIC09IG9wdGluZDsKIAlhcmd2ICs9
IG9wdGluZDsKLQlncnBoZWFkID0gKHN0cnVjdCBncm91cGxpc3QgKilOVUxMOwogCWlmIChhcmdj
ID4gMCkKIAkJZXhuYW1lcyA9IGFyZ3Y7CiAJZWxzZQpAQCAtNDU3LDcgKzQ4OCwxNCBAQCBtYWlu
KGludCBhcmdjLCBjaGFyICoqYXJndikKIAlvcGVubG9nKCJtb3VudGQiLCBMT0dfUElELCBMT0df
REFFTU9OKTsKIAlpZiAoZGVidWcpCiAJCXdhcm54KCJnZXR0aW5nIGV4cG9ydCBsaXN0Iik7Ci0J
Z2V0X2V4cG9ydGxpc3QoKTsKKworCS8qIEluaXRpYWxpemUgdGhlIGV4cG9ydCBsaXN0cyBhbmQg
dGhlbiBwcm9jZXNzIHRoZSBleHBvcnRzIGZpbGUocykuICovCisJZm9yIChpID0gMDsgaSA8IEVY
UEhBU0hTSVpFOyBpKyspIHsKKwkJU0xJU1RfSU5JVCgmZXhwaGVhZFtpXSk7CisJCVNMSVNUX0lO
SVQoJm9sZGV4cGhlYWRbaV0pOworCX0KKwlnZXRfZXhwb3J0bGlzdCgwKTsKKwogCWlmIChkZWJ1
ZykKIAkJd2FybngoImdldHRpbmcgbW91bnQgbGlzdCIpOwogCWdldF9tb3VudGxpc3QoKTsKQEAg
LTYyOCw3ICs2NjYsNyBAQCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKIAkvKiBFeHBhbmQg
c3ZjX3J1bigpIGhlcmUgc28gdGhhdCB3ZSBjYW4gY2FsbCBnZXRfZXhwb3J0bGlzdCgpLiAqLwog
CWZvciAoOzspIHsKIAkJaWYgKGdvdF9zaWdodXApIHsKLQkJCWdldF9leHBvcnRsaXN0KCk7CisJ
CQlnZXRfZXhwb3J0bGlzdChwYXNzbm8pOwogCQkJZ290X3NpZ2h1cCA9IDA7CiAJCX0KIAkJcmVh
ZGZkcyA9IHN2Y19mZHNldDsKQEAgLTEwODcsNyArMTEyNSw3IEBAIG1udHNydihzdHJ1Y3Qgc3Zj
X3JlcSAqcnFzdHAsIFNWQ1hQUlQgKnQKIAkJaWYgKGJhZCkKIAkJCWVwID0gTlVMTDsKIAkJZWxz
ZQotCQkJZXAgPSBleF9zZWFyY2goJmZzYi5mX2ZzaWQpOworCQkJZXAgPSBleF9zZWFyY2goJmZz
Yi5mX2ZzaWQsIGV4cGhlYWQpOwogCQlob3N0c2V0ID0gZGVmc2V0ID0gMDsKIAkJaWYgKGVwICYm
IChjaGtfaG9zdChlcC0+ZXhfZGVmZGlyLCBzYWRkciwgJmRlZnNldCwgJmhvc3RzZXQsCiAJCSAg
ICAmbnVtc2VjZmxhdm9ycywgJnNlY2ZsYXZvcnNwKSB8fApAQCAtMTMwMiwyMSArMTM0MCwyMyBA
QCB4ZHJfZXhwbGlzdF9jb21tb24oWERSICp4ZHJzcCwgY2FkZHJfdCBjCiAJaW50IGZhbHNlID0g
MDsKIAlpbnQgcHV0ZGVmOwogCXNpZ3NldF90IHNpZ2h1cF9tYXNrOworCWludCBpOwogCiAJc2ln
ZW1wdHlzZXQoJnNpZ2h1cF9tYXNrKTsKIAlzaWdhZGRzZXQoJnNpZ2h1cF9tYXNrLCBTSUdIVVAp
OwogCXNpZ3Byb2NtYXNrKFNJR19CTE9DSywgJnNpZ2h1cF9tYXNrLCBOVUxMKTsKIAotCVNMSVNU
X0ZPUkVBQ0goZXAsICZleHBoZWFkLCBlbnRyaWVzKSB7Ci0JCXB1dGRlZiA9IDA7Ci0JCWlmIChw
dXRfZXhsaXN0KGVwLT5leF9kaXJsLCB4ZHJzcCwgZXAtPmV4X2RlZmRpciwKLQkJCSAgICAgICAm
cHV0ZGVmLCBicmllZikpCi0JCQlnb3RvIGVycm91dDsKLQkJaWYgKGVwLT5leF9kZWZkaXIgJiYg
cHV0ZGVmID09IDAgJiYKLQkJCXB1dF9leGxpc3QoZXAtPmV4X2RlZmRpciwgeGRyc3AsIChzdHJ1
Y3QgZGlybGlzdCAqKU5VTEwsCi0JCQkmcHV0ZGVmLCBicmllZikpCi0JCQlnb3RvIGVycm91dDsK
LQl9CisJZm9yIChpID0gMDsgaSA8IEVYUEhBU0hTSVpFOyBpKyspCisJCVNMSVNUX0ZPUkVBQ0go
ZXAsICZleHBoZWFkW2ldLCBlbnRyaWVzKSB7CisJCQlwdXRkZWYgPSAwOworCQkJaWYgKHB1dF9l
eGxpc3QoZXAtPmV4X2RpcmwsIHhkcnNwLCBlcC0+ZXhfZGVmZGlyLAorCQkJCSAgICAgICAmcHV0
ZGVmLCBicmllZikpCisJCQkJZ290byBlcnJvdXQ7CisJCQlpZiAoZXAtPmV4X2RlZmRpciAmJiBw
dXRkZWYgPT0gMCAmJgorCQkJCXB1dF9leGxpc3QoZXAtPmV4X2RlZmRpciwgeGRyc3AsCisJCQkJ
KHN0cnVjdCBkaXJsaXN0ICopTlVMTCwgJnB1dGRlZiwgYnJpZWYpKQorCQkJCWdvdG8gZXJyb3V0
OworCQl9CiAJc2lncHJvY21hc2soU0lHX1VOQkxPQ0ssICZzaWdodXBfbWFzaywgTlVMTCk7CiAJ
aWYgKCF4ZHJfYm9vbCh4ZHJzcCwgJmZhbHNlKSkKIAkJcmV0dXJuICgwKTsKQEAgLTE0MTYsNyAr
MTQ1Niw3IEBAIHN0YXRpYyBGSUxFICpleHBfZmlsZTsKICAqIEdldCB0aGUgZXhwb3J0IGxpc3Qg
ZnJvbSBvbmUsIGN1cnJlbnRseSBvcGVuIGZpbGUKICAqLwogc3RhdGljIHZvaWQKLWdldF9leHBv
cnRsaXN0X29uZSh2b2lkKQorZ2V0X2V4cG9ydGxpc3Rfb25lKGludCBwYXNzbm8pCiB7CiAJc3Ry
dWN0IGV4cG9ydGxpc3QgKmVwOwogCXN0cnVjdCBncm91cGxpc3QgKmdycCwgKnRncnA7CkBAIC0x
NTQwLDcgKzE1ODAsNyBAQCBnZXRfZXhwb3J0bGlzdF9vbmUodm9pZCkKIAkJCQkJICogU2VlIGlm
IHRoaXMgZGlyZWN0b3J5IGlzIGFscmVhZHkKIAkJCQkJICogaW4gdGhlIGxpc3QuCiAJCQkJCSAq
LwotCQkJCQllcCA9IGV4X3NlYXJjaCgmZnNiLmZfZnNpZCk7CisJCQkJCWVwID0gZXhfc2VhcmNo
KCZmc2IuZl9mc2lkLCBleHBoZWFkKTsKIAkJCQkJaWYgKGVwID09IChzdHJ1Y3QgZXhwb3J0bGlz
dCAqKU5VTEwpIHsKIAkJCQkJICAgIGVwID0gZ2V0X2V4cCgpOwogCQkJCQkgICAgZXAtPmV4X2Zz
ID0gZnNiLmZfZnNpZDsKQEAgLTE2NTMsMTEgKzE2OTMsMTUgQEAgZ2V0X2V4cG9ydGxpc3Rfb25l
KHZvaWQpCiAJCSAqIExvb3AgdGhyb3VnaCBob3N0cywgcHVzaGluZyB0aGUgZXhwb3J0cyBpbnRv
IHRoZSBrZXJuZWwuCiAJCSAqIEFmdGVyIGxvb3AsIHRncnAgcG9pbnRzIHRvIHRoZSBzdGFydCBv
ZiB0aGUgbGlzdCBhbmQKIAkJICogZ3JwIHBvaW50cyB0byB0aGUgbGFzdCBlbnRyeSBpbiB0aGUg
bGlzdC4KKwkJICogRG8gbm90IGRvIHRoZSBkb19tb3VudCgpIGZvciBwYXNzbm8gPT0gMSwgc2lu
Y2UgdGhlCisJCSAqIHNlY29uZCBwYXNzIHdpbGwgZG8gaXQsIGFzIHJlcXVpcmVkLgogCQkgKi8K
IAkJZ3JwID0gdGdycDsKIAkJZG8gewotCQkJaWYgKGRvX21vdW50KGVwLCBncnAsIGV4ZmxhZ3Ms
ICZhbm9uLCBkaXJwLCBkaXJwbGVuLAotCQkJICAgICZmc2IpKSB7CisJCQlncnAtPmdyX2V4Zmxh
Z3MgPSBleGZsYWdzOworCQkJZ3JwLT5ncl9hbm9uID0gYW5vbjsKKwkJCWlmIChwYXNzbm8gIT0g
MSAmJiBkb19tb3VudChlcCwgZ3JwLCBleGZsYWdzLCAmYW5vbiwKKwkJCSAgICBkaXJwLCBkaXJw
bGVuLCAmZnNiKSkgewogCQkJCWdldGV4cF9lcnIoZXAsIHRncnAsIE5VTEwpOwogCQkJCWdvdG8g
bmV4dGxpbmU7CiAJCQl9CkBAIC0xNjY4LDE1ICsxNzEyLDI2IEBAIGdldF9leHBvcnRsaXN0X29u
ZSh2b2lkKQogCQkgKi8KIAkJaWYgKHY0cm9vdF9waGFzZSA+IDAgJiYgdjRyb290X3BoYXNlIDw9
IDIpIHsKIAkJCS8qCi0JCQkgKiBTaW5jZSB0aGVzZSBzdHJ1Y3R1cmVzIGFyZW4ndCB1c2VkIGJ5
IG1vdW50ZCwKKwkJCSAqIFRoZXNlIHN0cnVjdHVyZXMgYXJlIHVzZWQgZm9yIHRoZSAiLUkiIHJl
bG9hZCwKKwkJCSAqIHNvIHNhdmUgdGhlbSBmb3IgdGhhdCBjYXNlLiAgT3RoZXJ3aXNlLCBqdXN0
CiAJCQkgKiBmcmVlIHRoZW0gdXAgbm93LgogCQkJICovCi0JCQlpZiAoZXAgIT0gTlVMTCkKLQkJ
CQlmcmVlX2V4cChlcCk7Ci0JCQl3aGlsZSAodGdycCAhPSBOVUxMKSB7Ci0JCQkJZ3JwID0gdGdy
cDsKLQkJCQl0Z3JwID0gdGdycC0+Z3JfbmV4dDsKLQkJCQlmcmVlX2dycChncnApOworCQkJaWYg
KHBhc3NubyA9PSAxKSB7CisJCQkJaWYgKHY0cm9vdF9lcCAhPSBOVUxMKSB7CisJCQkJCWdldGV4
cF9lcnIoZXAsIHRncnAsCisJCQkJCSAgICAibXVsdGlwbGUgVjQgbGluZXMiKTsKKwkJCQkJZ290
byBuZXh0bGluZTsKKwkJCQl9CisJCQkJdjRyb290X2VwID0gZXA7CisJCQkJdjRyb290X2dycCA9
IHRncnA7CisJCQl9IGVsc2UgeworCQkJCWlmIChlcCAhPSBOVUxMKQorCQkJCQlmcmVlX2V4cChl
cCk7CisJCQkJd2hpbGUgKHRncnAgIT0gTlVMTCkgeworCQkJCQlncnAgPSB0Z3JwOworCQkJCQl0
Z3JwID0gdGdycC0+Z3JfbmV4dDsKKwkJCQkJZnJlZV9ncnAoZ3JwKTsKKwkJCQl9CiAJCQl9CiAJ
CQlnb3RvIG5leHRsaW5lOwogCQl9CkBAIC0xNjg1LDE3ICsxNzQwLDE3IEBAIGdldF9leHBvcnRs
aXN0X29uZSh2b2lkKQogCQkgKiBTdWNjZXNzLiBVcGRhdGUgdGhlIGRhdGEgc3RydWN0dXJlcy4K
IAkJICovCiAJCWlmIChoYXNfaG9zdCkgewotCQkJaGFuZ19kaXJwKGRpcmhlYWQsIHRncnAsIGVw
LCBvcHRfZmxhZ3MpOwotCQkJZ3JwLT5ncl9uZXh0ID0gZ3JwaGVhZDsKLQkJCWdycGhlYWQgPSB0
Z3JwOworCQkJaGFuZ19kaXJwKGRpcmhlYWQsIHRncnAsIGVwLCBvcHRfZmxhZ3MsICZhbm9uLCBl
eGZsYWdzKTsKKwkJCWdycC0+Z3JfbmV4dCA9IGVwLT5leF9ncnBoZWFkOworCQkJZXAtPmV4X2dy
cGhlYWQgPSB0Z3JwOwogCQl9IGVsc2UgewogCQkJaGFuZ19kaXJwKGRpcmhlYWQsIChzdHJ1Y3Qg
Z3JvdXBsaXN0ICopTlVMTCwgZXAsCi0JCQkJb3B0X2ZsYWdzKTsKKwkJCQlvcHRfZmxhZ3MsICZh
bm9uLCBleGZsYWdzKTsKIAkJCWZyZWVfZ3JwKGdycCk7CiAJCX0KIAkJZGlyaGVhZCA9IChzdHJ1
Y3QgZGlybGlzdCAqKU5VTEw7CiAJCWlmICgoZXAtPmV4X2ZsYWcgJiBFWF9MSU5LRUQpID09IDAp
IHsKLQkJCVNMSVNUX0lOU0VSVF9IRUFEKCZleHBoZWFkLCBlcCwgZW50cmllcyk7CisJCQlpbnNl
cnRfZXhwb3J0cyhlcCwgZXhwaGVhZCk7CiAKIAkJCWVwLT5leF9mbGFnIHw9IEVYX0xJTktFRDsK
IAkJfQpAQCAtMTcxMiw0NSArMTc2Nyw0NiBAQCBuZXh0bGluZToKICAqIEdldCB0aGUgZXhwb3J0
IGxpc3QgZnJvbSBhbGwgc3BlY2lmaWVkIGZpbGVzCiAgKi8KIHN0YXRpYyB2b2lkCi1nZXRfZXhw
b3J0bGlzdCh2b2lkKQorZ2V0X2V4cG9ydGxpc3QoaW50IHBhc3NubykKIHsKLQlzdHJ1Y3QgZXhw
b3J0bGlzdCAqZXAsICplcDI7Ci0Jc3RydWN0IGdyb3VwbGlzdCAqZ3JwLCAqdGdycDsKIAlzdHJ1
Y3QgZXhwb3J0X2FyZ3MgZXhwb3J0OwogCXN0cnVjdCBpb3ZlYyAqaW92OwogCXN0cnVjdCBzdGF0
ZnMgKmZzcCwgKm1udGJ1ZnA7Ci0Jc3RydWN0IHh2ZnNjb25mIHZmYzsKIAljaGFyIGVycm1zZ1sy
NTVdOwogCWludCBudW0sIGk7CiAJaW50IGlvdmxlbjsKLQlpbnQgZG9uZTsKIAlzdHJ1Y3QgbmZz
ZXhfYXJncyBlYXJnczsKIAotCWlmIChzdXNwZW5kX25mc2QgIT0gMCkKLQkJKHZvaWQpbmZzc3Zj
KE5GU1NWQ19TVVNQRU5ETkZTRCwgTlVMTCk7CitzeXNsb2coTE9HX0VSUiwgInBhc3Nubz0lZCIs
IHBhc3Nubyk7CiAJdjRyb290X2RpcnBhdGhbMF0gPSAnXDAnOworCWZyZWVfdjRyb290ZXhwKCk7
CisJaWYgKHBhc3NubyA9PSAxKSB7CisJCS8qCisJCSAqIFNhdmUgdGhlIGN1cnJlbnQgbGlzdHMg
YXMgb2xkIG9uZXMsIHNvIHRoYXQgdGhlIG5ldyBsaXN0cworCQkgKiBjYW4gYmUgY29tcGFyZWQg
d2l0aCB0aGUgb2xkIG9uZXMgaW4gdGhlIDJuZCBwYXNzLgorCQkgKi8KKwkJZm9yIChpID0gMDsg
aSA8IEVYUEhBU0hTSVpFOyBpKyspIHsKKwkJCVNMSVNUX0ZJUlNUKCZvbGRleHBoZWFkW2ldKSA9
IFNMSVNUX0ZJUlNUKCZleHBoZWFkW2ldKTsKKwkJCVNMSVNUX0lOSVQoJmV4cGhlYWRbaV0pOwor
CQl9CisKKwkJLyogUmVhZCB0aGUgZXhwb3J0IGZpbGUocykgYW5kIHByb2Nlc3MgdGhlbSAqLwor
CQlyZWFkX2V4cG9ydGZpbGUocGFzc25vKTsKK3N5c2xvZyhMT0dfRVJSLCAicmVhZGV4cDEiKTsK
Kwl9IGVsc2UgeworCQkvKiBKdXN0IG1ha2UgdGhlIG9sZCBsaXN0cyBlbXB0eS4gKi8KKwkJZm9y
IChpID0gMDsgaSA8IEVYUEhBU0hTSVpFOyBpKyspCisJCQlTTElTVF9JTklUKCZvbGRleHBoZWFk
W2ldKTsKKwl9CisKIAliemVybygmZXhwb3J0LCBzaXplb2YoZXhwb3J0KSk7CiAJZXhwb3J0LmV4
X2ZsYWdzID0gTU5UX0RFTEVYUE9SVDsKIAlpb3YgPSBOVUxMOwogCWlvdmxlbiA9IDA7CiAJYnpl
cm8oZXJybXNnLCBzaXplb2YoZXJybXNnKSk7CiAKLQkvKgotCSAqIEZpcnN0LCBnZXQgcmlkIG9m
IHRoZSBvbGQgbGlzdAotCSAqLwotCVNMSVNUX0ZPUkVBQ0hfU0FGRShlcCwgJmV4cGhlYWQsIGVu
dHJpZXMsIGVwMikgewotCQlTTElTVF9SRU1PVkUoJmV4cGhlYWQsIGVwLCBleHBvcnRsaXN0LCBl
bnRyaWVzKTsKLQkJZnJlZV9leHAoZXApOwotCX0KLQotCWdycCA9IGdycGhlYWQ7Ci0Jd2hpbGUg
KGdycCkgewotCQl0Z3JwID0gZ3JwOwotCQlncnAgPSBncnAtPmdyX25leHQ7Ci0JCWZyZWVfZ3Jw
KHRncnApOwotCX0KLQlncnBoZWFkID0gKHN0cnVjdCBncm91cGxpc3QgKilOVUxMOwotCisJaWYg
KHN1c3BlbmRfbmZzZCAhPSAwKQorCQkodm9pZCluZnNzdmMoTkZTU1ZDX1NVU1BFTkRORlNELCBO
VUxMKTsKIAkvKgogCSAqIGFuZCB0aGUgb2xkIFY0IHJvb3QgZGlyLgogCSAqLwpAQCAtMTc2NSw2
MiArMTgyMSw1MiBAQCBnZXRfZXhwb3J0bGlzdCh2b2lkKQogCSAqLwogCWhhc19wdWJsaWNmaCA9
IDA7CiAKKwlidWlsZF9pb3ZlYygmaW92LCAmaW92bGVuLCAiZnN0eXBlIiwgTlVMTCwgMCk7CisJ
YnVpbGRfaW92ZWMoJmlvdiwgJmlvdmxlbiwgImZzcGF0aCIsIE5VTEwsIDApOworCWJ1aWxkX2lv
dmVjKCZpb3YsICZpb3ZsZW4sICJmcm9tIiwgTlVMTCwgMCk7CisJYnVpbGRfaW92ZWMoJmlvdiwg
JmlvdmxlbiwgInVwZGF0ZSIsIE5VTEwsIDApOworCWJ1aWxkX2lvdmVjKCZpb3YsICZpb3ZsZW4s
ICJleHBvcnQiLCAmZXhwb3J0LAorCSAgICBzaXplb2YoZXhwb3J0KSk7CisJYnVpbGRfaW92ZWMo
JmlvdiwgJmlvdmxlbiwgImVycm1zZyIsIGVycm1zZywKKwkgICAgc2l6ZW9mKGVycm1zZykpOwor
CiAJLyoKLQkgKiBBbmQgZGVsZXRlIGV4cG9ydHMgdGhhdCBhcmUgaW4gdGhlIGtlcm5lbCBmb3Ig
YWxsIGxvY2FsCi0JICogZmlsZXN5c3RlbXMuCi0JICogWFhYOiBTaG91bGQga25vdyBob3cgdG8g
aGFuZGxlIGFsbCBsb2NhbCBleHBvcnRhYmxlIGZpbGVzeXN0ZW1zLgorCSAqIEZvciBwYXNzbm8g
PT0gMSwgY29tcGFyZSB0aGUgb2xkIGFuZCBuZXcgbGlzdHMgdXBkYXRpbmcgdGhlIGtlcm5lbAor
CSAqIGV4cG9ydHMgZm9yIGFueSBjYXNlcyB0aGF0IGhhdmUgY2hhbmdlZC4KKwkgKiBUaGlzIGNh
bGwgaXMgZG9pbmcgdGhlIHNlY29uZCBwYXNzIHRocm91Z2ggdGhlIGxpc3RzLgorCSAqIElmIGl0
IGZhaWxzLCBmYWxsIGJhY2sgb24gdGhlIGJ1bGsgcmVsb2FkLgogCSAqLwotCW51bSA9IGdldG1u
dGluZm8oJm1udGJ1ZnAsIE1OVF9OT1dBSVQpOwotCi0JaWYgKG51bSA+IDApIHsKLQkJYnVpbGRf
aW92ZWMoJmlvdiwgJmlvdmxlbiwgImZzdHlwZSIsIE5VTEwsIDApOwotCQlidWlsZF9pb3ZlYygm
aW92LCAmaW92bGVuLCAiZnNwYXRoIiwgTlVMTCwgMCk7Ci0JCWJ1aWxkX2lvdmVjKCZpb3YsICZp
b3ZsZW4sICJmcm9tIiwgTlVMTCwgMCk7Ci0JCWJ1aWxkX2lvdmVjKCZpb3YsICZpb3ZsZW4sICJ1
cGRhdGUiLCBOVUxMLCAwKTsKLQkJYnVpbGRfaW92ZWMoJmlvdiwgJmlvdmxlbiwgImV4cG9ydCIs
ICZleHBvcnQsIHNpemVvZihleHBvcnQpKTsKLQkJYnVpbGRfaW92ZWMoJmlvdiwgJmlvdmxlbiwg
ImVycm1zZyIsIGVycm1zZywgc2l6ZW9mKGVycm1zZykpOwotCX0KLQotCWZvciAoaSA9IDA7IGkg
PCBudW07IGkrKykgewotCQlmc3AgPSAmbW50YnVmcFtpXTsKLQkJaWYgKGdldHZmc2J5bmFtZShm
c3AtPmZfZnN0eXBlbmFtZSwgJnZmYykgIT0gMCkgewotCQkJc3lzbG9nKExPR19FUlIsICJnZXR2
ZnNieW5hbWUoKSBmYWlsZWQgZm9yICVzIiwKLQkJCSAgICBmc3AtPmZfZnN0eXBlbmFtZSk7Ci0J
CQljb250aW51ZTsKLQkJfQotCisJaWYgKHBhc3NubyA9PSAxICYmIGNvbXBhcmVfbm1vdW50X2V4
cG9ydGxpc3QoaW92LCBpb3ZsZW4sIGVycm1zZykgPT0KKwkgICAgMCkgeworc3lzbG9nKExPR19F
UlIsICJjb21wYXJlb2siKTsKKwkJLyogRnJlZSB1cCB0aGUgb2xkIGxpc3RzLiAqLworCQlmcmVl
X2V4cG9ydHMob2xkZXhwaGVhZCk7CisJfSBlbHNlIHsKK3N5c2xvZyhMT0dfRVJSLCAiZG9pbiBw
YXNzbm89MCIpOwogCQkvKgotCQkgKiBXZSBkbyBub3QgbmVlZCB0byBkZWxldGUgImV4cG9ydCIg
ZmxhZyBmcm9tCi0JCSAqIGZpbGVzeXN0ZW1zIHRoYXQgZG8gbm90IGhhdmUgaXQgc2V0LgorCQkg
KiBGaXJzdCwgZ2V0IHJpZCBvZiB0aGUgb2xkIGxpc3RzLgogCQkgKi8KLQkJaWYgKCEoZnNwLT5m
X2ZsYWdzICYgTU5UX0VYUE9SVEVEKSkKLQkJICAgIGNvbnRpbnVlOworCQlmcmVlX2V4cG9ydHMo
ZXhwaGVhZCk7CisJCWZyZWVfZXhwb3J0cyhvbGRleHBoZWFkKTsKKwkJZnJlZV92NHJvb3RleHAo
KTsKKwogCQkvKgotCQkgKiBEbyBub3QgZGVsZXRlIGV4cG9ydCBmb3IgbmV0d29yayBmaWxlc3lz
dGVtIGJ5Ci0JCSAqIHBhc3NpbmcgImV4cG9ydCIgYXJnIHRvIG5tb3VudCgpLgotCQkgKiBJdCBv
bmx5IG1ha2VzIHNlbnNlIHRvIGRvIHRoaXMgZm9yIGxvY2FsIGZpbGVzeXN0ZW1zLgorCQkgKiBB
bmQgZGVsZXRlIGV4cG9ydHMgdGhhdCBhcmUgaW4gdGhlIGtlcm5lbCBmb3IgYWxsIGxvY2FsCisJ
CSAqIGZpbGVzeXN0ZW1zLgorCQkgKiBYWFg6IFNob3VsZCBrbm93IGhvdyB0byBoYW5kbGUgYWxs
IGxvY2FsIGV4cG9ydGFibGUKKwkJICogZmlsZXN5c3RlbXMuCiAJCSAqLwotCQlpZiAodmZjLnZm
Y19mbGFncyAmIFZGQ0ZfTkVUV09SSykKLQkJCWNvbnRpbnVlOwotCi0JCWlvdlsxXS5pb3ZfYmFz
ZSA9IGZzcC0+Zl9mc3R5cGVuYW1lOwotCQlpb3ZbMV0uaW92X2xlbiA9IHN0cmxlbihmc3AtPmZf
ZnN0eXBlbmFtZSkgKyAxOwotCQlpb3ZbM10uaW92X2Jhc2UgPSBmc3AtPmZfbW50b25uYW1lOwot
CQlpb3ZbM10uaW92X2xlbiA9IHN0cmxlbihmc3AtPmZfbW50b25uYW1lKSArIDE7Ci0JCWlvdls1
XS5pb3ZfYmFzZSA9IGZzcC0+Zl9tbnRmcm9tbmFtZTsKLQkJaW92WzVdLmlvdl9sZW4gPSBzdHJs
ZW4oZnNwLT5mX21udGZyb21uYW1lKSArIDE7Ci0JCWVycm1zZ1swXSA9ICdcMCc7Ci0KLQkJLyoK
LQkJICogRVhERVYgaXMgcmV0dXJuZWQgd2hlbiBwYXRoIGV4aXN0cyBidXQgaXMgbm90IGEKLQkJ
ICogbW91bnQgcG9pbnQuICBNYXkgaGFwcGVucyBpZiByYWNlZCB3aXRoIHVubW91bnQuCi0JCSAq
LwotCQlpZiAobm1vdW50KGlvdiwgaW92bGVuLCBmc3AtPmZfZmxhZ3MpIDwgMCAmJgotCQkgICAg
ZXJybm8gIT0gRU5PRU5UICYmIGVycm5vICE9IEVOT1RTVVAgJiYgZXJybm8gIT0gRVhERVYpIHsK
LQkJCXN5c2xvZyhMT0dfRVJSLAotCQkJICAgICJjYW4ndCBkZWxldGUgZXhwb3J0cyBmb3IgJXM6
ICVtICVzIiwKLQkJCSAgICBmc3AtPmZfbW50b25uYW1lLCBlcnJtc2cpOworCQludW0gPSBnZXRt
bnRpbmZvKCZtbnRidWZwLCBNTlRfTk9XQUlUKTsKKwkKKwkJZm9yIChpID0gMDsgaSA8IG51bTsg
aSsrKSB7CisJCQlmc3AgPSAmbW50YnVmcFtpXTsKKwkJCWRlbGV0ZV9leHBvcnQoaW92LCBpb3Zs
ZW4sIGZzcCwgZXJybXNnKTsKIAkJfQorCisKKwkJLyogUmVhZCB0aGUgZXhwb3J0IGZpbGUocykg
YW5kIHByb2Nlc3MgdGhlbSAqLworCQlyZWFkX2V4cG9ydGZpbGUoMCk7CitzeXNsb2coTE9HX0VS
UiwgInJlYWRleHAwIik7CiAJfQogCiAJaWYgKGlvdiAhPSBOVUxMKSB7CkBAIC0xODM4LDYgKzE4
ODQsMjUgQEAgZ2V0X2V4cG9ydGxpc3Qodm9pZCkKIAl9CiAKIAkvKgorCSAqIElmIHRoZXJlIHdh
cyBubyBwdWJsaWMgZmgsIGNsZWFyIGFueSBwcmV2aW91cyBvbmUgc2V0LgorCSAqLworCWlmICho
YXNfcHVibGljZmggPT0gMCkKKwkJKHZvaWQpIG5mc3N2YyhORlNTVkNfTk9QVUJMSUNGSCwgTlVM
TCk7CisKKwkvKiBSZXN1bWUgdGhlIG5mc2QuIElmIHRoZXkgd2VyZW4ndCBzdXNwZW5kZWQsIHRo
aXMgaXMgaGFybWxlc3MuICovCisJKHZvaWQpbmZzc3ZjKE5GU1NWQ19SRVNVTUVORlNELCBOVUxM
KTsKK3N5c2xvZyhMT0dfRVJSLCAiZW8gZ2V0X2V4cG9ydGxpc3QiKTsKK30KKworLyoKKyAqIFJl
YWQgdGhlIGV4cG9ydHMgZmlsZShzKSBhbmQgY2FsbCBnZXRfZXhwb3J0bGlzdF9vbmUoKSBmb3Ig
ZWFjaCBsaW5lLgorICovCitzdGF0aWMgdm9pZAorcmVhZF9leHBvcnRmaWxlKGludCBwYXNzbm8p
Cit7CisJaW50IGRvbmUsIGk7CisKKwkvKgogCSAqIFJlYWQgaW4gdGhlIGV4cG9ydHMgZmlsZSBh
bmQgYnVpbGQgdGhlIGxpc3QsIGNhbGxpbmcKIAkgKiBubW91bnQoKSBhcyB3ZSBnbyBhbG9uZyB0
byBwdXNoIHRoZSBleHBvcnQgcnVsZXMgaW50byB0aGUga2VybmVsLgogCSAqLwpAQCAtMTg0OSw3
ICsxOTE0LDcgQEAgZ2V0X2V4cG9ydGxpc3Qodm9pZCkKIAkJCXN5c2xvZyhMT0dfV0FSTklORywg
ImNhbid0IG9wZW4gJXMiLCBleG5hbWVzW2ldKTsKIAkJCWNvbnRpbnVlOwogCQl9Ci0JCWdldF9l
eHBvcnRsaXN0X29uZSgpOworCQlnZXRfZXhwb3J0bGlzdF9vbmUocGFzc25vKTsKIAkJZmNsb3Nl
KGV4cF9maWxlKTsKIAkJZG9uZSsrOwogCX0KQEAgLTE4NTcsMTUgKzE5MjIsMjgwIEBAIGdldF9l
eHBvcnRsaXN0KHZvaWQpCiAJCXN5c2xvZyhMT0dfRVJSLCAiY2FuJ3Qgb3BlbiBhbnkgZXhwb3J0
cyBmaWxlIik7CiAJCWV4aXQoMik7CiAJfQorfQorCisvKgorICogQ29tcGFyZSB0aGUgZXhwb3J0
IGxpc3RzIGFnYWluc3QgdGhlIG9sZCBvbmVzIGFuZCBkbyBubW91bnQoKSBvcGVyYXRpb25zCisg
KiBmb3IgYW55IGNhc2VzIHRoYXQgaGF2ZSBjaGFuZ2VkLiAgVGhpcyBhdm9pZHMgZG9pbmcgbm1v
dW50KCkgZm9yIGVudHJpZXMKKyAqIHRoYXQgaGF2ZSBub3QgY2hhbmdlZC4KKyAqIFJldHVybiAw
IHVwb24gc3VjY2VzcywgMSBvdGhlcndpc2UuCisgKi8KK3N0YXRpYyBpbnQKK2NvbXBhcmVfbm1v
dW50X2V4cG9ydGxpc3Qoc3RydWN0IGlvdmVjICppb3YsIGludCBpb3ZsZW4sIGNoYXIgKmVycm1z
ZykKK3sKKwlzdHJ1Y3QgZXhwb3J0bGlzdCAqZXAsICpvZXA7CisJc3RydWN0IGdyb3VwbGlzdCAq
Z3JwOworCXN0cnVjdCBzdGF0ZnMgZnMsIG9mczsKKwlpbnQgaSwgcmV0OwogCiAJLyoKLQkgKiBJ
ZiB0aGVyZSB3YXMgbm8gcHVibGljIGZoLCBjbGVhciBhbnkgcHJldmlvdXMgb25lIHNldC4KKwkg
KiBMb29wIHRocm91Z2ggdGhlIGN1cnJlbnQgbGlzdCBhbmQgbG9vayBmb3IgYW4gZW50cnkgaW4g
dGhlIG9sZAorCSAqIGxpc3QuCisJICogSWYgZm91bmQsIGNoZWNrIHRvIHNlZSBpZiBpdCB0aGUg
c2FtZS4KKwkgKiAgICAgICAgSWYgaXQgaXMgbm90IHRoZSBzYW1lLCBkZWxldGUgYW5kIHJlLWV4
cG9ydC4KKwkgKiAgICAgICAgVGhlbiBtYXJrIGl0IGRvbmUgb24gdGhlIG9sZCBsaXN0LgorCSAq
IGVsc2UgKG5vdCBmb3VuZCkKKwkgKiAgICAgICAgZXhwb3J0IGl0LgorCSAqIEFueSBlbnRyaWVz
IGxlZnQgaW4gdGhlIG9sZCBsaXN0IGFmdGVyIHByb2Nlc3NpbmcgbXVzdCBoYXZlIHRoZWlyCisJ
ICogZXhwb3J0cyBkZWxldGVkLgogCSAqLwotCWlmIChoYXNfcHVibGljZmggPT0gMCkKLQkJKHZv
aWQpIG5mc3N2YyhORlNTVkNfTk9QVUJMSUNGSCwgTlVMTCk7CisJZm9yIChpID0gMDsgaSA8IEVY
UEhBU0hTSVpFOyBpKyspCisJCVNMSVNUX0ZPUkVBQ0goZXAsICZleHBoZWFkW2ldLCBlbnRyaWVz
KSB7CitzeXNsb2coTE9HX0VSUiwgImZvcmVhY2ggZXAiKTsKKwkJCWlmIChzdGF0ZnMoZXAtPmV4
X2ZzZGlyLCAmZnMpIDwgMCkKKwkJCQlyZXR1cm4gKDEpOworc3lzbG9nKExPR19FUlIsICJmc3Yw
PSVkIGZzdjE9JWQiLCBmcy5mX2ZzaWQudmFsWzBdLCBmcy5mX2ZzaWQudmFsWzFdKTsKKwkJCW9l
cCA9IGV4X3NlYXJjaCgmZXAtPmV4X2ZzLCBvbGRleHBoZWFkKTsKKwkJCWlmIChvZXAgIT0gTlVM
TCkgeworCQkJCS8qCisJCQkJICogU3RhdGZzIGJvdGggZmlsZSBzeXN0ZW1zIGFuZCBzYW5pdHkg
Y2hlY2sKKwkJCQkgKiB0aGF0IHRoZXkgc3RpbGwgcmVmZXIgdG8gdGhlIHNhbWUgZmlsZQorCQkJ
CSAqIHN5c3RlbS4KKwkJCQkgKiBJZiBub3QsIHJldHVybiAxIHNvIHRoYXQgdGhlIHJlbG9hZCBv
ZiB0aGUKKwkJCQkgKiBleHBvcnRzIHdpbGwgYmUgZG9uZSBpbiBidWxrLCB0aGUKKwkJCQkgKiBw
YXNzbm8gPT0gMCB3YXkuCisJCQkJICovCitzeXNsb2coTE9HX0VSUiwgImZuZCBleCIpOworCQkJ
CWlmIChzdGF0ZnMob2VwLT5leF9mc2RpciwgJm9mcykgPCAwIHx8CisJCQkJICAgIGVwLT5leF9m
cy52YWxbMF0gIT0gZnMuZl9mc2lkLnZhbFswXSB8fAorCQkJCSAgICBlcC0+ZXhfZnMudmFsWzFd
ICE9IGZzLmZfZnNpZC52YWxbMV0gfHwKKwkJCQkgICAgZnMuZl9mc2lkLnZhbFswXSAhPSBvZnMu
Zl9mc2lkLnZhbFswXSB8fAorCQkJCSAgICBmcy5mX2ZzaWQudmFsWzFdICE9IG9mcy5mX2ZzaWQu
dmFsWzFdKQorCQkJCQlyZXR1cm4gKDEpOworCQkJCS8qCisJCQkJICogVGVzdCB0byBzZWUgaWYg
dGhlIGVudHJ5IGlzIHRoZSBzYW1lLgorCQkJCSAqIElmIG5vdCB0aGUgc2FtZSBkZWxldGUgZXhw
b3J0cyBhbmQKKwkJCQkgKiByZS1leHBvcnQuCisJCQkJICovCitzeXNsb2coTE9HX0VSUiwgImF0
IGNvbXBhcmUiKTsKKwkJCQlpZiAoY29tcGFyZV9leHBvcnQoZXAsIG9lcCkgIT0gMCkgeworCQkJ
CQlkZWxldGVfZXhwb3J0KGlvdiwgaW92bGVuLCAmZnMsIGVycm1zZyk7CisJCQkJCXJldCA9IGRv
X2V4cG9ydF9tb3VudChlcCwgJmZzKTsKKwkJCQkJaWYgKHJldCAhPSAwKQorCQkJCQkJcmV0dXJu
IChyZXQpOworCQkJCX0KKwkJCQlvZXAtPmV4X2ZsYWcgfD0gRVhfRE9ORTsKK3N5c2xvZyhMT0df
RVJSLCAiZXhkb25lIik7CisJCQl9IGVsc2Ugeworc3lzbG9nKExPR19FUlIsICJub3QgZm5kIHNv
IGV4Iik7CisJCQkJLyogTm90IGZvdW5kLCBzbyBkbyBleHBvcnQuICovCisJCQkJcmV0ID0gZG9f
ZXhwb3J0X21vdW50KGVwLCAmZnMpOworCQkJCWlmIChyZXQgIT0gMCkKKwkJCQkJcmV0dXJuIChy
ZXQpOworCQkJfQorCQl9CiAKLQkvKiBSZXN1bWUgdGhlIG5mc2QuIElmIHRoZXkgd2VyZW4ndCBz
dXNwZW5kZWQsIHRoaXMgaXMgaGFybWxlc3MuICovCi0JKHZvaWQpbmZzc3ZjKE5GU1NWQ19SRVNV
TUVORlNELCBOVUxMKTsKKwkvKiBEZWxldGUgZXhwb3J0cyBub3QgZG9uZS4gKi8KKwlmb3IgKGkg
PSAwOyBpIDwgRVhQSEFTSFNJWkU7IGkrKykKKwkJU0xJU1RfRk9SRUFDSChvZXAsICZvbGRleHBo
ZWFkW2ldLCBlbnRyaWVzKSB7CisJCQlpZiAoKG9lcC0+ZXhfZmxhZyAmIEVYX0RPTkUpID09IDAp
IHsKK3N5c2xvZyhMT0dfRVJSLCAibm90IGRvbmUgZGVsZXRlIik7CisJCQkJaWYgKHN0YXRmcyhv
ZXAtPmV4X2ZzZGlyLCAmb2ZzKSA+PSAwICYmCisJCQkJICAgIG9lcC0+ZXhfZnMudmFsWzBdID09
IG9mcy5mX2ZzaWQudmFsWzBdICYmCisJCQkJICAgIG9lcC0+ZXhfZnMudmFsWzFdID09IG9mcy5m
X2ZzaWQudmFsWzFdKQorc3lzbG9nKExPR19FUlIsICJkbyBkZWxldGUiKTsKKwkJCQkJZGVsZXRl
X2V4cG9ydChpb3YsIGlvdmxlbiwgJm9mcywgZXJybXNnKTsKKwkJCX0KKwkJfQorCisJLyogRG8g
dGhlIFY0IHJvb3QgZXhwb3J0cywgYXMgcmVxdWlyZWQuICovCisJZ3JwID0gdjRyb290X2dycDsK
Kwl2NHJvb3RfcGhhc2UgPSAyOworCXdoaWxlICh2NHJvb3RfZXAgIT0gTlVMTCAmJiBncnAgIT0g
TlVMTCkgeworc3lzbG9nKExPR19FUlIsICJ2NGV4IHBhdGg9JXMgZ3JfdHlwZT0weCV4IGdyX2V4
ZmxhZ3M9MHgleCIsIHY0cm9vdF9kaXJwYXRoLCBncnAtPmdyX3R5cGUsIGdycC0+Z3JfZXhmbGFn
cyk7CitzeXNsb2coTE9HX0VSUiwgInY0cm9vdGQ9JXMiLCB2NHJvb3RfZGlycGF0aCk7CisJCXJl
dCA9IGRvX21vdW50KHY0cm9vdF9lcCwgZ3JwLCBncnAtPmdyX2V4ZmxhZ3MsICZncnAtPmdyX2Fu
b24sCisJCSAgICB2NHJvb3RfZGlycGF0aCwgc3RybGVuKHY0cm9vdF9kaXJwYXRoKSwgJmZzKTsK
KwkJaWYgKHJldCAhPSAwKSB7CisJCQl2NHJvb3RfcGhhc2UgPSAwOworCQkJcmV0dXJuIChyZXQp
OworCQl9CisJCWdycCA9IGdycC0+Z3JfbmV4dDsKKwl9CisJdjRyb290X3BoYXNlID0gMDsKKwlm
cmVlX3Y0cm9vdGV4cCgpOworCXJldHVybiAoMCk7Cit9CisKKy8qCisgKiBDb21wYXJlIG9sZCBh
bmQgY3VycmVudCBleHBvcnRsaXN0IGVudHJpZXMgZm9yIHRoZSBmc2lkIGFuZCByZXR1cm4gMAor
ICogaWYgdGhleSBhcmUgdGhlIHNhbWUsIDEgb3RoZXJ3aXNlLgorICovCitzdGF0aWMgaW50Citj
b21wYXJlX2V4cG9ydChzdHJ1Y3QgZXhwb3J0bGlzdCAqZXAsIHN0cnVjdCBleHBvcnRsaXN0ICpv
ZXApCit7CisJc3RydWN0IGdyb3VwbGlzdCAqZ3JwLCAqb2dycDsKKworCWlmIChzdHJjbXAoZXAt
PmV4X2ZzZGlyLCBvZXAtPmV4X2ZzZGlyKSAhPSAwKQorCQlyZXR1cm4gKDEpOworCWlmICgoZXAt
PmV4X2RlZmRpciAhPSBOVUxMICYmIG9lcC0+ZXhfZGVmZGlyID09IE5VTEwpIHx8CisJICAgIChl
cC0+ZXhfZGVmZGlyID09IE5VTEwgJiYgb2VwLT5leF9kZWZkaXIgIT0gTlVMTCkpCisJCXJldHVy
biAoMSk7CisJaWYgKGVwLT5leF9kZWZkaXIgIT0gTlVMTCkgeworCQlpZiAoKGVwLT5leF9kZWZk
aXItPmRwX2ZsYWcgJiBEUF9ERUZTRVQpICE9IDApIHsKKwkJCWlmICgob2VwLT5leF9kZWZkaXIt
PmRwX2ZsYWcgJiBEUF9ERUZTRVQpID09IDApCisJCQkJcmV0dXJuICgxKTsKKwkJCWlmIChlcC0+
ZXhfZGVmbnVtc2VjZmxhdm9ycyAhPQorCQkJICAgIG9lcC0+ZXhfZGVmbnVtc2VjZmxhdm9ycyB8
fAorCQkJICAgIGVwLT5leF9kZWZleGZsYWdzICE9IG9lcC0+ZXhfZGVmZXhmbGFncyB8fAorCQkJ
ICAgIGNvbXBhcmVfY3JlZCgmZXAtPmV4X2RlZmFub24sICZvZXAtPmV4X2RlZmFub24pICE9CisJ
CQkgICAgMCB8fCBjb21wYXJlX3NlY2ZsYXZvcihlcC0+ZXhfZGVmc2VjZmxhdm9ycywKKwkJCSAg
ICBvZXAtPmV4X2RlZnNlY2ZsYXZvcnMsIGVwLT5leF9kZWZudW1zZWNmbGF2b3JzKSAhPQorCQkJ
ICAgIDApCisJCQkJcmV0dXJuICgxKTsKKwkJfQorCX0KKworCS8qIE5vdywgY2hlY2sgYWxsIHRo
ZSBncm91cHMuICovCisJZm9yIChvZ3JwID0gb2VwLT5leF9ncnBoZWFkOyBvZ3JwICE9IE5VTEw7
IG9ncnAgPSBvZ3JwLT5ncl9uZXh0KQorCQlvZ3JwLT5ncl9mbGFnID0gMDsKKwlmb3IgKGdycCA9
IGVwLT5leF9ncnBoZWFkOyBncnAgIT0gTlVMTDsgZ3JwID0gZ3JwLT5ncl9uZXh0KSB7CisJCWZv
ciAob2dycCA9IG9lcC0+ZXhfZ3JwaGVhZDsgb2dycCAhPSBOVUxMOyBvZ3JwID0KKwkJICAgIG9n
cnAtPmdyX25leHQpCisJCQlpZiAoKG9ncnAtPmdyX2ZsYWcgJiBHUl9GTkQpID09IDAgJiYKKwkJ
CSAgICBncnAtPmdyX251bXNlY2ZsYXZvcnMgPT0gb2dycC0+Z3JfbnVtc2VjZmxhdm9ycyAmJgor
CQkJICAgIGdycC0+Z3JfZXhmbGFncyA9PSBvZ3JwLT5ncl9leGZsYWdzICYmCisJCQkgICAgY29t
cGFyZV9jcmVkKCZncnAtPmdyX2Fub24sICZvZ3JwLT5ncl9hbm9uKSA9PSAwICYmCisJCQkgICAg
Y29tcGFyZV9zZWNmbGF2b3IoZ3JwLT5ncl9zZWNmbGF2b3JzLAorCQkJICAgIG9ncnAtPmdyX3Nl
Y2ZsYXZvcnMsIGdycC0+Z3JfbnVtc2VjZmxhdm9ycykgPT0gMCkKKwkJCQlicmVhazsKKwkJaWYg
KG9ncnAgIT0gTlVMTCkKKwkJCW9ncnAtPmdyX2ZsYWcgfD0gR1JfRk5EOworCQllbHNlCisJCQly
ZXR1cm4gKDEpOworCX0KKwlmb3IgKG9ncnAgPSBvZXAtPmV4X2dycGhlYWQ7IG9ncnAgIT0gTlVM
TDsgb2dycCA9IG9ncnAtPmdyX25leHQpCisJCWlmICgob2dycC0+Z3JfZmxhZyAmIEdSX0ZORCkg
PT0gMCkKKwkJCXJldHVybiAoMSk7CisJcmV0dXJuICgwKTsKK30KKworLyoKKyAqIENvbXBhcmUg
dG8gc3RydWN0IHh1Y3JlZCdzLiAgUmV0dXJuIDAgaWYgdGhlIHNhbWUgYW5kIDEgb3RoZXJ3aXNl
LgorICogVGhpcyBhbGdvcml0aG0gaXMgTyhOKioyKSBidXQgZm9ydHVuYXRlbHkgTiBpcyBhbHdh
eXMgc21hbGwuCisgKi8KK3N0YXRpYyBpbnQKK2NvbXBhcmVfY3JlZChzdHJ1Y3QgeHVjcmVkICpj
cjAsIHN0cnVjdCB4dWNyZWQgKmNyMSkKK3sKKwlpbnQgaSwgajsKKworCWlmIChjcjAtPmNyX3Vp
ZCAhPSBjcjEtPmNyX3VpZCB8fCBjcjAtPmNyX25ncm91cHMgIT0gY3IxLT5jcl9uZ3JvdXBzKQor
CQlyZXR1cm4gKDEpOworCWZvciAoaSA9IDA7IGkgPCBjcjAtPmNyX25ncm91cHM7IGkrKykgewor
CQlmb3IgKGogPSAwOyBqIDwgY3IwLT5jcl9uZ3JvdXBzOyBqKyspCisJCQlpZiAoY3IwLT5jcl9n
cm91cHNbaV0gPT0gY3IxLT5jcl9ncm91cHNbal0pCisJCQkJYnJlYWs7CisJCWlmIChqID09IGNy
MC0+Y3Jfbmdyb3VwcykKKwkJCXJldHVybiAoMSk7CisJfQorCXJldHVybiAoMCk7Cit9CisKKy8q
CisgKiBDb21wYXJlIHR3byBsaXN0cyBvZiBzZWN1cml0eSBmbGF2b3JzLiAgUmV0dXJuIDAgaWYg
dGhlIHNhbWUgYW5kIDEgb3RoZXJ3aXNlLgorICogVGhpcyBhbGdvcml0aG0gaXMgTyhOKioyKSBi
dXQgZm9ydHVuYXRlbHkgTiBpcyBhbHdheXMgc21hbGwuCisgKi8KK3N0YXRpYyBpbnQKK2NvbXBh
cmVfc2VjZmxhdm9yKGludCAqc2VjMSwgaW50ICpzZWMyLCBpbnQgbnNlYykKK3sKKwlpbnQgaSwg
ajsKKworCWZvciAoaSA9IDA7IGkgPCBuc2VjOyBpKyspIHsKKwkJZm9yIChqID0gMDsgaiA8IG5z
ZWM7IGorKykKKwkJCWlmIChzZWMxW2ldID09IHNlYzJbal0pCisJCQkJYnJlYWs7CisJCWlmIChq
ID09IG5zZWMpCisJCQlyZXR1cm4gKDEpOworCX0KKwlyZXR1cm4gKDApOworfQorCisvKgorICog
RGVsZXRlIGFuIGV4cG9ydHMgZW50cnkuCisgKi8KK3N0YXRpYyB2b2lkCitkZWxldGVfZXhwb3J0
KHN0cnVjdCBpb3ZlYyAqaW92LCBpbnQgaW92bGVuLCBzdHJ1Y3Qgc3RhdGZzICpmc3AsIGNoYXIg
KmVycm1zZykKK3sKKwlzdHJ1Y3QgeHZmc2NvbmYgdmZjOworCisJaWYgKGdldHZmc2J5bmFtZShm
c3AtPmZfZnN0eXBlbmFtZSwgJnZmYykgIT0gMCkgeworCQlzeXNsb2coTE9HX0VSUiwgImdldHZm
c2J5bmFtZSgpIGZhaWxlZCBmb3IgJXMiLAorCQkgICAgZnNwLT5mX2ZzdHlwZW5hbWUpOworCQly
ZXR1cm47CisJfQorCQorCS8qCisJICogV2UgZG8gbm90IG5lZWQgdG8gZGVsZXRlICJleHBvcnQi
IGZsYWcgZnJvbQorCSAqIGZpbGVzeXN0ZW1zIHRoYXQgZG8gbm90IGhhdmUgaXQgc2V0LgorCSAq
LworCWlmICghKGZzcC0+Zl9mbGFncyAmIE1OVF9FWFBPUlRFRCkpCisJCXJldHVybjsKKwkvKgor
CSAqIERvIG5vdCBkZWxldGUgZXhwb3J0IGZvciBuZXR3b3JrIGZpbGVzeXN0ZW0gYnkKKwkgKiBw
YXNzaW5nICJleHBvcnQiIGFyZyB0byBubW91bnQoKS4KKwkgKiBJdCBvbmx5IG1ha2VzIHNlbnNl
IHRvIGRvIHRoaXMgZm9yIGxvY2FsIGZpbGVzeXN0ZW1zLgorCSAqLworCWlmICh2ZmMudmZjX2Zs
YWdzICYgVkZDRl9ORVRXT1JLKQorCQlyZXR1cm47CisJCisJaW92WzFdLmlvdl9iYXNlID0gZnNw
LT5mX2ZzdHlwZW5hbWU7CisJaW92WzFdLmlvdl9sZW4gPSBzdHJsZW4oZnNwLT5mX2ZzdHlwZW5h
bWUpICsgMTsKKwlpb3ZbM10uaW92X2Jhc2UgPSBmc3AtPmZfbW50b25uYW1lOworCWlvdlszXS5p
b3ZfbGVuID0gc3RybGVuKGZzcC0+Zl9tbnRvbm5hbWUpICsgMTsKKwlpb3ZbNV0uaW92X2Jhc2Ug
PSBmc3AtPmZfbW50ZnJvbW5hbWU7CisJaW92WzVdLmlvdl9sZW4gPSBzdHJsZW4oZnNwLT5mX21u
dGZyb21uYW1lKSArIDE7CisJZXJybXNnWzBdID0gJ1wwJzsKKwkKKwkvKgorCSAqIEVYREVWIGlz
IHJldHVybmVkIHdoZW4gcGF0aCBleGlzdHMgYnV0IGlzIG5vdCBhCisJICogbW91bnQgcG9pbnQu
ICBNYXkgaGFwcGVucyBpZiByYWNlZCB3aXRoIHVubW91bnQuCisJICovCisJaWYgKG5tb3VudChp
b3YsIGlvdmxlbiwgZnNwLT5mX2ZsYWdzKSA8IDAgJiYgZXJybm8gIT0gRU5PRU5UICYmCisJICAg
IGVycm5vICE9IEVOT1RTVVAgJiYgZXJybm8gIT0gRVhERVYpIHsKKwkJc3lzbG9nKExPR19FUlIs
CisJCSAgICAiY2FuJ3QgZGVsZXRlIGV4cG9ydHMgZm9yICVzOiAlbSAlcyIsCisJCSAgICBmc3At
PmZfbW50b25uYW1lLCBlcnJtc2cpOworCX0KK30KKworLyoKKyAqIEluc2VydCBhbiBleHBvcnQg
ZW50cnkgaW4gdGhlIGFwcHJvcHJpYXRlIGxpc3QuCisgKi8KK3N0YXRpYyB2b2lkCitpbnNlcnRf
ZXhwb3J0cyhzdHJ1Y3QgZXhwb3J0bGlzdCAqZXAsIHN0cnVjdCBleHBvcnRsaXN0aGVhZCAqZXho
cCkKK3sKKwl1aW50MzJfdCBpOworCisJaSA9IEVYUEhBU0goJmVwLT5leF9mcyk7CisJU0xJU1Rf
SU5TRVJUX0hFQUQoJmV4aHBbaV0sIGVwLCBlbnRyaWVzKTsKK30KKworLyoKKyAqIEZyZWUgdXAg
dGhlIGV4cG9ydHMgbGlzdHMgcGFzc2VkIGluIGFzIGFyZ3VtZW50cy4KKyAqLworc3RhdGljIHZv
aWQKK2ZyZWVfZXhwb3J0cyhzdHJ1Y3QgZXhwb3J0bGlzdGhlYWQgKmV4aHApCit7CisJc3RydWN0
IGV4cG9ydGxpc3QgKmVwLCAqZXAyOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEVYUEhB
U0hTSVpFOyBpKyspIHsKKwkJU0xJU1RfRk9SRUFDSF9TQUZFKGVwLCAmZXhocFtpXSwgZW50cmll
cywgZXAyKSB7CisJCQlTTElTVF9SRU1PVkUoJmV4aHBbaV0sIGVwLCBleHBvcnRsaXN0LCBlbnRy
aWVzKTsKKwkJCWZyZWVfZXhwKGVwKTsKKwkJfQorCQlTTElTVF9JTklUKCZleGhwW2ldKTsKKwl9
CiB9CiAKIC8qCkBAIC0xOTI0LDExICsyMjU0LDEzIEBAIGdldGV4cF9lcnIoc3RydWN0IGV4cG9y
dGxpc3QgKmVwLCBzdHJ1Y3QKICAqIFNlYXJjaCB0aGUgZXhwb3J0IGxpc3QgZm9yIGEgbWF0Y2hp
bmcgZnMuCiAgKi8KIHN0YXRpYyBzdHJ1Y3QgZXhwb3J0bGlzdCAqCi1leF9zZWFyY2goZnNpZF90
ICpmc2lkKQorZXhfc2VhcmNoKGZzaWRfdCAqZnNpZCwgc3RydWN0IGV4cG9ydGxpc3RoZWFkICpl
eGhwKQogewogCXN0cnVjdCBleHBvcnRsaXN0ICplcDsKKwl1aW50MzJfdCBpOwogCi0JU0xJU1Rf
Rk9SRUFDSChlcCwgJmV4cGhlYWQsIGVudHJpZXMpIHsKKwlpID0gRVhQSEFTSChmc2lkKTsKKwlT
TElTVF9GT1JFQUNIKGVwLCAmZXhocFtpXSwgZW50cmllcykgewogCQlpZiAoZXAtPmV4X2ZzLnZh
bFswXSA9PSBmc2lkLT52YWxbMF0gJiYKIAkJICAgIGVwLT5leF9mcy52YWxbMV0gPT0gZnNpZC0+
dmFsWzFdKQogCQkJcmV0dXJuIChlcCk7CkBAIC0xOTY1LDcgKzIyOTcsNyBAQCBhZGRfZXhwZGly
KHN0cnVjdCBkaXJsaXN0ICoqZHBwLCBjaGFyICpjCiAgKi8KIHN0YXRpYyB2b2lkCiBoYW5nX2Rp
cnAoc3RydWN0IGRpcmxpc3QgKmRwLCBzdHJ1Y3QgZ3JvdXBsaXN0ICpncnAsIHN0cnVjdCBleHBv
cnRsaXN0ICplcCwKLQlpbnQgZmxhZ3MpCisJaW50IGZsYWdzLCBzdHJ1Y3QgeHVjcmVkICphbm9u
Y3JwLCBpbnQgZXhmbGFncykKIHsKIAlzdHJ1Y3QgaG9zdGxpc3QgKmhwOwogCXN0cnVjdCBkaXJs
aXN0ICpkcDI7CkBAIC0xOTgyLDYgKzIzMTQsOCBAQCBoYW5nX2RpcnAoc3RydWN0IGRpcmxpc3Qg
KmRwLCBzdHJ1Y3QgZ3JvCiAJCQlpZiAoZXAtPmV4X251bXNlY2ZsYXZvcnMgPiAwKQogCQkJCW1l
bWNweShlcC0+ZXhfZGVmc2VjZmxhdm9ycywgZXAtPmV4X3NlY2ZsYXZvcnMsCiAJCQkJICAgIHNp
emVvZihlcC0+ZXhfc2VjZmxhdm9ycykpOworCQkJZXAtPmV4X2RlZmFub24gPSAqYW5vbmNycDsK
KwkJCWVwLT5leF9kZWZleGZsYWdzID0gZXhmbGFnczsKIAkJfSBlbHNlIHdoaWxlIChncnApIHsK
IAkJCWhwID0gZ2V0X2h0KCk7CiAJCQlocC0+aHRfZ3JwID0gZ3JwOwpAQCAtMjQwMyw2ICsyNzM3
LDcgQEAgZ2V0X2hvc3QoY2hhciAqY3AsIHN0cnVjdCBncm91cGxpc3QgKmdycAogc3RhdGljIHZv
aWQKIGZyZWVfZXhwKHN0cnVjdCBleHBvcnRsaXN0ICplcCkKIHsKKwlzdHJ1Y3QgZ3JvdXBsaXN0
ICpncnAsICp0Z3JwOwogCiAJaWYgKGVwLT5leF9kZWZkaXIpIHsKIAkJZnJlZV9ob3N0KGVwLT5l
eF9kZWZkaXItPmRwX2hvc3RzKTsKQEAgLTI0MTMsMTAgKzI3NDgsMzcgQEAgZnJlZV9leHAoc3Ry
dWN0IGV4cG9ydGxpc3QgKmVwKQogCWlmIChlcC0+ZXhfaW5kZXhmaWxlKQogCQlmcmVlKGVwLT5l
eF9pbmRleGZpbGUpOwogCWZyZWVfZGlyKGVwLT5leF9kaXJsKTsKKwl0Z3JwID0gZXAtPmV4X2dy
cGhlYWQ7CisJd2hpbGUgKHRncnAgIT0gTlVMTCkgeworCQlncnAgPSB0Z3JwOworCQl0Z3JwID0g
dGdycC0+Z3JfbmV4dDsKKwkJZnJlZV9ncnAoZ3JwKTsKKwl9CiAJZnJlZSgoY2FkZHJfdCllcCk7
CiB9CiAKIC8qCisgKiBGcmVlIHVwIHRoZSB2NHJvb3QgZXhwb3J0cy4KKyAqLworc3RhdGljIHZv
aWQKK2ZyZWVfdjRyb290ZXhwKHZvaWQpCit7CisJc3RydWN0IGdyb3VwbGlzdCAqZ3JwLCAqdGdy
cDsKKworCWlmICh2NHJvb3RfZXAgIT0gTlVMTCkgeworCQlmcmVlX2V4cCh2NHJvb3RfZXApOwor
CQl2NHJvb3RfZXAgPSBOVUxMOworCX0KKwl0Z3JwID0gdjRyb290X2dycDsKKwl2NHJvb3RfZ3Jw
ID0gTlVMTDsKKwl3aGlsZSAodGdycCAhPSBOVUxMKSB7CisJCWdycCA9IHRncnA7CisJCXRncnAg
PSB0Z3JwLT5ncl9uZXh0OworCQlmcmVlX2dycChncnApOworCX0KK30KKworLyoKICAqIEZyZWUg
aG9zdHMuCiAgKi8KIHN0YXRpYyB2b2lkCkBAIC0yNDU2LDYgKzI4MTgsNDQgQEAgb3V0X29mX21l
bSh2b2lkKQogfQogCiAvKgorICogQ2FsbCBkb19tb3VudCgpIGZyb20gdGhlIHN0cnVjdCBleHBv
cnRsaXN0LCBmb3IgZWFjaCBjYXNlIG5lZWRlZC4KKyAqLworc3RhdGljIGludAorZG9fZXhwb3J0
X21vdW50KHN0cnVjdCBleHBvcnRsaXN0ICplcCwgc3RydWN0IHN0YXRmcyAqZnNwKQoreworCXN0
cnVjdCBkaXJsaXN0ICpkcDsKKwlzdHJ1Y3QgZ3JvdXBsaXN0ICpncnAsIGRlZmdycDsKKwlpbnQg
cmV0OworCXNpemVfdCBkaXJsZW47CisKK3N5c2xvZyhMT0dfRVJSLCAiZG9fbW91bnRfZXhwb3J0
PSVzIiwgZXAtPmV4X2ZzZGlyKTsKKwlkaXJsZW4gPSBzdHJsZW4oZXAtPmV4X2ZzZGlyKTsKKwlk
cCA9IGVwLT5leF9kZWZkaXI7CisJaWYgKGRwICE9IE5VTEwgJiYgKGRwLT5kcF9mbGFnICYgRFBf
REVGU0VUKSAhPSAwKSB7CisJCWRlZmdycC5ncl90eXBlID0gR1RfREVGQVVMVDsKKwkJZGVmZ3Jw
LmdyX25leHQgPSBOVUxMOworCQkvKiBXZSBoYXZlIGFuIGVudHJ5IGZvciBhbGwgb3RoZXIgaG9z
dHMvbmV0cy4gKi8KK3N5c2xvZyhMT0dfRVJSLCAiZXhfZGVmZXhmbGFncz0weCV4IiwgZXAtPmV4
X2RlZmV4ZmxhZ3MpOworCQlyZXQgPSBkb19tb3VudChlcCwgJmRlZmdycCwgZXAtPmV4X2RlZmV4
ZmxhZ3MsICZlcC0+ZXhfZGVmYW5vbiwKKwkJICAgIGVwLT5leF9mc2RpciwgZGlybGVuLCBmc3Ap
OworCQlpZiAocmV0ICE9IDApCisJCQlyZXR1cm4gKHJldCk7CisJfQorCisJLyogRG8gYSBtb3Vu
dCBmb3IgZWFjaCBncm91cC4gKi8KKwlncnAgPSBlcC0+ZXhfZ3JwaGVhZDsKKwl3aGlsZSAoZ3Jw
ICE9IE5VTEwpIHsKK3N5c2xvZyhMT0dfRVJSLCAiZG8gbW91bnQgZ3JfdHlwZT0weCV4IGdyX2V4
ZmxhZ3M9MHgleCIsIGdycC0+Z3JfdHlwZSwgZ3JwLT5ncl9leGZsYWdzKTsKKwkJcmV0ID0gZG9f
bW91bnQoZXAsIGdycCwgZ3JwLT5ncl9leGZsYWdzLCAmZ3JwLT5ncl9hbm9uLAorCQkgICAgZXAt
PmV4X2ZzZGlyLCBkaXJsZW4sIGZzcCk7CisJCWlmIChyZXQgIT0gMCkKKwkJCXJldHVybiAocmV0
KTsKKwkJZ3JwID0gZ3JwLT5ncl9uZXh0OworCX0KKwlyZXR1cm4gKDApOworfQorCisvKgogICog
RG8gdGhlIG5tb3VudCgpIHN5c2NhbGwgd2l0aCB0aGUgdXBkYXRlIGZsYWcgdG8gcHVzaCB0aGUg
ZXhwb3J0IGluZm8gaW50bwogICogdGhlIGtlcm5lbC4KICAqLwpAQCAtMjQ4Nyw2ICsyODg3LDcg
QEAgZG9fbW91bnQoc3RydWN0IGV4cG9ydGxpc3QgKmVwLCBzdHJ1Y3QgZwogCWJ6ZXJvKGVycm1z
Zywgc2l6ZW9mKGVycm1zZykpOwogCWVhcC0+ZXhfZmxhZ3MgPSBleGZsYWdzOwogCWVhcC0+ZXhf
YW5vbiA9ICphbm9uY3JwOworc3lzbG9nKExPR19FUlIsICJkb19leGZsYWdzPTB4JXgiLCBleGZs
YWdzKTsKIAllYXAtPmV4X2luZGV4ZmlsZSA9IGVwLT5leF9pbmRleGZpbGU7CiAJaWYgKGdycC0+
Z3JfdHlwZSA9PSBHVF9IT1NUKQogCQlhaSA9IGdycC0+Z3JfcHRyLmd0X2FkZHJpbmZvOwo=

--_002_YQBPR0101MB2260008E1767646E9DFBB790DD310YQBPR0101MB2260_--



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