From mboxrd@z Thu Jan 1 00:00:00 1970 From: Pallai Roland Subject: Re: [PATCH] proactive raid5 disk replacement for 2.6.11, updated Date: Sat, 20 Aug 2005 17:35:24 +0200 Message-ID: <1124552125.3810.131.camel@localhost.localdomain> References: <1124322731.3810.77.camel@localhost.localdomain> <17156.7305.638579.812295@cse.unsw.edu.au> <1124372804.21362.92.camel@localhost.localdomain> <1124463511.21362.211.camel@localhost.localdomain> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-l6K2Yj3/j3TZD9PhfuIg" Return-path: In-Reply-To: <1124463511.21362.211.camel@localhost.localdomain> Sender: linux-raid-owner@vger.kernel.org To: linux-raid@vger.kernel.org List-Id: linux-raid.ids --=-l6K2Yj3/j3TZD9PhfuIg Content-Type: text/plain Content-Transfer-Encoding: 7bit external error handler is done, error handling is a quite complex now compared to the old method, but there's a built-in handler if you don't write your own. if the exit value of the handler isn't understood then md_error() will be also called. all disk IO is suspended during the running of the error handler, so you can remove a disk and readd it without rebuild, for example, through badblock reallocator of the device mapper. the superblock will be checked to be sure that's a fresh disk for that array. let's see how the internal error handler works: array is optimal a disk fails (fails = oversteps the badblock threshold or does a write error or superblock update error): if you have a spare that steps in and proactive mirroring begins. if you haven't, the array becomes degraded. if an another drive fails due to read error during the rebuilding, that won't be kicked, if fails due to write error or on user request, the proactive mirroring will be stopped and the spare will be readded as a new member and the normal rebuilding starts. array is already degraded a disk fails: never will be marked failed, only you can do it by mdadm. you should put your error handler script at location "/sbin/mdevent". it gets the following arguments: 1st: name of the md array (eg.: "md0") 2nd: kind of the fail event as string, currently always "drivefail" 3rd: name of the drive (maybe major/minor nr would be better, currently you can translate to that by /proc/partitions) and let's see how can you handle some situations from the script: array is optimal, a disk fails: you want to.. fail that drive and add a spare for normal rebuilding mdadm -f /dev/$2 /dev/$3 mdadm -a /dev/$2 /dev/my_spare1 exit 0 ..start proactive mirroring of that disk mdadm -a /dev/$2 /dev/my_spare1 exit 0 ..keep it on and reset the badblock cache exit 1 ..just keep it in sync exit 0 ..let the default action exit 2 if the proactive mirroring is done the spare won't replace the source drive automatically, you should do it by hand or by a scheluded task. you've got a last chance to re-think it :} array is already degraded, a disk fails if you don't want to kick the drive exit 0 during the proactive mirroring a read error on _any_ drive _won't call the error handler_ now I have no plan to add new features, this knows everything what I wished, but if you've any comment, I'll happy to answer/fix/develop that! -- dap --=-l6K2Yj3/j3TZD9PhfuIg Content-Disposition: attachment; filename=04_raid5-asp-dap4.diff Content-Type: text/x-patch; name=04_raid5-asp-dap4.diff; charset=ISO-8859-2 Content-Transfer-Encoding: base64 LS0tIGxpbnV4L2luY2x1ZGUvbGludXgvcmFpZC9tZF9rLmgub3JpZwkyMDA1LTA4LTIwIDE2OjA1 OjM1LjAwMDAwMDAwMCArMDIwMA0KKysrIGxpbnV4L2luY2x1ZGUvbGludXgvcmFpZC9tZF9rLmgJ MjAwNS0wOC0xOSAwMzoyNDo1OC4wMDAwMDAwMDAgKzAyMDANCkBAIC0yMTgsNiArMjE4LDExIEBA DQogCWNoYXIJCQkJdXVpZFsxNl07DQogDQogCXN0cnVjdCBtZGtfdGhyZWFkX3MJCSp0aHJlYWQ7 CS8qIG1hbmFnZW1lbnQgdGhyZWFkICovDQorCXN0cnVjdCBtZGtfdGhyZWFkX3MJCSplZWhfdGhy ZWFkOwkvKiBleHRlcm5hbCBlcnJvciBoYW5kbGVyICovDQorCXN0cnVjdCBlZWhfZGF0YSB7DQor CQlpbnQJCQlmYWlsZWRfbnVtOwkvKiBkcml2ZSAjICovDQorCX0gZWVoX2RhdGE7DQorDQogCXN0 cnVjdCBtZGtfdGhyZWFkX3MJCSpzeW5jX3RocmVhZDsJLyogZG9pbmcgcmVzeW5jIG9yIHJlY29u c3RydWN0ICovDQogCXNlY3Rvcl90CQkJY3Vycl9yZXN5bmM7CS8qIGJsb2NrcyBzY2hlZHVsZWQg Ki8NCiAJdW5zaWduZWQgbG9uZwkJCXJlc3luY19tYXJrOwkvKiBhIHJlY2VudCB0aW1lc3RhbXAg Ki8NCi0tLSBsaW51eC9pbmNsdWRlL2xpbnV4L3JhaWQvcmFpZDUuaC5vcmlnCTIwMDUtMDMtMDMg MjM6NTE6MjkuMDAwMDAwMDAwICswMTAwDQorKysgbGludXgvaW5jbHVkZS9saW51eC9yYWlkL3Jh aWQ1LmgJMjAwNS0wOC0xNCAwMzowMjoxMS4wMDAwMDAwMDAgKzAyMDANCkBAIC0xNDcsNiArMTQ3 LDcgQEANCiAjZGVmaW5lCVI1X1VQVE9EQVRFCTAJLyogcGFnZSBjb250YWlucyBjdXJyZW50IGRh dGEgKi8NCiAjZGVmaW5lCVI1X0xPQ0tFRAkxCS8qIElPIGhhcyBiZWVuIHN1Ym1pdHRlZCBvbiAi cmVxIiAqLw0KICNkZWZpbmUJUjVfT1ZFUldSSVRFCTIJLyogdG93cml0ZSBjb3ZlcnMgd2hvbGUg cGFnZSAqLw0KKyNkZWZpbmUJUjVfRkFJTEVECTgJLyogZmFpbGVkIHRvIHJlYWQgdGhpcyBzdHJp cGUgKi8NCiAvKiBhbmQgc29tZSB0aGF0IGFyZSBpbnRlcm5hbCB0byBoYW5kbGVfc3RyaXBlICov DQogI2RlZmluZQlSNV9JbnN5bmMJMwkvKiByZGV2ICYmIHJkZXYtPmluX3N5bmMgYXQgc3RhcnQg Ki8NCiAjZGVmaW5lCVI1X1dhbnRyZWFkCTQJLyogd2FudCB0byBzY2hlZHVsZSBhIHJlYWQgKi8N CkBAIC0xOTYsOCArMTk3LDE2IEBADQogICovDQogIA0KIA0KK3N0cnVjdCBiYWRibG9jayB7DQor CXN0cnVjdCBiYWRibG9jawkJKmhhc2hfbmV4dCwgKipoYXNoX3BwcmV2OyAvKiBoYXNoIHBvaW50 ZXJzICovDQorCXNlY3Rvcl90CQlzZWN0b3I7IC8qIHN0cmlwZSAjICovDQorfTsNCisNCiBzdHJ1 Y3QgZGlza19pbmZvIHsNCiAJbWRrX3JkZXZfdAkqcmRldjsNCisJc3RydWN0IGJhZGJsb2NrICoq YmFkYmxvY2tfaGFzaHRibDsgLyogbGlzdCBvZiBrbm93biBiYWRibG9ja3MgKi8NCisJY2hhcgkJ Y2FjaGVfbmFtZVsyMF07DQorCWttZW1fY2FjaGVfdAkqc2xhYl9jYWNoZTsgLyogYmFkYmxvY2sg ZGIgKi8NCiB9Ow0KIA0KIHN0cnVjdCByYWlkNV9wcml2YXRlX2RhdGEgew0KQEAgLTIyNCw2ICsy MzMsOCBAQA0KIAlpbnQJCQlpbmFjdGl2ZV9ibG9ja2VkOwkvKiByZWxlYXNlIG9mIGluYWN0aXZl IHN0cmlwZXMgYmxvY2tlZCwNCiAJCQkJCQkJICogd2FpdGluZyBmb3IgMjUlIHRvIGJlIGZyZWUN CiAJCQkJCQkJICovICAgICAgICANCisJaW50CQkJbWlycm9yaXQ7IC8qIHNvdXJjZSBmb3IgYWN0 aXZlIHNwYXJlIHJlc3luYyAqLw0KKw0KIAlzcGlubG9ja190CQlkZXZpY2VfbG9jazsNCiAJc3Ry dWN0IGRpc2tfaW5mbwlkaXNrc1swXTsNCiB9Ow0KLS0tIGxpbnV4L2luY2x1ZGUvbGludXgvc3lz Y3RsLmgub3JpZwkyMDA1LTA3LTA2IDIwOjE5OjEwLjAwMDAwMDAwMCArMDIwMA0KKysrIGxpbnV4 L2luY2x1ZGUvbGludXgvc3lzY3RsLmgJMjAwNS0wOC0xNyAyMjowMToyOC4wMDAwMDAwMDAgKzAy MDANCkBAIC03NzgsNyArNzc4LDggQEANCiAvKiAvcHJvYy9zeXMvZGV2L3JhaWQgKi8NCiBlbnVt IHsNCiAJREVWX1JBSURfU1BFRURfTElNSVRfTUlOPTEsDQotCURFVl9SQUlEX1NQRUVEX0xJTUlU X01BWD0yDQorCURFVl9SQUlEX1NQRUVEX0xJTUlUX01BWD0yLA0KKwlERVZfUkFJRF9CQURCTE9D S19UT0xFUkFOQ0U9Mw0KIH07DQogDQogLyogL3Byb2Mvc3lzL2Rldi9wYXJwb3J0L2RlZmF1bHQg Ki8NCi0tLSBsaW51eC9kcml2ZXJzL21kL21kLmMub3JpZwkyMDA1LTA4LTE0IDIxOjIyOjA4LjAw MDAwMDAwMCArMDIwMA0KKysrIGxpbnV4L2RyaXZlcnMvbWQvbWQuYwkyMDA1LTA4LTE0IDE3OjIw OjE1LjAwMDAwMDAwMCArMDIwMA0KQEAgLTc4LDYgKzc4LDEwIEBADQogc3RhdGljIGludCBzeXNj dGxfc3BlZWRfbGltaXRfbWluID0gMTAwMDsNCiBzdGF0aWMgaW50IHN5c2N0bF9zcGVlZF9saW1p dF9tYXggPSAyMDAwMDA7DQogDQorLyogdGhlIGRyaXZlJ2xsIGJlIG1hcmtlZCBmYWlsZWQgb3Zl ciB0aGlzIHRocmVzaG9sZC4gbWVhc3VyZSBpcyBibG9jay4gKi8NCitpbnQgc3lzY3RsX2JhZGJs b2NrX3RvbGVyYW5jZSA9IDEwMDAwOw0KKw0KKw0KIHN0YXRpYyBzdHJ1Y3QgY3RsX3RhYmxlX2hl YWRlciAqcmFpZF90YWJsZV9oZWFkZXI7DQogDQogc3RhdGljIGN0bF90YWJsZSByYWlkX3RhYmxl W10gPSB7DQpAQCAtOTcsNiArMTAxLDE0IEBADQogCQkubW9kZQkJPSAwNjQ0LA0KIAkJLnByb2Nf aGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjLA0KIAl9LA0KKwl7DQorCQkuY3RsX25hbWUJPSBERVZf UkFJRF9CQURCTE9DS19UT0xFUkFOQ0UsDQorCQkucHJvY25hbWUJPSAiYmFkYmxvY2tfdG9sZXJh bmNlIiwNCisJCS5kYXRhCQk9ICZzeXNjdGxfYmFkYmxvY2tfdG9sZXJhbmNlLA0KKwkJLm1heGxl bgkJPSBzaXplb2YoaW50KSwNCisJCS5tb2RlCQk9IDA2NDQsDQorCQkucHJvY19oYW5kbGVyCT0g JnByb2NfZG9pbnR2ZWMsDQorCX0sDQogCXsgLmN0bF9uYW1lID0gMCB9DQogfTsNCiANCkBAIC0x MjU1LDcgKzEyNjcsMTAgQEANCiAJbWRkZXYtPnNiX2RpcnR5ID0gMDsNCiByZXBlYXQ6DQogCW1k ZGV2LT51dGltZSA9IGdldF9zZWNvbmRzKCk7DQotCW1kZGV2LT5ldmVudHMgKys7DQorCWlmICgh bWRkZXYtPmVlaF90aHJlYWQpDQorCQkvKiB0aGUgZGF0YSBpc24ndCBtb2RpZmllZCBvbiBkaXNr cyB3aGlsZSB0aGUgZWVoIGlzIHJ1bm5pbmcsDQorCQkgICAgYW5kIHdlIHdhbnQgdG8gbWFrZSBw b3NzaWJsZSBkaXNrIHJlbW92ZS9hZGQgY3ljbGVzICovDQorCQltZGRldi0+ZXZlbnRzICsrOw0K IA0KIAlpZiAoIW1kZGV2LT5ldmVudHMpIHsNCiAJCS8qDQpAQCAtMjE4MSw2ICsyMTk2LDcgQEAN CiAJaW50IGVycjsNCiAJdW5zaWduZWQgaW50IHNpemU7DQogCW1ka19yZGV2X3QgKnJkZXY7DQor CWludCByZWFkZCA9IDA7DQogDQogCWlmICghbWRkZXYtPnBlcnMpDQogCQlyZXR1cm4gLUVOT0RF VjsNCkBAIC0yMTk4LDcgKzIyMTQsNDAgQEANCiAJCXJldHVybiAtRUlOVkFMOw0KIAl9DQogDQot CXJkZXYgPSBtZF9pbXBvcnRfZGV2aWNlIChkZXYsIC0xLCAwKTsNCisJLyoNCisJICogVHJ5aW5n IHRvIHJlYWQgc3VwZXJibG9jaywgaWYgaXQgaXMgdXAtdG8tZGF0ZSwgdGhlDQorCSAqICBpbl9z eW5jIHdpbGwgYmUgc2V0IHRvIGF2b2lkIGZyb20gcG9pbnRsZXNzIHJlYnVpbGQNCisJICovDQor CXJkZXYgPSBtZF9pbXBvcnRfZGV2aWNlIChkZXYsIDAsIDApOw0KKwlpZiAoSVNfRVJSKHJkZXYp KQ0KKwkJcmRldiA9IG1kX2ltcG9ydF9kZXZpY2UgKGRldiwgLTEsIDApOw0KKwllbHNlIHsNCisJ CS8vIHF3ZQ0KKwkJbWRwX3N1cGVyX3QgKnNiID0gKG1kcF9zdXBlcl90ICopcGFnZV9hZGRyZXNz KHJkZXYtPnNiX3BhZ2UpOw0KKwkJbWRwX3N1cGVyX3QgKnJlZnNiID0gTlVMTDsNCisJCXN0cnVj dCBsaXN0X2hlYWQgKnRtcDsNCisJCW1ka19yZGV2X3QgKnJkZXZ0Ow0KKwkJX191NjQgZXYxLCBl djI7DQorDQorCQlwcmludGsoS0VSTl9JTkZPICJoYXZlIGEgdmFsaWQgc3VwZXJibG9ja1xuIik7 DQorCQlldjEgPSBtZF9ldmVudChzYik7DQorCQlJVEVSQVRFX1JERVYobWRkZXYscmRldnQsdG1w KSB7DQorCQkJaWYgKHJkZXZ0LT5pbl9zeW5jKSB7DQorCQkJCXJlZnNiID0gKG1kcF9zdXBlcl90 ICopcGFnZV9hZGRyZXNzKHJkZXZ0LT5zYl9wYWdlKTsNCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAi cmVmZXJlbmNlIGRpc2s6ICVzICglbGx1KSBbJWxsdV1cbiIsIGJkZXZuYW1lKHJkZXZ0LT5iZGV2 LCBiKSwNCisJCQkJCW1kX2V2ZW50KHJlZnNiKSwgZXYxKTsNCisJCQkJLy9icmVhazsNCisJCQl9 DQorCQl9DQorCQlldjIgPSBtZF9ldmVudChyZWZzYik7DQorDQorCQlpZiAoZXYxID09IGV2Mikg ew0KKwkJCXByaW50ayhLRVJOX05PVElDRSAiaG90IGFkZGVkIGRpc2sgaXMgdXB0b2RhdGUgKCVs bHUpIVxuIiwgZXYyKTsNCisJCQkvKiBjaGVja21lOiB3ZSBtdXN0IGJlIHN1cmUgaWYgaXQgd2Fz IHByZXZpb3VzbHkga2lja2VkISAqLw0KKwkJCXJlYWRkKys7DQorCQl9DQorCX0NCisNCiAJaWYg KElTX0VSUihyZGV2KSkgew0KIAkJcHJpbnRrKEtFUk5fV0FSTklORyANCiAJCQkibWQ6IGVycm9y LCBtZF9pbXBvcnRfZGV2aWNlKCkgcmV0dXJuZWQgJWxkXG4iLA0KQEAgLTIyMzEsNyArMjI4MCw3 IEBADQogCQllcnIgPSAtRUlOVkFMOw0KIAkJZ290byBhYm9ydF9leHBvcnQ7DQogCX0NCi0JcmRl di0+aW5fc3luYyA9IDA7DQorCXJkZXYtPmluX3N5bmMgPSByZWFkZCA/IDEgOiAwOw0KIAlyZGV2 LT5kZXNjX25yID0gLTE7DQogCWJpbmRfcmRldl90b19hcnJheShyZGV2LCBtZGRldik7DQogDQpA QCAtMzUyNSwxMCArMzU3NCwxMiBAQA0KIAkJfQ0KIAkJaWYgKG1kZGV2LT5zeW5jX3RocmVhZCkg ew0KIAkJCS8qIHJlc3luYyBoYXMgZmluaXNoZWQsIGNvbGxlY3QgcmVzdWx0ICovDQorcHJpbnRr KCJtZF9jaGVja19yZWNvdmVyeTogcmVzeW5jIGhhcyBmaW5pc2hlZFxuIik7DQogCQkJbWRfdW5y ZWdpc3Rlcl90aHJlYWQobWRkZXYtPnN5bmNfdGhyZWFkKTsNCiAJCQltZGRldi0+c3luY190aHJl YWQgPSBOVUxMOw0KIAkJCWlmICghdGVzdF9iaXQoTURfUkVDT1ZFUllfRVJSLCAmbWRkZXYtPnJl Y292ZXJ5KSAmJg0KIAkJCSAgICAhdGVzdF9iaXQoTURfUkVDT1ZFUllfSU5UUiwgJm1kZGV2LT5y ZWNvdmVyeSkpIHsNCitwcmludGsoIm1kX2NoZWNrX3JlY292ZXJ5OiBhY3RpdmF0ZSBhbnkgc3Bh cmVzXG4iKTsNCiAJCQkJLyogc3VjY2Vzcy4uLiovDQogCQkJCS8qIGFjdGl2YXRlIGFueSBzcGFy ZXMgKi8NCiAJCQkJbWRkZXYtPnBlcnMtPnNwYXJlX2FjdGl2ZShtZGRldik7DQpAQCAtMzU0NSwx OSArMzU5NiwyMCBAQA0KIA0KIAkJLyogbm8gcmVjb3ZlcnkgaXMgcnVubmluZy4NCiAJCSAqIHJl bW92ZSBhbnkgZmFpbGVkIGRyaXZlcywgdGhlbg0KLQkJICogYWRkIHNwYXJlcyBpZiBwb3NzaWJs ZQ0KKwkJICogYWRkIHNwYXJlcyBpZiBwb3NzaWJsZS4NCisJCSAqIFNwYXJlIGFyZSBhbHNvIHJl bW92ZWQgYW5kIHJlLWFkZGVkLCB0byBhbGxvdw0KKwkJICogdGhlIHBlcnNvbmFsaXR5IHRvIGZh aWwgdGhlIHJlLWFkZC4NCiAJCSAqLw0KLQkJSVRFUkFURV9SREVWKG1kZGV2LHJkZXYscnRtcCkg ew0KKwkJSVRFUkFURV9SREVWKG1kZGV2LHJkZXYscnRtcCkNCiAJCQlpZiAocmRldi0+cmFpZF9k aXNrID49IDAgJiYNCi0JCQkgICAgcmRldi0+ZmF1bHR5ICYmDQorCQkJICAgIChyZGV2LT5mYXVs dHkgfHwgISByZGV2LT5pbl9zeW5jKSAmJg0KIAkJCSAgICBhdG9taWNfcmVhZCgmcmRldi0+bnJf cGVuZGluZyk9PTApIHsNCitwcmludGsoIm1kX2NoZWNrX3JlY292ZXJ5OiBob3RfcmVtb3ZlX2Rp c2tcbiIpOw0KIAkJCQlpZiAobWRkZXYtPnBlcnMtPmhvdF9yZW1vdmVfZGlzayhtZGRldiwgcmRl di0+cmFpZF9kaXNrKT09MCkNCiAJCQkJCXJkZXYtPnJhaWRfZGlzayA9IC0xOw0KIAkJCX0NCi0J CQlpZiAoIXJkZXYtPmZhdWx0eSAmJiByZGV2LT5yYWlkX2Rpc2sgPj0gMCAmJiAhcmRldi0+aW5f c3luYykNCi0JCQkJc3BhcmVzKys7DQotCQl9DQotCQlpZiAobWRkZXYtPmRlZ3JhZGVkKSB7DQor DQorCQlpZiAobWRkZXYtPmRlZ3JhZGVkIHx8IG1kZGV2LT5lZWhfdGhyZWFkKSB7DQogCQkJSVRF UkFURV9SREVWKG1kZGV2LHJkZXYscnRtcCkNCiAJCQkJaWYgKHJkZXYtPnJhaWRfZGlzayA8IDAN CiAJCQkJICAgICYmICFyZGV2LT5mYXVsdHkpIHsNCkBAIC0zNzY0LDQgKzM4MTksNiBAQA0KIEVY UE9SVF9TWU1CT0wobWRfd2FrZXVwX3RocmVhZCk7DQogRVhQT1JUX1NZTUJPTChtZF9wcmludF9k ZXZpY2VzKTsNCiBFWFBPUlRfU1lNQk9MKG1kX2NoZWNrX3JlY292ZXJ5KTsNCitFWFBPUlRfU1lN Qk9MKGtpY2tfcmRldl9mcm9tX2FycmF5KTsJLy8gZml4bWUNCitFWFBPUlRfU1lNQk9MKHN5c2N0 bF9iYWRibG9ja190b2xlcmFuY2UpOw0KIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsNCi0tLSBsaW51 eC9kcml2ZXJzL21kL3JhaWQ1LmMub3JpZwkyMDA1LTA4LTE0IDIxOjIyOjA4LjAwMDAwMDAwMCAr MDIwMA0KKysrIGxpbnV4L2RyaXZlcnMvbWQvcmFpZDUuYwkyMDA1LTA4LTE0IDIwOjQ5OjQ5LjAw MDAwMDAwMCArMDIwMA0KQEAgLTQwLDYgKzQwLDE4IEBADQogDQogI2RlZmluZSBzdHJpcGVfaGFz aChjb25mLCBzZWN0KQkoKGNvbmYpLT5zdHJpcGVfaGFzaHRibFsoKHNlY3QpID4+IFNUUklQRV9T SElGVCkgJiBIQVNIX01BU0tdKQ0KIA0KKyAvKg0KKyAqIHBlci1kZXZpY2UgYmFkYmxvY2sgY2Fj aGUNCisgKi8NCisNCisjZGVmaW5lCUJCX1NISUZUCQkoUEFHRV9TSElGVC8qMTIqLyAtIDkpDQor I2RlZmluZQlCQl9IQVNIX1BBR0VTCQkxDQorI2RlZmluZQlCQl9OUl9IQVNICQkoSEFTSF9QQUdF UyAqIFBBR0VfU0laRSAvIHNpemVvZihzdHJ1Y3QgYmFkYmxvY2sgKikpDQorI2RlZmluZQlCQl9I QVNIX01BU0sJCShCQl9OUl9IQVNIIC0gMSkNCisNCisjZGVmaW5lCWJiX2hhc2goZGlzaywgc2Vj dCkJKChkaXNrKS0+YmFkYmxvY2tfaGFzaHRibFsoKHNlY3QpID4+IEJCX1NISUZUKSAmIEJCX0hB U0hfTUFTS10pDQorI2RlZmluZQliYl9oYXNobnIoc2VjdCkJCSgoKHNlY3QpID4+IEJCX1NISUZU KSAmIEJCX0hBU0hfTUFTSykNCisNCiAvKiBiaW8ncyBhdHRhY2hlZCB0byBhIHN0cmlwZStkZXZp Y2UgZm9yIEkvTyBhcmUgbGlua2VkIHRvZ2V0aGVyIGluIGJpX3NlY3Rvcg0KICAqIG9yZGVyIHdp dGhvdXQgb3ZlcmxhcC4gIFRoZXJlIG1heSBiZSBzZXZlcmFsIGJpbydzIHBlciBzdHJpcGUrZGV2 aWNlLCBhbmQNCiAgKiBhIGJpbyBjb3VsZCBzcGFuIHNldmVyYWwgZGV2aWNlcy4NCkBAIC01Myw3 ICs2NSw3IEBADQogLyoNCiAgKiBUaGUgZm9sbG93aW5nIGNhbiBiZSB1c2VkIHRvIGRlYnVnIHRo ZSBkcml2ZXINCiAgKi8NCi0jZGVmaW5lIFJBSUQ1X0RFQlVHCTANCisjZGVmaW5lIFJBSUQ1X0RF QlVHCTENCiAjZGVmaW5lIFJBSUQ1X1BBUkFOT0lBCTENCiAjaWYgUkFJRDVfUEFSQU5PSUEgJiYg ZGVmaW5lZChDT05GSUdfU01QKQ0KICMgZGVmaW5lIENIRUNLX0RFVkxPQ0soKSBhc3NlcnRfc3Bp bl9sb2NrZWQoJmNvbmYtPmRldmljZV9sb2NrKQ0KQEAgLTYxLDEzICs3MywxNjIgQEANCiAjIGRl ZmluZSBDSEVDS19ERVZMT0NLKCkNCiAjZW5kaWYNCiANCi0jZGVmaW5lIFBSSU5USyh4Li4uKSAo KHZvaWQpKFJBSUQ1X0RFQlVHICYmIHByaW50ayh4KSkpDQorLyogdXNlIEV4dGVybmFsIEVycm9y IEhhbmRsZXI/ICovDQorI2RlZmluZQlVU0VSRUgJCTENCisNCisjZGVmaW5lIFBSSU5USyh4Li4u KSAoKHZvaWQpKFJBSUQ1X0RFQlVHICYmIHByaW50ayhLRVJOX0RFQlVHIHgpKSkNCiAjaWYgUkFJ RDVfREVCVUcNCiAjZGVmaW5lIGlubGluZQ0KICNkZWZpbmUgX19pbmxpbmVfXw0KICNlbmRpZg0K IA0KIHN0YXRpYyB2b2lkIHByaW50X3JhaWQ1X2NvbmYgKHJhaWQ1X2NvbmZfdCAqY29uZik7DQor ZXh0ZXJuIGludCBzeXNjdGxfYmFkYmxvY2tfdG9sZXJhbmNlOw0KKw0KKw0KK3N0YXRpYyB2b2lk IGJiX2luc2VydF9oYXNoKHN0cnVjdCBkaXNrX2luZm8gKmRpc2ssIHN0cnVjdCBiYWRibG9jayAq YmIpDQorew0KKwlzdHJ1Y3QgYmFkYmxvY2sgKipiYnAgPSAmYmJfaGFzaChkaXNrLCBiYi0+c2Vj dG9yKTsNCisNCisJLypwcmludGsoImJiX2luc2VydF9oYXNoKCksIHNlY3RvciAlbGx1IGhhc2hu ciAlbHVcbiIsICh1bnNpZ25lZCBsb25nIGxvbmcpYmItPnNlY3RvciwNCisJCWJiX2hhc2hucihi Yi0+c2VjdG9yKSk7Ki8NCisNCisJaWYgKChiYi0+aGFzaF9uZXh0ID0gKmJicCkgIT0gTlVMTCkN CisJCSgqYmJwKS0+aGFzaF9wcHJldiA9ICZiYi0+aGFzaF9uZXh0Ow0KKwkqYmJwID0gYmI7CQ0K KwliYi0+aGFzaF9wcHJldiA9IGJicDsNCit9DQorDQorc3RhdGljIHZvaWQgYmJfcmVtb3ZlX2hh c2goc3RydWN0IGJhZGJsb2NrICpiYikNCit7DQorCS8qcHJpbnRrKCJyZW1vdmVfaGFzaCgpLCBz ZWN0b3IgJWxsdSBoYXNobnIgJWx1XG4iLCAodW5zaWduZWQgbG9uZyBsb25nKWJiLT5zZWN0b3Is DQorCQliYl9oYXNobnIoYmItPnNlY3RvcikpOyovDQorDQorCWlmIChiYi0+aGFzaF9wcHJldikg ew0KKwkJaWYgKGJiLT5oYXNoX25leHQpDQorCQkJYmItPmhhc2hfbmV4dC0+aGFzaF9wcHJldiA9 IGJiLT5oYXNoX3BwcmV2Ow0KKwkJKmJiLT5oYXNoX3BwcmV2ID0gYmItPmhhc2hfbmV4dDsNCisJ CWJiLT5oYXNoX3BwcmV2ID0gTlVMTDsNCisJfQ0KK30NCisNCitzdGF0aWMgc3RydWN0IGJhZGJs b2NrICpfX2ZpbmRfYmFkYmxvY2soc3RydWN0IGRpc2tfaW5mbyAqZGlzaywgc2VjdG9yX3Qgc2Vj dG9yKQ0KK3sNCisJc3RydWN0IGJhZGJsb2NrICpiYjsNCisNCisJZm9yIChiYiA9IGJiX2hhc2go ZGlzaywgc2VjdG9yKTsgYmI7IGJiID0gYmItPmhhc2hfbmV4dCkNCisJCWlmIChiYi0+c2VjdG9y ID09IHNlY3RvcikNCisJCQlyZXR1cm4gYmI7DQorCXJldHVybiBOVUxMOw0KK30NCisNCitzdGF0 aWMgc3RydWN0IGJhZGJsb2NrICpmaW5kX2JhZGJsb2NrKHN0cnVjdCBkaXNrX2luZm8gKmRpc2ss IHNlY3Rvcl90IHNlY3RvcikNCit7DQorCXJhaWQ1X2NvbmZfdCAqY29uZiA9IChyYWlkNV9jb25m X3QgKikgZGlzay0+cmRldi0+bWRkZXYtPnByaXZhdGU7DQorCXN0cnVjdCBiYWRibG9jayAqYmI7 DQorDQorCXNwaW5fbG9ja19pcnEoJmNvbmYtPmRldmljZV9sb2NrKTsNCisJYmIgPSBfX2ZpbmRf YmFkYmxvY2soZGlzaywgc2VjdG9yKTsNCisJc3Bpbl91bmxvY2tfaXJxKCZjb25mLT5kZXZpY2Vf bG9jayk7DQorCXJldHVybiBiYjsNCit9DQorDQorc3RhdGljIHVuc2lnbmVkIGxvbmcgY291bnRf YmFkYmxvY2tzIChzdHJ1Y3QgZGlza19pbmZvICpkaXNrKQ0KK3sNCisJcmFpZDVfY29uZl90ICpj b25mID0gKHJhaWQ1X2NvbmZfdCAqKSBkaXNrLT5yZGV2LT5tZGRldi0+cHJpdmF0ZTsNCisJc3Ry dWN0IGJhZGJsb2NrICpiYjsNCisJaW50IGo7DQorCWludCBuID0gMDsNCisNCisJc3Bpbl9sb2Nr X2lycSgmY29uZi0+ZGV2aWNlX2xvY2spOw0KKwlmb3IgKGogPSAwOyBqIDwgQkJfTlJfSEFTSDsg aisrKSB7DQorCQliYiA9IGRpc2stPmJhZGJsb2NrX2hhc2h0Ymxbal07DQorCQlmb3IgKDsgYmI7 IGJiID0gYmItPmhhc2hfbmV4dCkNCisJCQluKys7DQorCX0NCisJc3Bpbl91bmxvY2tfaXJxKCZj b25mLT5kZXZpY2VfbG9jayk7DQorDQorCXJldHVybiBuOw0KK30NCisNCitzdGF0aWMgaW50IGdy b3dfYmFkYmxvY2tzKHN0cnVjdCBkaXNrX2luZm8gKmRpc2spDQorew0KKwljaGFyIGJbQkRFVk5B TUVfU0laRV07DQorCWttZW1fY2FjaGVfdCAqc2M7DQorDQorCS8qIGhhc2ggdGFibGUgKi8NCisJ aWYgKChkaXNrLT5iYWRibG9ja19oYXNodGJsID0gKHN0cnVjdCBiYWRibG9jayAqKikgX19nZXRf ZnJlZV9wYWdlcyhHRlBfQVRPTUlDLCBIQVNIX1BBR0VTX09SREVSKSkgPT0gTlVMTCkgew0KKwkg ICAgcHJpbnRrKCJncm93X2JhZGJsb2NrczogX19nZXRfZnJlZV9wYWdlcyBmYWlsZWRcbiIpOw0K KwkgICAgcmV0dXJuIDA7DQorCX0NCisJbWVtc2V0KGRpc2stPmJhZGJsb2NrX2hhc2h0YmwsIDAs IEJCX0hBU0hfUEFHRVMgKiBQQUdFX1NJWkUpOw0KKw0KKwkvKiBiYWRibG9ja3MgZGIgKi8NCisJ c3ByaW50ZihkaXNrLT5jYWNoZV9uYW1lLCAicmFpZDUvJXNfJXNfYmJjIiwgbWRuYW1lKGRpc2st PnJkZXYtPm1kZGV2KSwNCisJCQliZGV2bmFtZShkaXNrLT5yZGV2LT5iZGV2LCBiKSk7DQorCXNj ID0ga21lbV9jYWNoZV9jcmVhdGUoZGlzay0+Y2FjaGVfbmFtZSwNCisJCQkgICAgICAgc2l6ZW9m KHN0cnVjdCBiYWRibG9jayksDQorCQkJICAgICAgIDAsIDAsIE5VTEwsIE5VTEwpOw0KKwlpZiAo IXNjKSB7DQorCQlwcmludGsoImdyb3dfYmFkYmxvY2tzOiBrbWVtX2NhY2hlX2NyZWF0ZSBmYWls ZWRcbiIpOw0KKwkJcmV0dXJuIDE7DQorCX0NCisJZGlzay0+c2xhYl9jYWNoZSA9IHNjOw0KKw0K KwlyZXR1cm4gMDsNCit9DQorDQorc3RhdGljIHZvaWQgc2hyaW5rX2JhZGJsb2NrcyhzdHJ1Y3Qg ZGlza19pbmZvICpkaXNrKQ0KK3sNCisJc3RydWN0IGJhZGJsb2NrICpiYjsNCisJaW50IGo7DQor DQorCS8qIGJhZGJsb2NrcyBkYiAqLw0KKwlmb3IgKGogPSAwOyBqIDwgQkJfTlJfSEFTSDsgaisr KSB7DQorCQliYiA9IGRpc2stPmJhZGJsb2NrX2hhc2h0Ymxbal07DQorCQlmb3IgKDsgYmI7IGJi ID0gYmItPmhhc2hfbmV4dCkNCisJCSAgICAgICAga21lbV9jYWNoZV9mcmVlKGRpc2stPnNsYWJf Y2FjaGUsIGJiKTsNCisJfQ0KKwlrbWVtX2NhY2hlX2Rlc3Ryb3koZGlzay0+c2xhYl9jYWNoZSk7 DQorCWRpc2stPnNsYWJfY2FjaGUgPSBOVUxMOw0KKw0KKwkvKiBoYXNoIHRhYmxlICovDQorCWZy ZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpIGRpc2stPmJhZGJsb2NrX2hhc2h0YmwsIEhBU0hfUEFH RVNfT1JERVIpOw0KK30NCisNCitzdGF0aWMgdm9pZCBzdG9yZV9iYWRibG9jayhzdHJ1Y3QgZGlz a19pbmZvICpkaXNrLCBzZWN0b3JfdCBzZWN0b3IpDQorew0KKwlzdHJ1Y3QgYmFkYmxvY2sgKmJi Ow0KKwlyYWlkNV9jb25mX3QgKmNvbmYgPSAocmFpZDVfY29uZl90ICopIGRpc2stPnJkZXYtPm1k ZGV2LT5wcml2YXRlOw0KKw0KKwliYiA9IGttZW1fY2FjaGVfYWxsb2MoZGlzay0+c2xhYl9jYWNo ZSwgR0ZQX0tFUk5FTCk7DQorCWlmICghYmIpIHsNCisJCXByaW50aygic3RvcmVfYmFkYmxvY2s6 IGttZW1fY2FjaGVfYWxsb2MgZmFpbGVkXG4iKTsNCisJCXJldHVybjsNCisJfQ0KKwltZW1zZXQo YmIsIDAsIHNpemVvZigqYmIpKTsNCisJYmItPnNlY3RvciA9IHNlY3RvcjsNCisNCisJc3Bpbl9s b2NrX2lycSgmY29uZi0+ZGV2aWNlX2xvY2spOw0KKwliYl9pbnNlcnRfaGFzaChkaXNrLCBiYik7 DQorCXNwaW5fdW5sb2NrX2lycSgmY29uZi0+ZGV2aWNlX2xvY2spOw0KK30NCisNCitzdGF0aWMg dm9pZCBkZWxldGVfYmFkYmxvY2soc3RydWN0IGRpc2tfaW5mbyAqZGlzaywgc2VjdG9yX3Qgc2Vj dG9yKQ0KK3sNCisJc3RydWN0IGJhZGJsb2NrICpiYjsNCisJcmFpZDVfY29uZl90ICpjb25mID0g KHJhaWQ1X2NvbmZfdCAqKSBkaXNrLT5yZGV2LT5tZGRldi0+cHJpdmF0ZTsNCisNCisJYmIgPSBm aW5kX2JhZGJsb2NrKGRpc2ssIHNlY3Rvcik7DQorCWlmICghYmIpDQorCQkvKiByZXNldCBvbiB3 cml0ZSdsbCBjYWxsIHVzIGxpa2UgYW4gaWRpb3QgOn0gKi8NCisJCXJldHVybjsNCisJc3Bpbl9s b2NrX2lycSgmY29uZi0+ZGV2aWNlX2xvY2spOw0KKwliYl9yZW1vdmVfaGFzaChiYik7DQorCWtt ZW1fY2FjaGVfZnJlZShkaXNrLT5zbGFiX2NhY2hlLCBiYik7DQorCXNwaW5fdW5sb2NrX2lycSgm Y29uZi0+ZGV2aWNlX2xvY2spOw0KK30NCisNCiANCiBzdGF0aWMgaW5saW5lIHZvaWQgX19yZWxl YXNlX3N0cmlwZShyYWlkNV9jb25mX3QgKmNvbmYsIHN0cnVjdCBzdHJpcGVfaGVhZCAqc2gpDQog ew0KQEAgLTIwMSw3ICszNjIsNyBAQA0KIAlzaC0+cGRfaWR4ID0gcGRfaWR4Ow0KIAlzaC0+c3Rh dGUgPSAwOw0KIA0KLQlmb3IgKGk9ZGlza3M7IGktLTsgKSB7DQorCWZvciAoaT1kaXNrcysxOyBp LS07ICkgew0KIAkJc3RydWN0IHI1ZGV2ICpkZXYgPSAmc2gtPmRldltpXTsNCiANCiAJCWlmIChk ZXYtPnRvcmVhZCB8fCBkZXYtPnRvd3JpdGUgfHwgZGV2LT53cml0dGVuIHx8DQpAQCAtMjkxLDgg KzQ1MiwxMCBAQA0KIA0KIAlzcHJpbnRmKGNvbmYtPmNhY2hlX25hbWUsICJyYWlkNS8lcyIsIG1k bmFtZShjb25mLT5tZGRldikpOw0KIA0KKwkvKiArMTogd2UgbmVlZCBleHRyYSBzcGFjZSBpbiB0 aGUgKnNoLT5kZXZzIGZvciB0aGUgJ2FjdGl2ZSBzcGFyZScgdG8ga2VlcA0KKwkgICAgaGFuZGxl X3N0cmlwZSgpIHNpbXBsZSAqLw0KIAlzYyA9IGttZW1fY2FjaGVfY3JlYXRlKGNvbmYtPmNhY2hl X25hbWUsIA0KLQkJCSAgICAgICBzaXplb2Yoc3RydWN0IHN0cmlwZV9oZWFkKSsoZGV2cy0xKSpz aXplb2Yoc3RydWN0IHI1ZGV2KSwNCisJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBzdHJpcGVfaGVh ZCkrKGRldnMtMSsxKSpzaXplb2Yoc3RydWN0IHI1ZGV2KSwNCiAJCQkgICAgICAgMCwgMCwgTlVM TCwgTlVMTCk7DQogCWlmICghc2MpDQogCQlyZXR1cm4gMTsNCkBAIC0zMDEsMTIgKzQ2NCwxMiBA QA0KIAkJc2ggPSBrbWVtX2NhY2hlX2FsbG9jKHNjLCBHRlBfS0VSTkVMKTsNCiAJCWlmICghc2gp DQogCQkJcmV0dXJuIDE7DQotCQltZW1zZXQoc2gsIDAsIHNpemVvZigqc2gpICsgKGRldnMtMSkq c2l6ZW9mKHN0cnVjdCByNWRldikpOw0KKwkJbWVtc2V0KHNoLCAwLCBzaXplb2YoKnNoKSArIChk ZXZzLTErMSkqc2l6ZW9mKHN0cnVjdCByNWRldikpOw0KIAkJc2gtPnJhaWRfY29uZiA9IGNvbmY7 DQogCQlzcGluX2xvY2tfaW5pdCgmc2gtPmxvY2spOw0KIA0KLQkJaWYgKGdyb3dfYnVmZmVycyhz aCwgY29uZi0+cmFpZF9kaXNrcykpIHsNCi0JCQlzaHJpbmtfYnVmZmVycyhzaCwgY29uZi0+cmFp ZF9kaXNrcyk7DQorCQlpZiAoZ3Jvd19idWZmZXJzKHNoLCBjb25mLT5yYWlkX2Rpc2tzKzEpKSB7 DQorCQkJc2hyaW5rX2J1ZmZlcnMoc2gsIGNvbmYtPnJhaWRfZGlza3MrMSk7DQogCQkJa21lbV9j YWNoZV9mcmVlKHNjLCBzaCk7DQogCQkJcmV0dXJuIDE7DQogCQl9DQpAQCAtMzkxLDEwICs1NTQs MzcgQEANCiAJCX0NCiAjZWxzZQ0KIAkJc2V0X2JpdChSNV9VUFRPREFURSwgJnNoLT5kZXZbaV0u ZmxhZ3MpOw0KKwkJY2xlYXJfYml0KFI1X0ZBSUxFRCwgJnNoLT5kZXZbaV0uZmxhZ3MpOw0KICNl bmRpZgkJDQogCX0gZWxzZSB7DQorCSAgICBjaGFyIGJbQkRFVk5BTUVfU0laRV07DQorDQorCSAg ICAvKg0KKwkJcnVsZSAxLiw6IHRyeSB0byBrZWVwIGFsbCBkaXNrIGluX3N5bmMgZXZlbiBpZiB3 ZSd2ZSBnb3QgcmVhZCBlcnJvcnMsDQorCQljYXVzZSB0aGUgJ2FjdGl2ZSBzcGFyZScgbWF5IGNh biByZWJ1aWxkIGEgY29tcGxldGUgY29sdW1uIGZyb20NCisJCXBhcnRpYWxseSBmYWlsZWQgZHJp dmVzDQorCSAgICAqLw0KKwkgICAgaWYgKGNvbmYtPmRpc2tzW2ldLnJkZXYtPmluX3N5bmMgJiYg Y29uZi0+d29ya2luZ19kaXNrcyA8IGNvbmYtPnJhaWRfZGlza3MpIHsNCisJCS8qIGJhZCBuZXdz LCBidXQga2VlcCBpdCwgY2F1c2UgbWRfZXJyb3IoKSB3b3VsZCBkbyBhIGNvbXBsZXRlDQorCQkg ICAgYXJyYXkgc2h1dGRvd24sIGV2ZW4gaWYgOTkuOTklIGlzIHVzZWFibGUgKi8NCisJCXByaW50 ayhLRVJOX0FMRVJUDQorCQkJInJhaWQ1X2VuZF9yZWFkX3JlcXVlc3Q6IFJlYWQgZmFpbHVyZSAl cyBvbiBzZWN0b3IgJWxsdSAoJWQpIGluIGRlZ3JhZGVkIG1vZGVcbiINCisJCQksYmRldm5hbWUo Y29uZi0+ZGlza3NbaV0ucmRldi0+YmRldiwgYiksDQorCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylz aC0+c2VjdG9yLCBhdG9taWNfcmVhZCgmc2gtPmNvdW50KSk7DQorCQlpZiAoY29uZi0+bWRkZXYt PmN1cnJfcmVzeW5jKQ0KKwkJICAgIC8qIHJhaWQ1X2FkZF9kaXNrKCkgd29uJ3QgYWNjZXB0IHRo ZSBzcGFyZSBhZ2FpbiwgYW5kIHdvbid0IGxvb3AgKi8NCisJCSAgICBjb25mLT5tZGRldi0+ZGVn cmFkZWQgPSAyOw0KKwkgICAgfSBlbHNlIGlmIChjb25mLT5kaXNrc1tpXS5yZGV2LT5pbl9zeW5j ICYmIGNvbmYtPndvcmtpbmdfZGlza3MgPj0gY29uZi0+cmFpZF9kaXNrcykgew0KKwkJLyogd2ls bCBiZSBjb21wdXRlZCAqLw0KKwkJcHJpbnRrKEtFUk5fQUxFUlQNCisJCQkicmFpZDVfZW5kX3Jl YWRfcmVxdWVzdDogUmVhZCBmYWlsdXJlICVzIG9uIHNlY3RvciAlbGx1ICglZCkgaW4gb3B0aW1h bCBtb2RlXG4iDQorCQkJLGJkZXZuYW1lKGNvbmYtPmRpc2tzW2ldLnJkZXYtPmJkZXYsIGIpLA0K KwkJCSh1bnNpZ25lZCBsb25nIGxvbmcpc2gtPnNlY3RvciwgYXRvbWljX3JlYWQoJnNoLT5jb3Vu dCkpOw0KKwkgICAgfSBlbHNlDQorCQkvKiBuZXZlciBoYXBwZW5zICovDQogCQltZF9lcnJvcihj b25mLT5tZGRldiwgY29uZi0+ZGlza3NbaV0ucmRldik7DQotCQljbGVhcl9iaXQoUjVfVVBUT0RB VEUsICZzaC0+ZGV2W2ldLmZsYWdzKTsNCisJICAgIGNsZWFyX2JpdChSNV9VUFRPREFURSwgJnNo LT5kZXZbaV0uZmxhZ3MpOw0KKwkgICAgc2V0X2JpdChSNV9GQUlMRUQsICZzaC0+ZGV2W2ldLmZs YWdzKTsNCiAJfQ0KIAlyZGV2X2RlY19wZW5kaW5nKGNvbmYtPmRpc2tzW2ldLnJkZXYsIGNvbmYt Pm1kZGV2KTsNCiAjaWYgMA0KQEAgLTQzMCwxMyArNjIwLDE4IEBADQogCVBSSU5USygiZW5kX3dy aXRlX3JlcXVlc3QgJWxsdS8lZCwgY291bnQgJWQsIHVwdG9kYXRlOiAlZC5cbiIsIA0KIAkJKHVu c2lnbmVkIGxvbmcgbG9uZylzaC0+c2VjdG9yLCBpLCBhdG9taWNfcmVhZCgmc2gtPmNvdW50KSwN CiAJCXVwdG9kYXRlKTsNCisJLyogc29ycnkNCiAJaWYgKGkgPT0gZGlza3MpIHsNCiAJCUJVRygp Ow0KIAkJcmV0dXJuIDA7DQotCX0NCisJfSovDQogDQogCXNwaW5fbG9ja19pcnFzYXZlKCZjb25m LT5kZXZpY2VfbG9jaywgZmxhZ3MpOw0KIAlpZiAoIXVwdG9kYXRlKQ0KKwkJLyogIHdlIG11c3Qg ZmFpbCB0aGlzIGRyaXZlLCBjYXVzZSByaXNrcyB0aGUgaW50ZWdyaXR5IG9mIGRhdGENCisJCSAg ICBpZiB0aGlzIHNlY3RvciBpcyByZWFkYWJsZS4gbGF0ZXIsIHdlIGNvdWxkIGNoZWNrDQorCQkg ICAgaXMgaXQgdGhpcyByZWFkYWJsZSwgaWYgbm90LCB0aGVuIHdlIGNhbiBoYW5kbGUgaXQgYXMg YQ0KKwkJICAgIGNvbW1vbiBiYWRibG9jay4gKi8NCiAJCW1kX2Vycm9yKGNvbmYtPm1kZGV2LCBj b25mLT5kaXNrc1tpXS5yZGV2KTsNCiANCiAJcmRldl9kZWNfcGVuZGluZyhjb25mLT5kaXNrc1tp XS5yZGV2LCBjb25mLT5tZGRldik7DQpAQCAtNDY3LDMzICs2NjIsMTUwIEBADQogCWRldi0+cmVx LmJpX3ByaXZhdGUgPSBzaDsNCiANCiAJZGV2LT5mbGFncyA9IDA7DQotCWlmIChpICE9IHNoLT5w ZF9pZHgpDQorCWlmIChpICE9IHNoLT5wZF9pZHggJiYgaSA8IHNoLT5yYWlkX2NvbmYtPnJhaWRf ZGlza3MpCS8qIGFjdGl2ZSBzcGFyZT8gKi8NCiAJCWRldi0+c2VjdG9yID0gY29tcHV0ZV9ibG9j a25yKHNoLCBpKTsNCiB9DQogDQorc3RhdGljIGludCByYWlkNV9yZW1vdmVfZGlzayhtZGRldl90 ICptZGRldiwgaW50IG51bWJlcik7DQorc3RhdGljIGludCByYWlkNV9hZGRfZGlzayhtZGRldl90 ICptZGRldiwgbWRrX3JkZXZfdCAqcmRldik7DQorLypzdGF0aWMqLyB2b2lkIGtpY2tfcmRldl9m cm9tX2FycmF5KG1ka19yZGV2X3QgKiByZGV2KTsNCiBzdGF0aWMgdm9pZCBlcnJvcihtZGRldl90 ICptZGRldiwgbWRrX3JkZXZfdCAqcmRldikNCiB7DQogCWNoYXIgYltCREVWTkFNRV9TSVpFXTsN CisJY2hhciBiMltCREVWTkFNRV9TSVpFXTsNCiAJcmFpZDVfY29uZl90ICpjb25mID0gKHJhaWQ1 X2NvbmZfdCAqKSBtZGRldi0+cHJpdmF0ZTsNCiAJUFJJTlRLKCJyYWlkNTogZXJyb3IgY2FsbGVk XG4iKTsNCiANCiAJaWYgKCFyZGV2LT5mYXVsdHkpIHsNCi0JCW1kZGV2LT5zYl9kaXJ0eSA9IDE7 DQotCQlpZiAocmRldi0+aW5fc3luYykgew0KLQkJCWNvbmYtPndvcmtpbmdfZGlza3MtLTsNCi0J CQltZGRldi0+ZGVncmFkZWQrKzsNCi0JCQljb25mLT5mYWlsZWRfZGlza3MrKzsNCi0JCQlyZGV2 LT5pbl9zeW5jID0gMDsNCi0JCQkvKg0KLQkJCSAqIGlmIHJlY292ZXJ5IHdhcyBydW5uaW5nLCBt YWtlIHN1cmUgaXQgYWJvcnRzLg0KLQkJCSAqLw0KLQkJCXNldF9iaXQoTURfUkVDT1ZFUllfRVJS LCAmbWRkZXYtPnJlY292ZXJ5KTsNCi0JCX0NCi0JCXJkZXYtPmZhdWx0eSA9IDE7DQotCQlwcmlu dGsgKEtFUk5fQUxFUlQNCi0JCQkicmFpZDU6IERpc2sgZmFpbHVyZSBvbiAlcywgZGlzYWJsaW5n IGRldmljZS4iDQotCQkJIiBPcGVyYXRpb24gY29udGludWluZyBvbiAlZCBkZXZpY2VzXG4iLA0K LQkJCWJkZXZuYW1lKHJkZXYtPmJkZXYsYiksIGNvbmYtPndvcmtpbmdfZGlza3MpOw0KKwkJaW50 IG1kZGlza3MgPSAwOw0KKwkJbWRrX3JkZXZfdCAqcmQ7DQorCQltZGtfcmRldl90ICpyZGV2cyA9 IE5VTEw7DQorCQlzdHJ1Y3QgbGlzdF9oZWFkICpydG1wOw0KKwkJaW50IGk7DQorDQorCQlJVEVS QVRFX1JERVYobWRkZXYscmQscnRtcCkNCisJCSAgICB7DQorCQkJcHJpbnRrKEtFUk5fSU5GTyAi bWRkZXYlZDogJXNcbiIsIG1kZGlza3MsIGJkZXZuYW1lKHJkLT5iZGV2LGIpKTsNCisJCQltZGRp c2tzKys7DQorCQkgICAgfQ0KKwkJZm9yIChpID0gMDsgKHJkID0gY29uZi0+ZGlza3NbaV0ucmRl dik7IGkrKykgew0KKwkJCXByaW50ayhLRVJOX0lORk8gInI1ZGV2JWQ6ICVzXG4iLCBpLCBiZGV2 bmFtZShyZC0+YmRldixiKSk7DQorCQl9DQorCQlJVEVSQVRFX1JERVYobWRkZXYscmQscnRtcCkN CisJCSAgICB7DQorCQkJcmRldnMgPSByZDsNCisJCQlicmVhazsNCisJCSAgICB9DQorcHJpbnRr KCIlZCAlZCA+ICVkICVkIGluczolZCAlcFxuIiwNCisJbWRkZXYtPnJhaWRfZGlza3MsIG1kZGlz a3MsIGNvbmYtPnJhaWRfZGlza3MsIG1kZGV2LT5kZWdyYWRlZCwgcmRldi0+aW5fc3luYywgcmRl dnMpOw0KKwkJaWYgKGNvbmYtPmRpc2tzW2NvbmYtPnJhaWRfZGlza3NdLnJkZXYgPT0gcmRldiAm JiByZGV2LT5pbl9zeW5jKSB7DQorCQkgICAgLyogaW5fc3luYywgYnV0IG11c3QgYmUgaGFuZGxl ZCBzcGVjaWFsbHksIGRvbid0IGxldCAnZGVncmFkZWQrKycgKi8NCisJCSAgICBwcmludGsgKEtF Uk5fQUxFUlQgImFjdGl2ZSBzcGFyZSBoYXMgZmFpbGVkICVzIChpbl9zeW5jKVxuIiwNCisJCQkJ YmRldm5hbWUocmRldi0+YmRldixiKSk7DQorCQkgICAgbWRkZXYtPnNiX2RpcnR5ID0gMTsNCisJ CSAgICByZGV2LT5pbl9zeW5jID0gMDsNCisJCSAgICByZGV2LT5mYXVsdHkgPSAxOw0KKwkJICAg IHJkZXYtPnJhaWRfZGlzayA9IGNvbmYtPnJhaWRfZGlza3M7CQkvKiBtZSBhcyBteXNlbGYsIGFn YWluIDspICovDQorCQkgICAgY29uZi0+bWlycm9yaXQgPSAtMTsNCisJCX0gZWxzZSBpZiAobWRk aXNrcyA+IGNvbmYtPnJhaWRfZGlza3MgJiYgIW1kZGV2LT5kZWdyYWRlZCAmJiByZGV2LT5pbl9z eW5jKSB7DQorCQkgICAgLyogaGF2ZSBhY3RpdmUgc3BhcmUsIGFycmF5IGlzIG9wdGltYWwsIHJl bW92ZWQgZGlzayBtZW1iZXINCisJCQkgICAgb2YgaXQgKGJ1dCBub3QgdGhlIGFjdGl2ZSBzcGFy ZSkgKi8NCisJCSAgICBpZiAocmRldi0+cmFpZF9kaXNrID09IGNvbmYtPm1pcnJvcml0ICYmIGNv bmYtPmRpc2tzW2NvbmYtPnJhaWRfZGlza3NdLnJkZXYpIHsNCisJCQlpZiAoIWNvbmYtPmRpc2tz W2NvbmYtPnJhaWRfZGlza3NdLnJkZXYtPmluX3N5bmMpIHsNCisJCQkgICAgcHJpbnRrKEtFUk5f QUxFUlQgImRpc2sgJXMgZmFpbGVkIGFuZCBhY3RpdmUgc3BhcmUgaXNuJ3QgaW5fc3luYyB5ZXQs IHJlYWRkIGFzIG5vcm1hbCBzcGFyZVxuIiwNCisJCQkJCWJkZXZuYW1lKHJkZXYtPmJkZXYsYikp Ow0KKwkJCSAgICBjb25mLT5taXJyb3JpdCA9IC0xOw0KKwkJCSAgICBnb3RvIGxldGl0Z287DQor CQkJfSBlbHNlIHsNCisJCQkgICAgaW50IHJldDsNCisNCisJCQkgICAgLyogaG90IHJlcGxhY2Ug dGhlIG1pcnJvcmVkIGRyaXZlIHdpdGggdGhlICdhY3RpdmUgc3BhcmUnDQorCQkJCXRoaXMgaXMg cmVhbGx5ICJob3QiLCBJIGNhbid0IHNlZSBjbGVhcmx5IHRoZSB0aGluZ3MNCisJCQkJd2hhdCBJ IGhhdmUgdG8gZG8gaGVyZS4gOn0NCisJCQkJcHJheS4gKi8NCisNCisJCQkgICAgcHJpbnRrKEtF Uk5fQUxFUlQgInJlcGxhY2UgJXMgd2l0aCBpbl9zeW5jIGFjdGl2ZSBzcGFyZSAlc1xuIiwNCisJ CQkJICAgIGJkZXZuYW1lKHJkZXYtPmJkZXYsYiksDQorCQkJCSAgICBiZGV2bmFtZShyZGV2cy0+ YmRldixiMikpOw0KKwkJCSAgICByZGV2LT5pbl9zeW5jID0gMDsNCisJCQkgICAgcmRldi0+ZmF1 bHR5ID0gMTsNCisNCisJCQkgICAgY29uZi0+bWlycm9yaXQgPSAtMTsNCisNCisJCQkgICAgLyog bXkgR29kLCBhbSBJIHNhbmU/ICovDQorCQkJICAgIHdoaWxlICgoaSA9IGF0b21pY19yZWFkKCZy ZGV2LT5ucl9wZW5kaW5nKSkpIHsNCisJCQkJcHJpbnRrKCJ3YWl0aW5nIGZvciBkaXNrICVkIC4u ICVkXG4iLA0KKwkJCQkJcmRldi0+cmFpZF9kaXNrLCBpKTsNCisJCQkgICAgfQ0KKwkJCSAgICBy ZXQgPSByYWlkNV9yZW1vdmVfZGlzayhtZGRldiwgcmRldi0+cmFpZF9kaXNrKTsNCisJCQkgICAg aWYgKHJldCkgew0KKwkJCQlwcmludGsoS0VSTl9FUlIgInJhaWQ1X3JlbW92ZV9kaXNrMTogYnVz eT8hXG4iKTsNCisJCQkJcmV0dXJuOwkvLyBzaG91bGQgbm90aGluZyB0byBkbw0KKwkJCSAgICB9 DQorDQorCQkJICAgIHJkID0gY29uZi0+ZGlza3NbY29uZi0+cmFpZF9kaXNrc10ucmRldjsNCisJ CQkgICAgd2hpbGUgKChpID0gYXRvbWljX3JlYWQoJnJkLT5ucl9wZW5kaW5nKSkpIHsNCisJCQkJ cHJpbnRrKCJ3YWl0aW5nIGZvciBkaXNrICVkIC4uICVkXG4iLA0KKwkJCQkJY29uZi0+cmFpZF9k aXNrcywgaSk7DQorCQkJICAgIH0NCisJCQkgICAgcmQtPmluX3N5bmMgPSAwOw0KKwkJCSAgICBy ZXQgPSByYWlkNV9yZW1vdmVfZGlzayhtZGRldiwgY29uZi0+cmFpZF9kaXNrcyk7DQorCQkJICAg IGlmIChyZXQpIHsNCisJCQkJcHJpbnRrKEtFUk5fRVJSICJyYWlkNV9yZW1vdmVfZGlzazI6IGJ1 c3k/IVxuIik7DQorCQkJCXJldHVybjsJLy8gLi4NCisJCQkgICAgfQ0KKw0KKwkJCSAgICByZXQg PSByYWlkNV9hZGRfZGlzayhtZGRldiwgcmQpOw0KKwkJCSAgICBpZiAoIXJldCkgew0KKwkJCQlw cmludGsoS0VSTl9FUlIgInJhaWQ1X2FkZF9kaXNrOiBubyBmcmVlIHNsb3Q/IVxuIik7DQorCQkJ CXJldHVybjsJLy8gLi4NCisJCQkgICAgfQ0KKwkJCSAgICByZC0+aW5fc3luYyA9IDE7DQorDQor CQkJICAgIC8qIGJvcnJvd2VkIGZyb20gaG90X3JlbW92ZV9kaXNrKCkgKi8NCisJCQkgICAga2lj a19yZGV2X2Zyb21fYXJyYXkocmRldik7DQorCQkJICAgIG1kZGV2LT5zYl9kaXJ0eSA9IDE7DQor CQkJfQ0KKwkJICAgIH0gZWxzZSB7DQorCQkJLyogaW5fc3luYyBkaXNrIGZhaWxlZCAoIWRlZ3Jh ZGVkKSwgaGF2ZSBhIHNwYXJlLCBzdGFydGluZw0KKwkJCSAgICBwcm9hY3RpdmUgbWlycm9yaW5n ICovDQorCQkJcHJpbnRrKEtFUk5fQUxFUlQgInJlc3luYyBmcm9tICVzIHRvIHNwYXJlICVzICgl ZClcbiIsDQorCQkJCWJkZXZuYW1lKHJkZXYtPmJkZXYsYiksDQorCQkJICAgICAgICBiZGV2bmFt ZShyZGV2cy0+YmRldixiMiksDQorCQkJCWNvbmYtPnJhaWRfZGlza3MpOw0KKwkJCWlmIChjb25m LT5taXJyb3JpdCA9PSAtMSkgew0KKwkJCQljb25mLT5taXJyb3JpdCA9IHJkZXYtPnJhaWRfZGlz azsNCisNCisJCQkJbWRkZXYtPmRlZ3JhZGVkKys7CS8qIHRvIGNhbGwgcmFpZDVfaG90X2FkZF9k aXNrKCksIHJlc2V0IHRoZXJlICovDQorCQkJfSBlbHNlIHsNCisJCQkJcHJpbnRrKEtFUk5fQUxF UlQgInByb2FjdGl2ZSBtaXJyb3JpbmcgYWxyZWFkeSBydW5uaW5nLCBsZXQgaXQgZ28uLlxuIik7 DQorCQkJCWdvdG8gbGV0aXRnbzsNCisJCQl9DQorCQkgICAgfQ0KKwkJfSBlbHNlDQorCQl7DQor bGV0aXRnbzoNCisJCSAgICBtZGRldi0+c2JfZGlydHkgPSAxOw0KKwkJICAgIGlmIChyZGV2LT5p bl9zeW5jKSB7DQorCQkJICAgIGNvbmYtPndvcmtpbmdfZGlza3MtLTsNCisJCQkgICAgbWRkZXYt PmRlZ3JhZGVkKys7DQorCQkJICAgIGNvbmYtPmZhaWxlZF9kaXNrcysrOw0KKwkJCSAgICByZGV2 LT5pbl9zeW5jID0gMDsNCisJCQkgICAgaWYgKGNvbmYtPm1pcnJvcml0ICE9IC0xKSB7DQorCQkJ CSAgICBwcmludGsoInN0b3AgcHJvYWN0aXZlIG1pcnJvcmluZ1xuIik7DQorCQkJCSAgICBjb25m LT5taXJyb3JpdCA9IC0xOw0KKwkJCSAgICB9DQorCQkJICAgIC8qDQorCQkJICAgICAqIGlmIHJl Y292ZXJ5IHdhcyBydW5uaW5nLCBtYWtlIHN1cmUgaXQgYWJvcnRzLg0KKwkJCSAgICAgKi8NCisJ CQkgICAgc2V0X2JpdChNRF9SRUNPVkVSWV9FUlIsICZtZGRldi0+cmVjb3ZlcnkpOw0KKwkJICAg IH0NCisJCSAgICByZGV2LT5mYXVsdHkgPSAxOw0KKwkJICAgIHByaW50ayAoS0VSTl9BTEVSVA0K KwkJCSAgICAicmFpZDU6IERpc2sgZmFpbHVyZSBvbiAlcywgZGlzYWJsaW5nIGRldmljZS4iDQor CQkJICAgICIgT3BlcmF0aW9uIGNvbnRpbnVpbmcgb24gJWQgZGV2aWNlc1xuIiwNCisJCQkgICAg YmRldm5hbWUocmRldi0+YmRldixiKSwgY29uZi0+d29ya2luZ19kaXNrcyk7DQorCQl9DQogCX0N CiB9CQ0KIA0KQEAgLTg1OSw2ICsxMTcxLDYyIEBADQogfQ0KIA0KIA0KK3N0YXRpYyBpbnQgcmFp ZDVfc3BhcmVfYWN0aXZlKG1kZGV2X3QgKm1kZGV2KTsNCisNCitzdGF0aWMgdm9pZCByYWlkNV9l ZWggKG1kZGV2X3QgKm1kZGV2KQ0KK3sNCisJcmFpZDVfY29uZl90ICpjb25mID0gbWRkZXZfdG9f Y29uZihtZGRldik7DQorCWludCBpID0gY29uZi0+bWRkZXYtPmVlaF9kYXRhLmZhaWxlZF9udW07 DQorCXN0cnVjdCBkaXNrX2luZm8gKmRpc2sgPSAmY29uZi0+ZGlza3NbaV07DQorCWludCBqOw0K Kw0KKwkvKiBzdXNwZW5kIElPOyB0b2RvOiB3ZWxsLCB3ZSBzaG91bGQgd2FsayBvdmVyIG9uIGRp c2tzIGFuZCB3YWl0aW5nIHRpbGwNCisJICAgIChucl9wZW5kaW5nID4gMCkgKi8NCisJcHJpbnRr KCJyYWlkNV91c2VyZWggYWN0aXZlXG4iKTsNCisJew0KKwkgICAgY2hhciBiW0JERVZOQU1FX1NJ WkVdOw0KKwkgICAgY2hhciAqYXJndltdID0geyAiL3NiaW4vbWRldmVudCIsIG1kbmFtZShtZGRl diksICJkcml2ZWZhaWwiLA0KKwkJCQliZGV2bmFtZShkaXNrLT5yZGV2LT5iZGV2LCBiKSwgTlVM TCB9Ow0KKwkgICAgc3RhdGljIGNoYXIgKmVudnBbXSA9IHsgIkhPTUU9LyIsDQorCQkJICAgICJU RVJNPWxpbnV4IiwNCisJCQkgICAgIlBBVEg9L3NiaW46L3Vzci9zYmluOi9iaW46L3Vzci9iaW4i LA0KKwkJCSAgICBOVUxMIH07DQorCSAgICBpbnQgcmV0Ow0KKw0KKwkgICAgcmV0ID0gY2FsbF91 c2VybW9kZWhlbHBlcigiL3NiaW4vbWRldmVudCIsIGFyZ3YsIGVudnAsIDEvKndhaXQqLyk7DQor CSAgICByZXQgPSByZXQgPj4gODsNCisJICAgIGlmIChyZXQgPCAwIHx8IHJldCA+IDEpIHsNCisJ CSAgICBwcmludGsoS0VSTl9BTEVSVCAiL3NiaW4vbWRldmVudCBmYWlsZWQ6ICVkXG4iLCByZXQp Ow0KKwkJICAgIG1kX2Vycm9yKG1kZGV2LCBkaXNrLT5yZGV2KTsNCisJCSAgICAvKiAodGhlIHJh aWQ1X3JlbW92ZV9kaXNrIGFuZCByYWlkNV9hZGRfZGlzayB3YXNuJ3QgY2FsbGVkIHlldCkgKi8N CisJICAgIH0NCisNCisJICAgIHN3aXRjaCAocmV0KSB7DQorCQljYXNlIDE6CQkvKiByZXNldCBi YWRibG9jayBjYWNoZSAobGF0ZXI6IHJld3JpdGUgYmFkIGJsb2Nrcz8pICovDQorCQkgICAgcHJp bnRrKEtFUk5fSU5GTyAicmVzZXR0aW5nIGJhZGJsb2NrcyBjYWNoZVxuIik7DQorCQkgICAgZm9y IChqID0gMDsgaiA8IEJCX05SX0hBU0g7IGorKykgew0KKwkJCSAgICBzdHJ1Y3QgYmFkYmxvY2sg KmJiLCAqYmJwcmV2ID0gTlVMTDsNCisJCQkgICAgYmIgPSBkaXNrLT5iYWRibG9ja19oYXNodGJs W2pdOw0KKwkJCSAgICBmb3IgKDsgYmI7IGJiID0gYmItPmhhc2hfbmV4dCkgew0KKwkJCQkgICAg aWYgKGJicHJldikNCisJCQkJCSAgICBrbWVtX2NhY2hlX2ZyZWUoZGlzay0+c2xhYl9jYWNoZSwg YmJwcmV2KTsNCisJCQkJICAgIGJiX3JlbW92ZV9oYXNoKGJiKTsNCisJCQkJICAgIGJicHJldiA9 IGJiOw0KKwkJCSAgICB9DQorCQkJICAgIGlmIChiYnByZXYpDQorCQkJCSAgICBrbWVtX2NhY2hl X2ZyZWUoZGlzay0+c2xhYl9jYWNoZSwgYmJwcmV2KTsNCisJCSAgICB9DQorCQkgICAgYnJlYWs7 DQorCQlkZWZhdWx0Og0KKwkJICAgIGJyZWFrOw0KKwkgICAgfQ0KKw0KKwkgICAgbWRkZXYtPmVl aF9kYXRhLmZhaWxlZF9udW0gPSAtMTsJLyogdW5yZWdpc3RlciBtZSAqLw0KKwkgICAgbWRfd2Fr ZXVwX3RocmVhZChtZGRldi0+dGhyZWFkKTsNCisJfQ0KKwlwcmludGsoInJhaWQ1X3VzZXJlaCBl eGl0ZWRcbiIpOw0KK30NCisNCiAvKg0KICAqIGhhbmRsZV9zdHJpcGUgLSBkbyB0aGluZ3MgdG8g YSBzdHJpcGUuDQogICoNCkBAIC04ODgsMjEgKzEyNTYsMzcgQEANCiAJaW50IGxvY2tlZD0wLCB1 cHRvZGF0ZT0wLCB0b19yZWFkPTAsIHRvX3dyaXRlPTAsIGZhaWxlZD0wLCB3cml0dGVuPTA7DQog CWludCBub25fb3ZlcndyaXRlID0gMDsNCiAJaW50IGZhaWxlZF9udW09MDsNCisJaW50IGFzcGFy ZT0wLCBhc3BhcmVudW09LTE7DQorCXN0cnVjdCBkaXNrX2luZm8gKmFzcGFyZWRldjsNCiAJc3Ry dWN0IHI1ZGV2ICpkZXY7DQogDQogCVBSSU5USygiaGFuZGxpbmcgc3RyaXBlICVsbHUsIGNudD0l ZCwgcGRfaWR4PSVkXG4iLA0KIAkJKHVuc2lnbmVkIGxvbmcgbG9uZylzaC0+c2VjdG9yLCBhdG9t aWNfcmVhZCgmc2gtPmNvdW50KSwNCiAJCXNoLT5wZF9pZHgpOw0KIA0KKwlpZiAoY29uZi0+bWRk ZXYtPmVlaF90aHJlYWQpIHsNCisJCVBSSU5USygicGFzcyB0aGUgc3RyaXBlLCBlZWggaXMgYWN0 aXZlXG4iKTsNCisJCXNldF9iaXQoU1RSSVBFX0hBTkRMRSwgJnNoLT5zdGF0ZSk7DQorCSAgICAg ICAgcmV0dXJuOw0KKwl9DQorDQogCXNwaW5fbG9jaygmc2gtPmxvY2spOw0KIAljbGVhcl9iaXQo U1RSSVBFX0hBTkRMRSwgJnNoLT5zdGF0ZSk7DQogCWNsZWFyX2JpdChTVFJJUEVfREVMQVlFRCwg JnNoLT5zdGF0ZSk7DQogDQogCXN5bmNpbmcgPSB0ZXN0X2JpdChTVFJJUEVfU1lOQ0lORywgJnNo LT5zdGF0ZSk7DQorCWFzcGFyZWRldiA9ICZjb25mLT5kaXNrc1tjb25mLT5yYWlkX2Rpc2tzXTsN CisJaWYgKCFjb25mLT5tZGRldi0+ZGVncmFkZWQgJiYgYXNwYXJlZGV2LT5yZGV2ICYmICFhc3Bh cmVkZXYtPnJkZXYtPmZhdWx0eSAmJg0KKwkJY29uZi0+bWlycm9yaXQgIT0gLTEpIHsNCisJICAg IGFzcGFyZSsrOw0KKwkgICAgYXNwYXJlbnVtID0gc2gtPnJhaWRfY29uZi0+bWlycm9yaXQ7DQor CSAgICBQUklOVEsoImhhcyBhc3BhcmUgKCVkKVxuIiwgYXNwYXJlbnVtKTsNCisJfQ0KIAkvKiBO b3cgdG8gbG9vayBhcm91bmQgYW5kIHNlZSB3aGF0IGNhbiBiZSBkb25lICovDQogDQotCWZvciAo aT1kaXNrczsgaS0tOyApIHsNCisJZm9yIChpPWRpc2tzK2FzcGFyZTsgaS0tOyApIHsNCiAJCW1k a19yZGV2X3QgKnJkZXY7DQorCQlzdHJ1Y3QgYmFkYmxvY2sgKmJiID0gTlVMTDsNCiAJCWRldiA9 ICZzaC0+ZGV2W2ldOw0KIAkJY2xlYXJfYml0KFI1X0luc3luYywgJmRldi0+ZmxhZ3MpOw0KIAkJ Y2xlYXJfYml0KFI1X1N5bmNpbywgJmRldi0+ZmxhZ3MpOw0KQEAgLTk0NSwxMiArMTMyOSw2MiBA QA0KIAkJfQ0KIAkJaWYgKGRldi0+d3JpdHRlbikgd3JpdHRlbisrOw0KIAkJcmRldiA9IGNvbmYt PmRpc2tzW2ldLnJkZXY7IC8qIEZJWE1FLCBzaG91bGQgSSBiZSBsb29raW5nIHJkZXYgKi8NCi0J CWlmICghcmRldiB8fCAhcmRldi0+aW5fc3luYykgew0KKwkJaWYgKHJkZXYgJiYgcmRldi0+aW5f c3luYyAmJg0KKwkJICAgICF0ZXN0X2JpdChSNV9VUFRPREFURSwgJmRldi0+ZmxhZ3MpICYmDQor CQkgICAgIXRlc3RfYml0KFI1X0xPQ0tFRCwgJmRldi0+ZmxhZ3MpKSB7DQorCQkJLyogLi5wb3Rl bnRpYWxseSBkZXNlcnZlZCB0byByZWFkLCB3ZSBtdXN0IGNoZWNrIGl0DQorCQkJICAgIGNoZWNr bWUsIGl0IGNvdWxkIGJlIGEgYmlnIHBlcmZvcm1hbmNlIHBlbmFsdHkgaWYgY2FsbGVkDQorCQkJ CXdpdGhvdXQgYSBnb29kIHJlYXNvbiEgaXQncyBzZWVtcyBvayBmb3Igbm93DQorCQkJKi8NCisJ CQlQUklOVEsoImZpbmRfYmFkYmxvY2sgJWQ6ICVsbHVcbiIsIGksIHNoLT5zZWN0b3IpOw0KKwkJ CWJiID0gZmluZF9iYWRibG9jaygmY29uZi0+ZGlza3NbaV0sIHNoLT5zZWN0b3IpOw0KKwkJfQ0K KwkJaWYgKCFyZGV2IHx8ICFyZGV2LT5pbl9zeW5jDQorCQkgICAgfHwgKHRlc3RfYml0KFI1X0ZB SUxFRCwgJmRldi0+ZmxhZ3MpICYmICF0ZXN0X2JpdChSNV9VUFRPREFURSwgJmRldi0+ZmxhZ3Mp KQ0KKwkJICAgIHx8IGJiKSB7DQorCQkJaWYgKHJkZXYgJiYgcmRldi0+aW5fc3luYw0KKwkJCSAg ICAmJiAhYmIgJiYgdGVzdF9iaXQoUjVfRkFJTEVELCAmZGV2LT5mbGFncykpIHsNCisJCQkJLyog dGFrZSBhbiBhY3Rpb24gb25seSBpZiBpdCdzIGEgX25ld18gYmFkIGJsb2NrDQorCQkJCSAgICBh bmQgbm90IHdoaWxlIHByb2FjdGl2ZSBtaXJyb3JpbmcgaXMgcnVubmluZyAqLw0KKwkJCQlpZiAo KCFhc3BhcmUgfHwgKGFzcGFyZSAmJiBhc3BhcmVkZXYtPnJkZXYtPmluX3N5bmMvKmFzcGFyZW51 bSAhPSBpKi8pKQ0KKwkJCQkgICAgJiYgY291bnRfYmFkYmxvY2tzKCZjb25mLT5kaXNrc1tpXSkg Pj0gc3lzY3RsX2JhZGJsb2NrX3RvbGVyYW5jZSkgew0KKwkJCQkJY2hhciBiW0JERVZOQU1FX1NJ WkVdOw0KKw0KKwkJCQkJcHJpbnRrKEtFUk5fQUxFUlQgInRvbyBtYW55IGJhZGJsb2NrcyAoJWx1 KSBvbiBkZXZpY2UgJXMsIG1hcmtpbmcgYXMgZmFpbGVkIFslZF1cbiIsDQorCQkJCQkJICAgIGNv dW50X2JhZGJsb2NrcygmY29uZi0+ZGlza3NbaV0pICsgMSwgYmRldm5hbWUoY29uZi0+ZGlza3Nb aV0ucmRldi0+YmRldiwgYiksDQorCQkJCQkJICAgIGF0b21pY19yZWFkKCZyZGV2LT5ucl9wZW5k aW5nKSk7DQorI2lmbmRlZiBVU0VSRUgNCisJCQkJCW1kX2Vycm9yKGNvbmYtPm1kZGV2LCBjb25m LT5kaXNrc1tpXS5yZGV2KTsNCisjZWxzZQ0KKwkJCQkJaWYgKCFjb25mLT5tZGRldi0+ZWVoX3Ro cmVhZCkgew0KKwkJCQkJICAgIGNvbmYtPm1kZGV2LT5lZWhfdGhyZWFkID0gbWRfcmVnaXN0ZXJf dGhyZWFkKHJhaWQ1X2VlaCwgY29uZi0+bWRkZXYsICIlc19lZWgiKTsNCisJCQkJCSAgICBpZiAo IWNvbmYtPm1kZGV2LT5lZWhfdGhyZWFkKSB7DQorCQkJCQkJcHJpbnRrKEtFUk5fRVJSIA0KKwkJ CQkJCSAgICAicmFpZDU6IGNvdWxkbid0IGFsbG9jYXRlIGV4dGVybmFsIGVycm9yIGhhbmRsZXIg dGhyZWFkIGZvciAlc1xuIiwNCisJCQkJCQkgICAgbWRuYW1lKGNvbmYtPm1kZGV2KSk7DQorCQkJ CQkJbWRfZXJyb3IoY29uZi0+bWRkZXYsIGNvbmYtPmRpc2tzW2ldLnJkZXYpOw0KKwkJCQkJICAg IH0gZWxzZSAgew0KKwkJCQkJCWNvbmYtPm1kZGV2LT5lZWhfZGF0YS5mYWlsZWRfbnVtID0gaTsN CisJCQkJCQltZF93YWtldXBfdGhyZWFkKGNvbmYtPm1kZGV2LT5lZWhfdGhyZWFkKTsNCisJCQkJ CSAgICB9DQorCQkJCQl9DQorI2VuZGlmDQorCQkJCX0NCisJCQkJaWYgKHRlc3RfYml0KFI1X0ZB SUxFRCwgJmRldi0+ZmxhZ3MpKSB7DQorCQkJCQlQUklOVEsoInN0b3JlX2JhZGJsb2NrICVkOiAl bGx1XG4iLCBpLCBzaC0+c2VjdG9yKTsNCisJCQkJCXN0b3JlX2JhZGJsb2NrKCZjb25mLT5kaXNr c1tpXSwgc2gtPnNlY3Rvcik7DQorCQkJCX0NCisJCQl9DQogCQkJZmFpbGVkKys7DQogCQkJZmFp bGVkX251bSA9IGk7DQotCQl9IGVsc2UNCisJCQlQUklOVEsoImRldmljZSAlZCBmYWlsZWQgZm9y IHRoaXMgc3RyaXBlIHIlcCB3JXBcbiIsIGksIGRldi0+dG9yZWFkLCBkZXYtPnRvd3JpdGUpOw0K KwkJfSBlbHNlIHsNCiAJCQlzZXRfYml0KFI1X0luc3luYywgJmRldi0+ZmxhZ3MpOw0KKwkJfQ0K IAl9DQorCWlmIChhc3BhcmUgJiYgZmFpbGVkID4gMSkNCisJICAgIGZhaWxlZC0tOwkvKiBmYWls ZWQgPSAxIG1lYW5zICJhbGwgb2siIGlmIHdlJ3ZlIGFzcGFyZSwgdGhpcyBpcyBzaW1wbGVzdA0K KwkJCSAgICBtZXRob2QgdG8gZG8gb3VyIHdvcmsgKi8NCiAJUFJJTlRLKCJsb2NrZWQ9JWQgdXB0 b2RhdGU9JWQgdG9fcmVhZD0lZCINCiAJCSIgdG9fd3JpdGU9JWQgZmFpbGVkPSVkIGZhaWxlZF9u dW09JWRcbiIsDQogCQlsb2NrZWQsIHVwdG9kYXRlLCB0b19yZWFkLCB0b193cml0ZSwgZmFpbGVk LCBmYWlsZWRfbnVtKTsNCkBAIC0xMDEzLDYgKzE0NDcsNyBAQA0KIAkJc3Bpbl91bmxvY2tfaXJx KCZjb25mLT5kZXZpY2VfbG9jayk7DQogCX0NCiAJaWYgKGZhaWxlZCA+IDEgJiYgc3luY2luZykg ew0KKwkJcHJpbnRrKEtFUk5fQUxFUlQgInN5bmMgc3RvcHBlZCBieSBJTyBlcnJvclxuIik7DQog CQltZF9kb25lX3N5bmMoY29uZi0+bWRkZXYsIFNUUklQRV9TRUNUT1JTLDApOw0KIAkJY2xlYXJf Yml0KFNUUklQRV9TWU5DSU5HLCAmc2gtPnN0YXRlKTsNCiAJCXN5bmNpbmcgPSAwOw0KQEAgLTEx ODQsNiArMTYxOSwyNiBAQA0KIAkJCQkJUFJJTlRLKCJXcml0aW5nIGJsb2NrICVkXG4iLCBpKTsN CiAJCQkJCWxvY2tlZCsrOw0KIAkJCQkJc2V0X2JpdChSNV9XYW50d3JpdGUsICZzaC0+ZGV2W2ld LmZsYWdzKTsNCisJCQkJCWlmIChhc3BhcmUgJiYgaSA9PSBhc3BhcmVudW0pIHsNCisJCQkJCSAg ICBjaGFyICpwcywgKnBkOw0KKw0KKwkJCQkJICAgIC8qIG1pcnJvcmluZyB0aGlzIG5ldyBibG9j ayAqLw0KKwkJCQkJICAgIFBSSU5USygiV3JpdGluZyB0byBhc3BhcmUgdG9vICVkLT4lZFxuIiwN CisJCQkJCQkJaSwgY29uZi0+cmFpZF9kaXNrcyk7DQorCQkJCQkgICAgLyppZiAodGVzdF9iaXQo UjVfTE9DS0VELCAmc2gtPmRldltjb25mLT5yYWlkX2Rpc2tzXS5mbGFncykpIHsNCisJCQkJCQlw cmludGsoImJhem1lZywgZXogbG9ra29sdDEhISFcbiIpOw0KKwkJCQkJICAgIH0qLw0KKwkJCQkJ ICAgIHBzID0gcGFnZV9hZGRyZXNzKHNoLT5kZXZbaV0ucGFnZSk7DQorCQkJCQkgICAgcGQgPSBw YWdlX2FkZHJlc3Moc2gtPmRldltjb25mLT5yYWlkX2Rpc2tzXS5wYWdlKTsNCisJCQkJCSAgICAv KiBiZXR0ZXIgaWRlYT8gKi8NCisJCQkJCSAgICBtZW1jcHkocGQsIHBzLCBTVFJJUEVfU0laRSk7 DQorCQkJCQkgICAgc2V0X2JpdChSNV9MT0NLRUQsICZzaC0+ZGV2W2NvbmYtPnJhaWRfZGlza3Nd LmZsYWdzKTsNCisJCQkJCSAgICBzZXRfYml0KFI1X1dhbnR3cml0ZSwgJnNoLT5kZXZbY29uZi0+ cmFpZF9kaXNrc10uZmxhZ3MpOw0KKwkJCQkJfQ0KKwkJCQkJaWYgKGNvbmYtPmRpc2tzW2ldLnJk ZXYgJiYgY29uZi0+ZGlza3NbaV0ucmRldi0+aW5fc3luYykgew0KKwkJCQkJICAgIFBSSU5USygi cmVzZXQgYmFkYmxvY2sgb24gJWQ6ICVsbHVcbiIsIGksIHNoLT5zZWN0b3IpOw0KKwkJCQkJICAg IGRlbGV0ZV9iYWRibG9jaygmY29uZi0+ZGlza3NbaV0sIHNoLT5zZWN0b3IpOw0KKwkJCQkJfQ0K IAkJCQkJaWYgKCF0ZXN0X2JpdChSNV9JbnN5bmMsICZzaC0+ZGV2W2ldLmZsYWdzKQ0KIAkJCQkJ ICAgIHx8IChpPT1zaC0+cGRfaWR4ICYmIGZhaWxlZCA9PSAwKSkNCiAJCQkJCQlzZXRfYml0KFNU UklQRV9JTlNZTkMsICZzaC0+c3RhdGUpOw0KQEAgLTEyMjAsMjAgKzE2NzUsMzkgQEANCiAJCQlp ZiAoZmFpbGVkPT0wKQ0KIAkJCQlmYWlsZWRfbnVtID0gc2gtPnBkX2lkeDsNCiAJCQkvKiBzaG91 bGQgYmUgYWJsZSB0byBjb21wdXRlIHRoZSBtaXNzaW5nIGJsb2NrIGFuZCB3cml0ZSBpdCB0byBz cGFyZSAqLw0KKwkJCWlmIChhc3BhcmUpDQorCQkJICAgIGZhaWxlZF9udW0gPSBhc3BhcmVudW07 DQogCQkJaWYgKCF0ZXN0X2JpdChSNV9VUFRPREFURSwgJnNoLT5kZXZbZmFpbGVkX251bV0uZmxh Z3MpKSB7DQogCQkJCWlmICh1cHRvZGF0ZSsxICE9IGRpc2tzKQ0KIAkJCQkJQlVHKCk7DQogCQkJ CWNvbXB1dGVfYmxvY2soc2gsIGZhaWxlZF9udW0pOw0KIAkJCQl1cHRvZGF0ZSsrOw0KIAkJCX0N CisJCQlpZiAoYXNwYXJlKSB7DQorCQkJICAgIGNoYXIgKnBzLCAqcGQ7DQorDQorCQkJICAgIHBz ID0gcGFnZV9hZGRyZXNzKHNoLT5kZXZbZmFpbGVkX251bV0ucGFnZSk7DQorCQkJICAgIHBkID0g cGFnZV9hZGRyZXNzKHNoLT5kZXZbY29uZi0+cmFpZF9kaXNrc10ucGFnZSk7DQorCQkJICAgIG1l bWNweShwZCwgcHMsIFNUUklQRV9TSVpFKTsNCisJCQkgICAgUFJJTlRLKCJSNV9XYW50d3JpdGUg dG8gYXNwYXJlLCB1cHRvZGF0ZTogJWQgJXAtPiVwXG4iLA0KKwkJCQkJdXB0b2RhdGUsIHBzLCBw ZCk7DQorCQkJICAgIC8qaWYgKHRlc3RfYml0KFI1X0xPQ0tFRCwgJnNoLT5kZXZbY29uZi0+cmFp ZF9kaXNrc10uZmxhZ3MpKSB7DQorCQkJCXByaW50aygiYmF6bWVnLCBleiBsb2trb2x0MiEhIVxu Iik7DQorCQkJICAgIH0qLw0KKwkJCX0NCiAJCQlpZiAodXB0b2RhdGUgIT0gZGlza3MpDQogCQkJ CUJVRygpOw0KKwkJCWlmIChhc3BhcmUpDQorCQkJICAgIGZhaWxlZF9udW0gPSBjb25mLT5yYWlk X2Rpc2tzOw0KIAkJCWRldiA9ICZzaC0+ZGV2W2ZhaWxlZF9udW1dOw0KIAkJCXNldF9iaXQoUjVf TE9DS0VELCAmZGV2LT5mbGFncyk7DQogCQkJc2V0X2JpdChSNV9XYW50d3JpdGUsICZkZXYtPmZs YWdzKTsNCiAJCQlsb2NrZWQrKzsNCiAJCQlzZXRfYml0KFNUUklQRV9JTlNZTkMsICZzaC0+c3Rh dGUpOw0KIAkJCXNldF9iaXQoUjVfU3luY2lvLCAmZGV2LT5mbGFncyk7DQorCQkJLyogIWluX3N5 bmMuLg0KKwkJCXByaW50aygicmVzZXQgYmFkYmxvY2sgb24gJWQ6ICVsbHVcbiIsIGZhaWxlZF9u dW0sIHNoLT5zZWN0b3IpOw0KKwkJCWRlbGV0ZV9iYWRibG9jaygmY29uZi0+ZGlza3NbZmFpbGVk X251bV0sIHNoLT5zZWN0b3IpOyovDQogCQl9DQogCX0NCiAJaWYgKHN5bmNpbmcgJiYgbG9ja2Vk ID09IDAgJiYgdGVzdF9iaXQoU1RSSVBFX0lOU1lOQywgJnNoLT5zdGF0ZSkpIHsNCkBAIC0xMjUx LDcgKzE3MjUsNyBAQA0KIAkJYmktPmJpX3NpemUgPSAwOw0KIAkJYmktPmJpX2VuZF9pbyhiaSwg Ynl0ZXMsIDApOw0KIAl9DQotCWZvciAoaT1kaXNrczsgaS0tIDspIHsNCisJZm9yIChpPWRpc2tz K2FzcGFyZTsgaS0tIDspIHsNCiAJCWludCBydzsNCiAJCXN0cnVjdCBiaW8gKmJpOw0KIAkJbWRr X3JkZXZfdCAqcmRldjsNCkBAIC0xNDkzLDYgKzE5NjcsMTUgQEANCiAJCXVucGx1Z19zbGF2ZXMo bWRkZXYpOw0KIAkJcmV0dXJuIDA7DQogCX0NCisJLyogaWYgdGhlcmUgaXMgMSBvciBtb3JlIGZh aWxlZCBkcml2ZXMgYW5kIHdlIGFyZSB0cnlpbmcNCisJICogdG8gcmVzeW5jLCB0aGVuIGFzc2Vy dCB0aGF0IHdlIGFyZSBmaW5pc2hlZCwgYmVjYXVzZSB0aGVyZSBpcw0KKwkgKiBub3RoaW5nIHdl IGNhbiBkby4NCisJICovDQorCWlmIChtZGRldi0+ZGVncmFkZWQgPj0gMSAmJiB0ZXN0X2JpdChN RF9SRUNPVkVSWV9TWU5DLCAmbWRkZXYtPnJlY292ZXJ5KSkgew0KKwkJaW50IHJ2ID0gKG1kZGV2 LT5zaXplIDw8IDEpIC0gc2VjdG9yX25yOw0KKwkJbWRfZG9uZV9zeW5jKG1kZGV2LCBydiwgMSk7 DQorCQlyZXR1cm4gcnY7DQorCX0NCiANCiAJeCA9IHNlY3Rvcl9ucjsNCiAJY2h1bmtfb2Zmc2V0 ID0gc2VjdG9yX2Rpdih4LCBzZWN0b3JzX3Blcl9jaHVuayk7DQpAQCAtMTUzOSwxMSArMjAyMiwy MCBAQA0KIAltZF9jaGVja19yZWNvdmVyeShtZGRldik7DQogCW1kX2hhbmRsZV9zYWZlbW9kZSht ZGRldik7DQogDQorCWlmIChtZGRldi0+ZWVoX3RocmVhZCAmJiBtZGRldi0+ZWVoX2RhdGEuZmFp bGVkX251bSA9PSAtMSkgew0KKwkJcHJpbnRrKEtFUk5fSU5GTyAiZWVoX3RocmVhZCBpcyBkb25l LCB1bnJlZ2lzdGVyaW5nXG4iKTsNCisJCW1kX3VucmVnaXN0ZXJfdGhyZWFkKG1kZGV2LT5lZWhf dGhyZWFkKTsNCisJCW1kZGV2LT5lZWhfdGhyZWFkID0gTlVMTDsNCisJfQ0KKw0KIAloYW5kbGVk ID0gMDsNCiAJc3Bpbl9sb2NrX2lycSgmY29uZi0+ZGV2aWNlX2xvY2spOw0KIAl3aGlsZSAoMSkg ew0KIAkJc3RydWN0IGxpc3RfaGVhZCAqZmlyc3Q7DQogDQorCQlpZiAobWRkZXYtPmVlaF90aHJl YWQpDQorCQkgICAgYnJlYWs7DQorDQogCQlpZiAobGlzdF9lbXB0eSgmY29uZi0+aGFuZGxlX2xp c3QpICYmDQogCQkgICAgYXRvbWljX3JlYWQoJmNvbmYtPnByZXJlYWRfYWN0aXZlX3N0cmlwZXMp IDwgSU9fVEhSRVNIT0xEICYmDQogCQkgICAgIWJsa19xdWV1ZV9wbHVnZ2VkKG1kZGV2LT5xdWV1 ZSkgJiYNCkBAIC0xNTkxLDExICsyMDgzLDExIEBADQogCX0NCiANCiAJbWRkZXYtPnByaXZhdGUg PSBrbWFsbG9jIChzaXplb2YgKHJhaWQ1X2NvbmZfdCkNCi0JCQkJICArIG1kZGV2LT5yYWlkX2Rp c2tzICogc2l6ZW9mKHN0cnVjdCBkaXNrX2luZm8pLA0KKwkJCQkgICsgKG1kZGV2LT5yYWlkX2Rp c2tzICsgMSkgKiBzaXplb2Yoc3RydWN0IGRpc2tfaW5mbyksDQogCQkJCSAgR0ZQX0tFUk5FTCk7 DQogCWlmICgoY29uZiA9IG1kZGV2LT5wcml2YXRlKSA9PSBOVUxMKQ0KIAkJZ290byBhYm9ydDsN Ci0JbWVtc2V0IChjb25mLCAwLCBzaXplb2YgKCpjb25mKSArIG1kZGV2LT5yYWlkX2Rpc2tzICog c2l6ZW9mKHN0cnVjdCBkaXNrX2luZm8pICk7DQorCW1lbXNldCAoY29uZiwgMCwgc2l6ZW9mICgq Y29uZikgKyAobWRkZXYtPnJhaWRfZGlza3MgKyAxKSAqIHNpemVvZihzdHJ1Y3QgZGlza19pbmZv KSApOw0KIAljb25mLT5tZGRldiA9IG1kZGV2Ow0KIA0KIAlpZiAoKGNvbmYtPnN0cmlwZV9oYXNo dGJsID0gKHN0cnVjdCBzdHJpcGVfaGVhZCAqKikgX19nZXRfZnJlZV9wYWdlcyhHRlBfQVRPTUlD LCBIQVNIX1BBR0VTX09SREVSKSkgPT0gTlVMTCkNCkBAIC0xNjI1LDYgKzIxMTcsOCBAQA0KIA0K IAkJZGlzay0+cmRldiA9IHJkZXY7DQogDQorCQlncm93X2JhZGJsb2NrcyhkaXNrKTsNCisNCiAJ CWlmIChyZGV2LT5pbl9zeW5jKSB7DQogCQkJY2hhciBiW0JERVZOQU1FX1NJWkVdOw0KIAkJCXBy aW50ayhLRVJOX0lORk8gInJhaWQ1OiBkZXZpY2UgJXMgb3BlcmF0aW9uYWwgYXMgcmFpZCINCkBA IC0xNjM1LDYgKzIxMjksOCBAQA0KIAl9DQogDQogCWNvbmYtPnJhaWRfZGlza3MgPSBtZGRldi0+ cmFpZF9kaXNrczsNCisJY29uZi0+bWlycm9yaXQgPSAtMTsNCisJbWRkZXYtPmVlaF90aHJlYWQg PSBOVUxMOwkvKiBqdXN0IHRvIGJlIHN1cmUgKi8NCiAJLyoNCiAJICogMCBmb3IgYSBmdWxseSBm dW5jdGlvbmFsIGFycmF5LCAxIGZvciBhIGRlZ3JhZGVkIGFycmF5Lg0KIAkgKi8NCkBAIC0xNjg0 LDcgKzIxODAsNyBAQA0KIAkJfQ0KIAl9DQogbWVtb3J5ID0gY29uZi0+bWF4X25yX3N0cmlwZXMg KiAoc2l6ZW9mKHN0cnVjdCBzdHJpcGVfaGVhZCkgKw0KLQkJIGNvbmYtPnJhaWRfZGlza3MgKiAo KHNpemVvZihzdHJ1Y3QgYmlvKSArIFBBR0VfU0laRSkpKSAvIDEwMjQ7DQorCQkgKGNvbmYtPnJh aWRfZGlza3MrMSkgKiAoKHNpemVvZihzdHJ1Y3QgYmlvKSArIFBBR0VfU0laRSkpKSAvIDEwMjQ7 DQogCWlmIChncm93X3N0cmlwZXMoY29uZiwgY29uZi0+bWF4X25yX3N0cmlwZXMpKSB7DQogCQlw cmludGsoS0VSTl9FUlIgDQogCQkJInJhaWQ1OiBjb3VsZG4ndCBhbGxvY2F0ZSAlZGtCIGZvciBi dWZmZXJzXG4iLCBtZW1vcnkpOw0KQEAgLTE3MzksMTAgKzIyMzUsMTkgQEANCiBzdGF0aWMgaW50 IHN0b3AgKG1kZGV2X3QgKm1kZGV2KQ0KIHsNCiAJcmFpZDVfY29uZl90ICpjb25mID0gKHJhaWQ1 X2NvbmZfdCAqKSBtZGRldi0+cHJpdmF0ZTsNCisJaW50IGk7DQogDQorCS8qIG1heSBibG9ja2Vk IGluIHVzZXItc3BhY2UsIGtpbGwgaXQgKi8NCisJaWYgKG1kZGV2LT5lZWhfdGhyZWFkKSB7DQor CQltZF91bnJlZ2lzdGVyX3RocmVhZChtZGRldi0+ZWVoX3RocmVhZCk7DQorCQltZGRldi0+ZWVo X3RocmVhZCA9IE5VTEw7DQorCX0NCiAJbWRfdW5yZWdpc3Rlcl90aHJlYWQobWRkZXYtPnRocmVh ZCk7DQogCW1kZGV2LT50aHJlYWQgPSBOVUxMOw0KIAlzaHJpbmtfc3RyaXBlcyhjb25mKTsNCisJ Zm9yIChpID0gY29uZi0+cmFpZF9kaXNrczsgaS0tOyApDQorCQlpZiAoY29uZi0+ZGlza3NbaV0u cmRldiAmJiBjb25mLT5kaXNrc1tpXS5yZGV2LT5pbl9zeW5jKQ0KKwkJCXNocmlua19iYWRibG9j a3MoJmNvbmYtPmRpc2tzW2ldKTsNCiAJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZykgY29uZi0+ c3RyaXBlX2hhc2h0YmwsIEhBU0hfUEFHRVNfT1JERVIpOw0KIAlibGtfc3luY19xdWV1ZShtZGRl di0+cXVldWUpOyAvKiB0aGUgdW5wbHVnIGZuIHJlZmVyZW5jZXMgJ2NvbmYnKi8NCiAJa2ZyZWUo Y29uZik7DQpAQCAtMTc4OCw3ICsyMjkzLDkgQEANCiBzdGF0aWMgdm9pZCBzdGF0dXMgKHN0cnVj dCBzZXFfZmlsZSAqc2VxLCBtZGRldl90ICptZGRldikNCiB7DQogCXJhaWQ1X2NvbmZfdCAqY29u ZiA9IChyYWlkNV9jb25mX3QgKikgbWRkZXYtPnByaXZhdGU7DQotCWludCBpOw0KKwlpbnQgaSwg ajsNCisJY2hhciBiW0JERVZOQU1FX1NJWkVdOw0KKwlzdHJ1Y3QgYmFkYmxvY2sgKmJiOw0KIA0K IAlzZXFfcHJpbnRmIChzZXEsICIgbGV2ZWwgJWQsICVkayBjaHVuaywgYWxnb3JpdGhtICVkIiwg bWRkZXYtPmxldmVsLCBtZGRldi0+Y2h1bmtfc2l6ZSA+PiAxMCwgbWRkZXYtPmxheW91dCk7DQog CXNlcV9wcmludGYgKHNlcSwgIiBbJWQvJWRdIFsiLCBjb25mLT5yYWlkX2Rpc2tzLCBjb25mLT53 b3JraW5nX2Rpc2tzKTsNCkBAIC0xODAxLDYgKzIzMDgsMjAgQEANCiAjZGVmaW5lIEQoeCkgXA0K IAlzZXFfcHJpbnRmIChzZXEsICI8IiN4IjolZD4iLCBhdG9taWNfcmVhZCgmY29uZi0+eCkpDQog CXByaW50YWxsKGNvbmYpOw0KKw0KKwlzcGluX2xvY2tfaXJxKCZjb25mLT5kZXZpY2VfbG9jayk7 CS8qIGl0J3Mgb2sgbm93IGZvciBkZWJ1ZyAqLw0KKwlzZXFfcHJpbnRmIChzZXEsICJcbiAgICAg IGtub3duIGJhZCBzZWN0b3JzIG9uIGFjdGl2ZSBkZXZpY2VzOiIpOw0KKwlmb3IgKGkgPSBjb25m LT5yYWlkX2Rpc2tzOyBpLS07ICkgew0KKwkgICAgaWYgKGNvbmYtPmRpc2tzW2ldLnJkZXYpIHsN CisJCXNlcV9wcmludGYgKHNlcSwgIlxuICAgICAgJXMiLCBiZGV2bmFtZShjb25mLT5kaXNrc1tp XS5yZGV2LT5iZGV2LCBiKSk7DQorCQlmb3IgKGogPSAwOyBqIDwgQkJfTlJfSEFTSDsgaisrKSB7 DQorCQkgICAgYmIgPSBjb25mLT5kaXNrc1tpXS5iYWRibG9ja19oYXNodGJsW2pdOw0KKwkJICAg IGZvciAoOyBiYjsgYmIgPSBiYi0+aGFzaF9uZXh0KQ0KKwkJCXNlcV9wcmludGYgKHNlcSwgIiAl bGx1LSVsbHUiLCBiYi0+c2VjdG9yLCBiYi0+c2VjdG9yICsgKHVuc2lnbmVkIGxvbmcgbG9uZyko U1RSSVBFX1NJWkUgLyA1MTIpIC0gMSk7DQorCQl9DQorCSAgICB9DQorCX0NCisJc3Bpbl91bmxv Y2tfaXJxKCZjb25mLT5kZXZpY2VfbG9jayk7DQogI2VuZGlmDQogfQ0KIA0KQEAgLTE4NDQsNiAr MjM2NSwxNiBAQA0KIAkJCXRtcC0+cmRldi0+aW5fc3luYyA9IDE7DQogCQl9DQogCX0NCisJdG1w ID0gY29uZi0+ZGlza3MgKyBpOw0KKwlpZiAodG1wLT5yZGV2ICYmICF0bXAtPnJkZXYtPmZhdWx0 eSAmJiAhdG1wLT5yZGV2LT5pbl9zeW5jKSB7DQorCSAgICB0bXAtPnJkZXYtPmluX3N5bmMgPSAx Ow0KKw0KKwkgICAgcHJpbnRrKEtFUk5fTk9USUNFICJyYWlkNV9zcGFyZV9hY3RpdmU6ICVkIGlu X3N5bmMgJWQtPiVkXG4iLA0KKwkJCWksIHRtcC0+cmRldi0+cmFpZF9kaXNrLCBjb25mLT5taXJy b3JpdCk7DQorDQorCSAgICAvKiBzY2FyeS4uPyA6fSAqLw0KKwkgICAgdG1wLT5yZGV2LT5yYWlk X2Rpc2sgPSBjb25mLT5taXJyb3JpdDsNCisJfQ0KIAlwcmludF9yYWlkNV9jb25mKGNvbmYpOw0K IAlyZXR1cm4gMDsNCiB9DQpAQCAtMTg1Nyw2ICsyMzg4LDcgQEANCiANCiAJcHJpbnRfcmFpZDVf Y29uZihjb25mKTsNCiAJcmRldiA9IHAtPnJkZXY7DQorcHJpbnRrKCJyYWlkNV9yZW1vdmVfZGlz ayAlZFxuIiwgbnVtYmVyKTsNCiAJaWYgKHJkZXYpIHsNCiAJCWlmIChyZGV2LT5pbl9zeW5jIHx8 DQogCQkgICAgYXRvbWljX3JlYWQoJnJkZXYtPm5yX3BlbmRpbmcpKSB7DQpAQCAtMTg3MCw2ICsy NDAyLDggQEANCiAJCQllcnIgPSAtRUJVU1k7DQogCQkJcC0+cmRldiA9IHJkZXY7DQogCQl9DQor CQlpZiAoIWVycikNCisJCQlzaHJpbmtfYmFkYmxvY2tzKHApOw0KIAl9DQogYWJvcnQ6DQogDQpA QCAtMTg4NCwxOSArMjQxOCw0NiBAQA0KIAlpbnQgZGlzazsNCiAJc3RydWN0IGRpc2tfaW5mbyAq cDsNCiANCisJaWYgKG1kZGV2LT5kZWdyYWRlZCA+IDEpDQorCQkvKiBubyBwb2ludCBhZGRpbmcg YSBkZXZpY2UgKi8NCisJCXJldHVybiAwOw0KKw0KIAkvKg0KIAkgKiBmaW5kIHRoZSBkaXNrIC4u Lg0KIAkgKi8NCiAJZm9yIChkaXNrPTA7IGRpc2sgPCBtZGRldi0+cmFpZF9kaXNrczsgZGlzaysr KQ0KIAkJaWYgKChwPWNvbmYtPmRpc2tzICsgZGlzayktPnJkZXYgPT0gTlVMTCkgew0KLQkJCXJk ZXYtPmluX3N5bmMgPSAwOw0KKwkJCS8qcmRldi0+aW5fc3luYyA9IDA7CXRoaXMgaXMgdGhlIGRl ZmF1bHQgYnkgbWQuYzogaG90X2FkZF9kaXNrKCkgKi8NCiAJCQlyZGV2LT5yYWlkX2Rpc2sgPSBk aXNrOw0KIAkJCWZvdW5kID0gMTsNCiAJCQlwLT5yZGV2ID0gcmRldjsNCiAJCQlicmVhazsNCiAJ CX0NCisNCisJaWYgKCFmb3VuZCAmJiBjb25mLT5kaXNrc1tkaXNrXS5yZGV2ID09IE5VTEwpIHsN CisJICAgIGNoYXIgYltCREVWTkFNRV9TSVpFXTsNCisNCisJICAgIC8qIGFycmF5IG9wdGltYWws IHRoaXMgc2hvdWxkIGJlIHRoZSAnYWN0aXZlIHNwYXJlJyBhZGRlZCBieSBlZWhfdGhyZWFkICov DQorCSAgICBjb25mLT5kaXNrc1tkaXNrXS5yZGV2ID0gcmRldjsNCisJICAgIHJkZXYtPmluX3N5 bmMgPSAwOw0KKwkgICAgcmRldi0+cmFpZF9kaXNrID0gY29uZi0+cmFpZF9kaXNrczsNCisNCisJ ICAgIGlmIChtZGRldi0+ZGVncmFkZWQpIC8qIGlmIHdlJ3JlIGhlcmUgYW5kIGl0J3MgdHJ1ZSwg d2UncmUgY2FsbGVkIGFmdGVyIGVycm9yKCkgKi8NCisJCSAgICBtZGRldi0+ZGVncmFkZWQtLTsN CisJICAgIGVsc2UNCisJCSAgICBjb25mLT5taXJyb3JpdCA9IG1kZGV2LT5lZWhfZGF0YS5mYWls ZWRfbnVtOw0KKwkgICAgZm91bmQgPSAxOw0KKw0KKwkgICAgcHJpbnRrKEtFUk5fTk9USUNFICJh ZGRlZCBzcGFyZSBmb3IgcHJvYWN0aXZlIHJlcGxhY2VtZW50IG9mICVzXG4iLA0KKwkJICAgIGJk ZXZuYW1lKGNvbmYtPmRpc2tzW2NvbmYtPm1pcnJvcml0XS5yZGV2LT5iZGV2LCBiKSk7DQorCX0N CisJaWYgKGZvdW5kKQ0KKwkJZ3Jvd19iYWRibG9ja3MoJmNvbmYtPmRpc2tzW2Rpc2tdKTsNCisJ cHJpbnRrKEtFUk5fSU5GTyAicmFpZDVfYWRkX2Rpc2s6ICVkICglZCkgaW5fc3luYzogJWRcbiIs IGRpc2ssIGZvdW5kLCBmb3VuZCA/IHJkZXYtPmluX3N5bmMgOiAtMSk7DQorDQogCXByaW50X3Jh aWQ1X2NvbmYoY29uZik7DQotCXJldHVybiBmb3VuZDsNCisJLyogcmVidWlsZCBuZWVkZWQ/ICov DQorCXJldHVybiByZGV2LT5pbl9zeW5jID8gMCA6IGZvdW5kOw0KIH0NCiANCiBzdGF0aWMgaW50 IHJhaWQ1X3Jlc2l6ZShtZGRldl90ICptZGRldiwgc2VjdG9yX3Qgc2VjdG9ycykNCi== --=-l6K2Yj3/j3TZD9PhfuIg--