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>