From mboxrd@z Thu Jan 1 00:00:00 1970 From: Pallai Roland Subject: [PATCH] proactive raid5 disk replacement for 2.6.11 Date: Sun, 14 Aug 2005 22:10:03 +0200 Message-ID: <1124050204.3810.28.camel@localhost.localdomain> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-DvtaF2vGlPL1euJhlIZS" Return-path: Sender: linux-raid-owner@vger.kernel.org To: linux-raid@vger.kernel.org List-Id: linux-raid.ids --=-DvtaF2vGlPL1euJhlIZS Content-Type: text/plain Content-Transfer-Encoding: 7bit Hi, this is a feature patch that implements 'proactive raid5 disk replacement' (http://www.arctic.org/~dean/raid-wishlist.html), that could help a lot on large raid5 arrays built from cheap sata drivers when the IO traffic such large that daily media scan on the disks isn't possible. linux software raid is very fragile by default, the typical (nervous) breakdown situation is: I noticed a bad block on a drive, replace it, and the resync fails cause another 2-3 disks have hidden badblocks too. I've to save the disks and rebuild bad blocks with a userspace tool (by hand..), meanwhile the site is down for hours. bad; especially when a pair of simple steps enough to avoid from this atypical problem: 1. dont kick a drive on read error cause it is possible that 99.99% is useable and will help (to serve and to save data) if another drive show bad sectors in same array 2. let mirror a partially failed drive to a spare _online_ and replace the source of the mirror with the spare when it's done. bad blocks isn't a problem unless same sector damaged on two disks what's a rare case. in this way is possible to fix an array with partially failed drives without data loss and without downtime I'm not a programmer just a sysadm who admins a large software sata array, but my angry got bigger than my laziness, so I made this patch on this weekend.. I'm not understand every piece of the md code (eg. the if-forest of the handle_stripe :) yet, so this patch may be a bug-colony and wrong by design, but I've tested it under heavy stress with both of 'faulty' module and real disks, and it works fine! ideas, piece of advice, bugfix/enchancement is welcomed! (I know, raid6 could be another solution for this problem, but that's a large overhead.) use: 1. patch the kernel, this one is against 2.6.11 2. type: # make drives mdadm -B -n1 -l faulty /dev/md/1 /dev/rd/0 mdadm -B -n1 -l faulty /dev/md/2 /dev/rd/1 mdadm -B -n1 -l faulty /dev/md/3 /dev/rd/2 # make the array mdadm -C -n3 -l5 /dev/md/0 /dev/md/1 /dev/md/2 /dev/md/3 # .. wait for sync .. # grow bad blocks as ma*tor does mdadm --grow -l faulty -p rp454 /dev/md/1 mdadm --grow -l faulty -p rp738 /dev/md/2 # add a spare mdadm -a /dev/md/0 /dev/rd/4 # -> fail a drive, sync begins <- # the md/1 will not marked as failed, this is the point, but if you want to, # you can issue this command again! mdadm -f /dev/md/0 /dev/md/1 # kernel: # resync from md1 to spare ram4 # added spare for active resync # .. wonder the read errors from md[12] and the sync goes on! # feel free to stress the md at this time, mkfs, dd, badblocks, etc # kernel: # raid5_spare_active: 3 in_sync 3->0 # /proc/mdstat: # md0 : active raid5 ram4[0] md3[2] md2[1] md1[0] # -> ram4 and md1 have same id, this means the spare is a complete mirror, # if you stop the array you can assembly it with ram4 instead of md1, # the superblock same both of them # check the mirror (stop write stress if any) mdadm --grow -l faulty -p none /dev/md/1 cmp /dev/md/1 /dev/rd/4 # hot-replace the mirrored -partially failed- device with the active spare # (yes, mark it as failed again, but if there's a syncing- or synced 'active spare' # the -f really fails the device or replace it with the synced spare) mdadm -f /dev/md/0 /dev/md/1 # kernel: # replace md1 with in_sync active spare ram4 # and voila! # /proc/mdstat: # md0 : active raid5 ram4[0] md3[2] md2[1] .. I hope someone can use it for something, for me it's a musthave feature .. -- dap --=-DvtaF2vGlPL1euJhlIZS Content-Disposition: attachment; filename=00_raid5-asp-dap1.diff Content-Type: text/x-patch; name=00_raid5-asp-dap1.diff; charset=ISO-8859-2 Content-Transfer-Encoding: base64 DQogdGhpcyBpcyBhIGZlYXR1cmUgcGF0Y2ggdGhhdCBpbXBsZW1lbnRzICdwcm9hY3RpdmUgcmFp ZDUgZGlzayByZXBsYWNlbWVudCcNCihodHRwOi8vd3d3LmFyY3RpYy5vcmcvfmRlYW4vcmFpZC13 aXNobGlzdC5odG1sKSwNCnRoYXQgY291bGQgaGVscCBhIGxvdCBvbiBsYXJnZSByYWlkNSBhcnJh eXMgYnVpbHQgZnJvbSBjaGVhcCBzYXRhIGRyaXZlcnMNCndoZW4gdGhlIElPIHRyYWZmaWMgc3Vj aCBsYXJnZSB0aGF0IGRhaWx5IG1lZGlhIHNjYW4gb24gdGhlIGRpc2tzIGlzbid0DQpwb3NzaWJs ZS4NCiBsaW51eCBzb2Z0d2FyZSByYWlkIGlzIHZlcnkgZnJhZ2lsZSBieSBkZWZhdWx0LCB0aGUg dHlwaWNhbCAobmVydm91cykgYnJlYWtkb3duDQpzaXR1YXRpb24gaXM6IEkgbm90aWNlZCBhIGJh ZCBibG9jayBvbiBhIGRyaXZlLCByZXBsYWNlIGl0LCBhbmQgdGhlIHJlc3luYw0KZmFpbHMgY2F1 c2UgYW5vdGhlciAyLTMgZGlza3MgaGF2ZSBoaWRkZW4gYmFkYmxvY2tzIHRvby4gSSd2ZSB0byBz YXZlDQp0aGUgZGlza3MgYW5kIHJlYnVpbGQgYmFkIGJsb2NrcyB3aXRoIGEgdXNlcnNwYWNlIHRv b2wgKGJ5IGhhbmQuLiksIG1lYW53aGlsZQ0KdGhlIHNpdGUgaXMgZG93biBmb3IgaG91cnMuIGJh ZDsgZXNwZWNpYWxseSB3aGVuIGEgcGFpciBvZiBzaW1wbGUgc3RlcHMNCmVub3VnaCB0byBhdm9p ZCBmcm9tIHRoaXMgYXR5cGljYWwgcHJvYmxlbToNCiAxLiBkb250IGtpY2sgYSBkcml2ZSBvbiBy ZWFkIGVycm9yIGNhdXNlIGl0IGlzIHBvc3NpYmxlIHRoYXQgOTkuOTklIGlzIHVzZWFibGUNCiAg ICBhbmQgd2lsbCBoZWxwICh0byBzZXJ2ZSBhbmQgdG8gc2F2ZSBkYXRhKSBpZiBhbm90aGVyIGRy aXZlIHNob3cgYmFkIHNlY3RvcnMgaW4NCiAgICBzYW1lIGFycmF5DQogMi4gbGV0IGJ1aWxkIGEg bWlycm9yIF9vbmxpbmVfIHRvIGEgc3BhcmUgYW5kIHJlcGxhY2UgdGhlIHNvdXJjZSBvZiB0aGUg bWlycm9yDQogICAgd2l0aCB0aGUgc3BhcmUgd2hlbiBpdCdzIGRvbmUuIGJhZCBibG9ja3Mgbm90 IGEgcHJvYmxlbSB1bmxlc3Mgc2FtZSBzZWN0b3INCiAgICBiYWQgb24gdHdvIGRpc2tzIHdoYXQn cyBhIHJhcmUgY2FzZS4gaW4gdGhpcyB3YXkgaXMgcG9zc2libGUgdG8gZml4IGFuIGFycmF5DQog ICAgd2l0aCBwYXJ0aWFsbHkgZmFpbGVkIGRyaXZlcyB3aXRob3V0IGRhdGEgbG9zcyBhbmQgd2l0 aG91dCBkb3dudGltZQ0KDQogSSdtIG5vdCBhIHByb2dyYW1tZXIganVzdCBhIHN5c2FkbSB3aG8g YWRtaW5zIGEgbGFyZ2Ugc29mdHdhcmUgc2F0YSBhcnJheSwgYnV0IG15DQphbmdyeSBnb3QgYmln Z2VyIHRoYW4gbXkgbGF6aW5lc3MsIHNvIEkgbWFkZSB0aGlzIHBhdGNoIG9uIHRoaXMgd2Vla2Vu ZC4uIEknbSBub3QNCnVuZGVyc3RhbmQgZXZlcnkgcGllY2Ugb2YgdGhlIG1kIGNvZGUgKGVnLiB0 aGUgaWYtZm9yZXN0IG9mIHRoZSBoYW5kbGVfc3RyaXBlIDopIHlldCwNCnNvIHRoaXMgcGF0Y2gg bWF5IGJlIGEgYnVnLWNvbG9ueSBhbmQgd3JvbmcgYnkgZGVzaWduLCBidXQgSSd2ZSB0ZXN0ZWQg aXQNCnVuZGVyIGhlYXZ5IHN0cmVzcyB3aXRoIGJvdGggb2YgJ2ZhdWx0eScgbW9kdWxlIGFuZCBy ZWFsIGRpc2tzLCBhbmQgaXQgd29ya3MgZmluZSENCg0KIGlkZWFzLCBwaWVjZSBvZiBhZHZpY2Us IGJ1Z2ZpeC9lbmNoYW5jZW1lbnQgaXMgd2VsY29tZWQhDQoNCg0KIChJIGtub3csIHJhaWQ2IGNv dWxkIGJlIGFub3RoZXIgc29sdXRpb24gZm9yIHRoaXMgcHJvYmxlbSwgYnV0IHRoYXQncyBhIGxh cmdlDQpvdmVyaGVhZCB0b28uKQ0KDQoNCnVzZToNCg0KMS4gcGF0Y2ggdGhlIGtlcm5lbCwgdGhp cyBvbmUgaXMgYWdhaW5zdCAyLjYuMTENCjIuIHR5cGU6DQoNCiMgbWFrZSBkcml2ZXMNCm1kYWRt IC1CIC1uMSAtbCBmYXVsdHkgL2Rldi9tZC8xIC9kZXYvcmQvMA0KbWRhZG0gLUIgLW4xIC1sIGZh dWx0eSAvZGV2L21kLzIgL2Rldi9yZC8xDQptZGFkbSAtQiAtbjEgLWwgZmF1bHR5IC9kZXYvbWQv MyAvZGV2L3JkLzINCg0KIyBtYWtlIHRoZSBhcnJheQ0KbWRhZG0gLUMgLW4zIC1sNSAvZGV2L21k LzAgL2Rldi9tZC8xIC9kZXYvbWQvMiAvZGV2L21kLzMNCg0KIyAuLiB3YWl0IHRoZSBzeW5jIC4u DQoNCiMgZ3JvdyBiYWQgYmxvY2tzIGFzIG1hKnRvciBkb2VzDQptZGFkbSAtLWdyb3cgLWwgZmF1 bHR5IC1wIHJwNDU0IC9kZXYvbWQvMQ0KbWRhZG0gLS1ncm93IC1sIGZhdWx0eSAtcCBycDczOCAv ZGV2L21kLzINCg0KIyBhZGQgYSBzcGFyZQ0KbWRhZG0gLWEgL2Rldi9tZC8wIC9kZXYvcmQvNA0K DQojIC0+IGZhaWwgYSBkcml2ZSwgc3luYyBiZWdpbnMgPC0NCiMgIHRoZSBtZC8xIHdpbGwgbm90 IG1hcmtlZCBhcyBmYWlsZWQsIHRoaXMgaXMgdGhlIHBvaW50LCBidXQgaWYgeW91IHdhbnQgdG8s DQojICB5b3UgY2FuIGlzc3VlIHRoaXMgY29tbWFuZCBhZ2FpbiENCm1kYWRtIC1mIC9kZXYvbWQv MCAvZGV2L21kLzENCg0KIyBrZXJuZWw6DQojICByZXN5bmMgZnJvbSBtZDEgdG8gc3BhcmUgcmFt NA0KIyAgYWRkZWQgc3BhcmUgZm9yIGFjdGl2ZSByZXN5bmMNCg0KIyAuLiB3b25kZXIgdGhlIHJl YWQgZXJyb3JzIGZyb20gbWRbMTJdIGFuZCB0aGUgc3luYyBnb2VzIG9uIQ0KIyBmZWVsIGZyZWUg dG8gc3RyZXNzIHRoZSBtZCBhdCB0aGlzIHRpbWUsIG1rZnMsIGRkLCBiYWRibG9ja3MsIGV0Yw0K DQojIGtlcm5lbDoNCiMgIHJhaWQ1X3NwYXJlX2FjdGl2ZTogMyBpbl9zeW5jIDMtPjANCiMgL3By b2MvbWRzdGF0Og0KIyAgbWQwIDogYWN0aXZlIHJhaWQ1IHJhbTRbMF0gbWQzWzJdIG1kMlsxXSBt ZDFbMF0NCiMgLT4gcmFtNCBhbmQgbWQxIGhhdmUgc2FtZSBpZCwgdGhpcyBtZWFucyB0aGUgc3Bh cmUgaXMgYSBjb21wbGV0ZSBtaXJyb3IsDQojCWlmIHlvdSBzdG9wIHRoZSBhcnJheSB5b3UgY2Fu IGFzc2VtYmx5IGl0IHdpdGggcmFtNCBpbnN0ZWFkIG9mIG1kMSwNCiMJdGhlIHN1cGVyYmxvY2sg c2FtZSBib3RoIG9mIHRoZW0NCg0KIyBjaGVjayB0aGUgbWlycm9yIChzdG9wIHdyaXRlIHN0cmVz cykNCm1kYWRtIC0tZ3JvdyAtbCBmYXVsdHkgLXAgbm9uZSAvZGV2L21kLzENCmNtcCAvZGV2L21k LzAgL2Rldi9yZC80DQoNCiMgaG90LXJlcGxhY2UgdGhlIG1pcnJvcmVkIC1wYXJ0aWFsbHkgZmFp bGVkLSBkZXZpY2Ugd2l0aCB0aGUgYWN0aXZlIHNwYXJlDQojICAoeWVzLCBtYXJrIGl0IGFzIGZh aWxlZCBhZ2FpbiwgYnV0IGlmIHRoZXJlJ3MgYSBzeW5jaW5nIG90IHN5bmNlZCAnYWN0aXZlIHNw YXJlJw0KIwl0aGUgLWYgcmVhbGx5IGZhaWxzIHRoZSBkZXZpY2Ugb3IgcmVwbGFjZSBpdCB3aXRo IHRoZSBzeW5jZWQgc3BhcmUpDQptZGFkbSAtZiAvZGV2L21kLzAgL2Rldi9tZC8xDQoNCiMga2Vy bmVsOg0KIyAgcmVwbGFjZSBtZDEgd2l0aCBpbl9zeW5jIGFjdGl2ZSBzcGFyZSByYW00DQoNCiMg YW5kIHZvaWxhIQ0KIyAvcHJvYy9tZHN0YXQ6DQojICBtZDAgOiBhY3RpdmUgcmFpZDUgcmFtNFsw XSBtZDNbMl0gbWQyWzFdDQoNCg0KLS0tIGxpbnV4L2luY2x1ZGUvbGludXgvcmFpZC9yYWlkNS5o Lm9yaWcJMjAwNS0wMy0wMyAyMzo1MToyOS4wMDAwMDAwMDAgKzAxMDANCisrKyBsaW51eC9pbmNs dWRlL2xpbnV4L3JhaWQvcmFpZDUuaAkyMDA1LTA4LTE0IDAzOjAyOjExLjAwMDAwMDAwMCArMDIw MA0KQEAgLTE0Nyw2ICsxNDcsNyBAQA0KICNkZWZpbmUJUjVfVVBUT0RBVEUJMAkvKiBwYWdlIGNv bnRhaW5zIGN1cnJlbnQgZGF0YSAqLw0KICNkZWZpbmUJUjVfTE9DS0VECTEJLyogSU8gaGFzIGJl ZW4gc3VibWl0dGVkIG9uICJyZXEiICovDQogI2RlZmluZQlSNV9PVkVSV1JJVEUJMgkvKiB0b3dy aXRlIGNvdmVycyB3aG9sZSBwYWdlICovDQorI2RlZmluZQlSNV9GQUlMRUQJOAkvKiBmYWlsZWQg dG8gcmVhZCB0aGlzIHN0cmlwZSAqLw0KIC8qIGFuZCBzb21lIHRoYXQgYXJlIGludGVybmFsIHRv IGhhbmRsZV9zdHJpcGUgKi8NCiAjZGVmaW5lCVI1X0luc3luYwkzCS8qIHJkZXYgJiYgcmRldi0+ aW5fc3luYyBhdCBzdGFydCAqLw0KICNkZWZpbmUJUjVfV2FudHJlYWQJNAkvKiB3YW50IHRvIHNj aGVkdWxlIGEgcmVhZCAqLw0KQEAgLTIyNCw2ICsyMjUsOCBAQA0KIAlpbnQJCQlpbmFjdGl2ZV9i bG9ja2VkOwkvKiByZWxlYXNlIG9mIGluYWN0aXZlIHN0cmlwZXMgYmxvY2tlZCwNCiAJCQkJCQkJ ICogd2FpdGluZyBmb3IgMjUlIHRvIGJlIGZyZWUNCiAJCQkJCQkJICovICAgICAgICANCisJaW50 CQkJbWlycm9yaXQ7IC8qIHNvdXJjZSBmb3IgYWN0aXZlIHNwYXJlIHJlc3luYyAqLw0KKw0KIAlz cGlubG9ja190CQlkZXZpY2VfbG9jazsNCiAJc3RydWN0IGRpc2tfaW5mbwlkaXNrc1swXTsNCiB9 Ow0KLS0tIGxpbnV4L2RyaXZlcnMvbWQvbWQuYy5vcmlnCTIwMDUtMDgtMTQgMjE6MjI6MDguMDAw MDAwMDAwICswMjAwDQorKysgbGludXgvZHJpdmVycy9tZC9tZC5jCTIwMDUtMDgtMTQgMTc6MjA6 MTUuMDAwMDAwMDAwICswMjAwDQpAQCAtMzU0NSwxOCArMzU0NywxOSBAQA0KIA0KIAkJLyogbm8g cmVjb3ZlcnkgaXMgcnVubmluZy4NCiAJCSAqIHJlbW92ZSBhbnkgZmFpbGVkIGRyaXZlcywgdGhl bg0KLQkJICogYWRkIHNwYXJlcyBpZiBwb3NzaWJsZQ0KKwkJICogYWRkIHNwYXJlcyBpZiBwb3Nz aWJsZS4NCisJCSAqIFNwYXJlIGFyZSBhbHNvIHJlbW92ZWQgYW5kIHJlLWFkZGVkLCB0byBhbGxv dw0KKwkJICogdGhlIHBlcnNvbmFsaXR5IHRvIGZhaWwgdGhlIHJlLWFkZC4NCiAJCSAqLw0KLQkJ SVRFUkFURV9SREVWKG1kZGV2LHJkZXYscnRtcCkgew0KKwkJSVRFUkFURV9SREVWKG1kZGV2LHJk ZXYscnRtcCkNCiAJCQlpZiAocmRldi0+cmFpZF9kaXNrID49IDAgJiYNCi0JCQkgICAgcmRldi0+ ZmF1bHR5ICYmDQorCQkJICAgIChyZGV2LT5mYXVsdHkgfHwgISByZGV2LT5pbl9zeW5jKSAmJg0K IAkJCSAgICBhdG9taWNfcmVhZCgmcmRldi0+bnJfcGVuZGluZyk9PTApIHsNCitwcmludGsoIm1k X2NoZWNrX3JlY292ZXJ5OiBob3RfcmVtb3ZlX2Rpc2tcbiIpOw0KIAkJCQlpZiAobWRkZXYtPnBl cnMtPmhvdF9yZW1vdmVfZGlzayhtZGRldiwgcmRldi0+cmFpZF9kaXNrKT09MCkNCiAJCQkJCXJk ZXYtPnJhaWRfZGlzayA9IC0xOw0KIAkJCX0NCi0JCQlpZiAoIXJkZXYtPmZhdWx0eSAmJiByZGV2 LT5yYWlkX2Rpc2sgPj0gMCAmJiAhcmRldi0+aW5fc3luYykNCi0JCQkJc3BhcmVzKys7DQotCQl9 DQorDQogCQlpZiAobWRkZXYtPmRlZ3JhZGVkKSB7DQogCQkJSVRFUkFURV9SREVWKG1kZGV2LHJk ZXYscnRtcCkNCiAJCQkJaWYgKHJkZXYtPnJhaWRfZGlzayA8IDANCkBAIC0zNzY0LDQgKzM3NzEs NSBAQA0KIEVYUE9SVF9TWU1CT0wobWRfd2FrZXVwX3RocmVhZCk7DQogRVhQT1JUX1NZTUJPTCht ZF9wcmludF9kZXZpY2VzKTsNCiBFWFBPUlRfU1lNQk9MKG1kX2NoZWNrX3JlY292ZXJ5KTsNCitF WFBPUlRfU1lNQk9MKGtpY2tfcmRldl9mcm9tX2FycmF5KTsJLy8gZml4bWUNCiBNT0RVTEVfTElD RU5TRSgiR1BMIik7DQotLS0gbGludXgvZHJpdmVycy9tZC9yYWlkNS5jLm9yaWcJMjAwNS0wOC0x NCAyMToyMjowOC4wMDAwMDAwMDAgKzAyMDANCisrKyBsaW51eC9kcml2ZXJzL21kL3JhaWQ1LmMJ MjAwNS0wOC0xNCAyMDo0OTo0OS4wMDAwMDAwMDAgKzAyMDANCkBAIC01Myw3ICs1Myw3IEBADQog LyoNCiAgKiBUaGUgZm9sbG93aW5nIGNhbiBiZSB1c2VkIHRvIGRlYnVnIHRoZSBkcml2ZXINCiAg Ki8NCi0jZGVmaW5lIFJBSUQ1X0RFQlVHCTANCisjZGVmaW5lIFJBSUQ1X0RFQlVHCTENCiAjZGVm aW5lIFJBSUQ1X1BBUkFOT0lBCTENCiAjaWYgUkFJRDVfUEFSQU5PSUEgJiYgZGVmaW5lZChDT05G SUdfU01QKQ0KICMgZGVmaW5lIENIRUNLX0RFVkxPQ0soKSBhc3NlcnRfc3Bpbl9sb2NrZWQoJmNv bmYtPmRldmljZV9sb2NrKQ0KQEAgLTYxLDcgKzYxLDcgQEANCiAjIGRlZmluZSBDSEVDS19ERVZM T0NLKCkNCiAjZW5kaWYNCiANCi0jZGVmaW5lIFBSSU5USyh4Li4uKSAoKHZvaWQpKFJBSUQ1X0RF QlVHICYmIHByaW50ayh4KSkpDQorI2RlZmluZSBQUklOVEsoeC4uLikgKCh2b2lkKShSQUlENV9E RUJVRyAmJiBwcmludGsoS0VSTl9ERUJVRyB4KSkpDQogI2lmIFJBSUQ1X0RFQlVHDQogI2RlZmlu ZSBpbmxpbmUNCiAjZGVmaW5lIF9faW5saW5lX18NCkBAIC0yMDEsNyArMjAxLDcgQEANCiAJc2gt PnBkX2lkeCA9IHBkX2lkeDsNCiAJc2gtPnN0YXRlID0gMDsNCiANCi0JZm9yIChpPWRpc2tzOyBp LS07ICkgew0KKwlmb3IgKGk9ZGlza3MrMTsgaS0tOyApIHsNCiAJCXN0cnVjdCByNWRldiAqZGV2 ID0gJnNoLT5kZXZbaV07DQogDQogCQlpZiAoZGV2LT50b3JlYWQgfHwgZGV2LT50b3dyaXRlIHx8 IGRldi0+d3JpdHRlbiB8fA0KQEAgLTI5MSw4ICsyOTEsMTAgQEANCiANCiAJc3ByaW50Zihjb25m LT5jYWNoZV9uYW1lLCAicmFpZDUvJXMiLCBtZG5hbWUoY29uZi0+bWRkZXYpKTsNCiANCisJLyog KzE6IHdlIG5lZWQgZXh0cmEgc3BhY2UgaW4gdGhlICpzaC0+ZGV2cyBmb3IgdGhlICdhY3RpdmUg c3BhcmUnIHRvIGtlZXANCisJICAgIGhhbmRsZV9zdHJpcGUoKSBzaW1wbGUgKi8NCiAJc2MgPSBr bWVtX2NhY2hlX2NyZWF0ZShjb25mLT5jYWNoZV9uYW1lLCANCi0JCQkgICAgICAgc2l6ZW9mKHN0 cnVjdCBzdHJpcGVfaGVhZCkrKGRldnMtMSkqc2l6ZW9mKHN0cnVjdCByNWRldiksDQorCQkJICAg ICAgIHNpemVvZihzdHJ1Y3Qgc3RyaXBlX2hlYWQpKyhkZXZzLTErMSkqc2l6ZW9mKHN0cnVjdCBy NWRldiksDQogCQkJICAgICAgIDAsIDAsIE5VTEwsIE5VTEwpOw0KIAlpZiAoIXNjKQ0KIAkJcmV0 dXJuIDE7DQpAQCAtMzAxLDEyICszMDMsMTIgQEANCiAJCXNoID0ga21lbV9jYWNoZV9hbGxvYyhz YywgR0ZQX0tFUk5FTCk7DQogCQlpZiAoIXNoKQ0KIAkJCXJldHVybiAxOw0KLQkJbWVtc2V0KHNo LCAwLCBzaXplb2YoKnNoKSArIChkZXZzLTEpKnNpemVvZihzdHJ1Y3QgcjVkZXYpKTsNCisJCW1l bXNldChzaCwgMCwgc2l6ZW9mKCpzaCkgKyAoZGV2cy0xKzEpKnNpemVvZihzdHJ1Y3QgcjVkZXYp KTsNCiAJCXNoLT5yYWlkX2NvbmYgPSBjb25mOw0KIAkJc3Bpbl9sb2NrX2luaXQoJnNoLT5sb2Nr KTsNCiANCi0JCWlmIChncm93X2J1ZmZlcnMoc2gsIGNvbmYtPnJhaWRfZGlza3MpKSB7DQotCQkJ c2hyaW5rX2J1ZmZlcnMoc2gsIGNvbmYtPnJhaWRfZGlza3MpOw0KKwkJaWYgKGdyb3dfYnVmZmVy cyhzaCwgY29uZi0+cmFpZF9kaXNrcysxKSkgew0KKwkJCXNocmlua19idWZmZXJzKHNoLCBjb25m LT5yYWlkX2Rpc2tzKzEpOw0KIAkJCWttZW1fY2FjaGVfZnJlZShzYywgc2gpOw0KIAkJCXJldHVy biAxOw0KIAkJfQ0KQEAgLTM5MSwxOCArMzkzLDM5IEBADQogCQl9DQogI2Vsc2UNCiAJCXNldF9i aXQoUjVfVVBUT0RBVEUsICZzaC0+ZGV2W2ldLmZsYWdzKTsNCisJCWNsZWFyX2JpdChSNV9GQUlM RUQsICZzaC0+ZGV2W2ldLmZsYWdzKTsNCiAjZW5kaWYJCQ0KIAl9IGVsc2Ugew0KLQkgICAgaWYg KGNvbmYtPndvcmtpbmdfZGlza3MgPCBjb25mLT5yYWlkX2Rpc2tzICYmICFjb25mLT5tZGRldi0+ Y3Vycl9yZXN5bmMgJiYNCi0JCSAgICBjb25mLT5kaXNrc1tpXS5yZGV2LT5pbl9zeW5jKSB7DQot CQljaGFyIGJbQkRFVk5BTUVfU0laRV07DQotCQlwcmludGsgKEtFUk5fQUxFUlQNCi0JCQkicmFp ZDVfZW5kX3JlYWRfcmVxdWVzdDogRGlzayBmYWlsdXJlIG9uICVzLCBidXQganVzdCBmYWlsaW5n IHRoaXMgcmVxLlxuIg0KLQkJCSxiZGV2bmFtZShjb25mLT5kaXNrc1tpXS5yZGV2LT5iZGV2LCBi KSk7DQotCQljb25mLT5kaXNrc1tpXS5yZGV2LT5yZXJyID0gMTsNCisJICAgIGNoYXIgYltCREVW TkFNRV9TSVpFXTsNCisNCisJICAgIC8qDQorCQlydWxlIDEuLDogdHJ5IHRvIGtlZXAgYWxsIGRp c2sgaW5fc3luYyBldmVuIGlmIHdlJ3ZlIGdvdCByZWFkIGVycm9ycywNCisJCWNhdXNlIHRoZSAn YWN0aXZlIHNwYXJlJyBtYXliZSBjYW4gcmVidWlsZCBhIGNvbXBsZXRlIGNvbHVtbiBmcm9tDQor CQlwYXJ0aWFsbHkgZmFpbGVkIGRyaXZlcw0KKwkgICAgKi8NCisJICAgIGlmIChjb25mLT5kaXNr c1tpXS5yZGV2LT5pbl9zeW5jICYmIGNvbmYtPndvcmtpbmdfZGlza3MgPCBjb25mLT5yYWlkX2Rp c2tzKSB7DQorCQkvKiBiYWQgbmV3cywgYnV0IGtlZXAgaXQsIGNhdXNlIG1kX2Vycm9yKCkgd291 bGQgZG8gYSBjb21wbGV0ZQ0KKwkJICAgIGFycmF5IHNodXRkb3duLCBldmVuIGlmIDk5Ljk5JSBp cyB1c2VhYmxlICovDQorCQlwcmludGsoS0VSTl9BTEVSVA0KKwkJCSJyYWlkNV9lbmRfcmVhZF9y ZXF1ZXN0OiBSZWFkIGZhaWx1cmUgJXMgb24gc2VjdG9yICVsbHUgKCVkKSBpbiBkZWdyYWRlZCBt b2RlXG4iDQorCQkJLGJkZXZuYW1lKGNvbmYtPmRpc2tzW2ldLnJkZXYtPmJkZXYsIGIpLA0KKwkJ CSh1bnNpZ25lZCBsb25nIGxvbmcpc2gtPnNlY3RvciwgYXRvbWljX3JlYWQoJnNoLT5jb3VudCkp Ow0KKwkJaWYgKGNvbmYtPm1kZGV2LT5jdXJyX3Jlc3luYykNCisJCSAgICAvKiByYWlkNV9hZGRf ZGlzaygpIHdpbGwgbm8gYWNjZXB0IHRoZSBzcGFyZSBhZ2FpbiwNCisJCQlhbmQgd2lsbCBub3Qg bG9vcCBmb3JldmVyICovDQorCQkgICAgY29uZi0+bWRkZXYtPmRlZ3JhZGVkID0gMjsNCisJICAg IH0gZWxzZSBpZiAoY29uZi0+ZGlza3NbaV0ucmRldi0+aW5fc3luYyAmJiBjb25mLT53b3JraW5n X2Rpc2tzID49IGNvbmYtPnJhaWRfZGlza3MpIHsNCisJCS8qIHdpbGwgYmUgY29tcHV0ZWQgKi8N CisJCXByaW50ayhLRVJOX0FMRVJUDQorCQkJInJhaWQ1X2VuZF9yZWFkX3JlcXVlc3Q6IFJlYWQg ZmFpbHVyZSAlcyBvbiBzZWN0b3IgJWxsdSAoJWQpIGluIG9wdGltYWwgbW9kZVxuIg0KKwkJCSxi ZGV2bmFtZShjb25mLT5kaXNrc1tpXS5yZGV2LT5iZGV2LCBiKSwNCisJCQkodW5zaWduZWQgbG9u ZyBsb25nKXNoLT5zZWN0b3IsIGF0b21pY19yZWFkKCZzaC0+Y291bnQpKTsNCisJCS8qIGNvbmYt PmRpc2tzW2ldLnJlcnIrKyAqLw0KIAkgICAgfSBlbHNlDQorCQkvKiBwcmFjdGljYWxseSBpdCBu ZXZlciBoYXBwZW5zICovDQogCQltZF9lcnJvcihjb25mLT5tZGRldiwgY29uZi0+ZGlza3NbaV0u cmRldik7DQogCSAgICBjbGVhcl9iaXQoUjVfVVBUT0RBVEUsICZzaC0+ZGV2W2ldLmZsYWdzKTsN CisJICAgIHNldF9iaXQoUjVfRkFJTEVELCAmc2gtPmRldltpXS5mbGFncyk7DQogCX0NCiAJcmRl dl9kZWNfcGVuZGluZyhjb25mLT5kaXNrc1tpXS5yZGV2LCBjb25mLT5tZGRldik7DQogI2lmIDAN CkBAIC00MzgsMTAgKzQ2MSwxMSBAQA0KIAlQUklOVEsoImVuZF93cml0ZV9yZXF1ZXN0ICVsbHUv JWQsIGNvdW50ICVkLCB1cHRvZGF0ZTogJWQuXG4iLCANCiAJCSh1bnNpZ25lZCBsb25nIGxvbmcp c2gtPnNlY3RvciwgaSwgYXRvbWljX3JlYWQoJnNoLT5jb3VudCksDQogCQl1cHRvZGF0ZSk7DQor CS8qIHNvcnJ5DQogCWlmIChpID09IGRpc2tzKSB7DQogCQlCVUcoKTsNCiAJCXJldHVybiAwOw0K LQl9DQorCX0qLw0KIA0KIAlzcGluX2xvY2tfaXJxc2F2ZSgmY29uZi0+ZGV2aWNlX2xvY2ssIGZs YWdzKTsNCiAJaWYgKCF1cHRvZGF0ZSkNCkBAIC00NzUsMzMgKzQ5OSwxNDIgQEANCiAJZGV2LT5y ZXEuYmlfcHJpdmF0ZSA9IHNoOw0KIA0KIAlkZXYtPmZsYWdzID0gMDsNCi0JaWYgKGkgIT0gc2gt PnBkX2lkeCkNCisJaWYgKGkgIT0gc2gtPnBkX2lkeCAmJiBpIDwgc2gtPnJhaWRfY29uZi0+cmFp ZF9kaXNrcykJLyogYWN0aXZlIHNwYXJlPyAqLw0KIAkJZGV2LT5zZWN0b3IgPSBjb21wdXRlX2Js b2NrbnIoc2gsIGkpOw0KIH0NCiANCitzdGF0aWMgaW50IHJhaWQ1X3JlbW92ZV9kaXNrKG1kZGV2 X3QgKm1kZGV2LCBpbnQgbnVtYmVyKTsNCitzdGF0aWMgaW50IHJhaWQ1X2FkZF9kaXNrKG1kZGV2 X3QgKm1kZGV2LCBtZGtfcmRldl90ICpyZGV2KTsNCisvKnN0YXRpYyovIHZvaWQga2lja19yZGV2 X2Zyb21fYXJyYXkobWRrX3JkZXZfdCAqIHJkZXYpOw0KKy8vc3RhdGljIHZvaWQgbWRfdXBkYXRl X3NiKG1kZGV2X3QgKiBtZGRldik7DQogc3RhdGljIHZvaWQgZXJyb3IobWRkZXZfdCAqbWRkZXYs IG1ka19yZGV2X3QgKnJkZXYpDQogew0KIAljaGFyIGJbQkRFVk5BTUVfU0laRV07DQorCWNoYXIg YjJbQkRFVk5BTUVfU0laRV07DQogCXJhaWQ1X2NvbmZfdCAqY29uZiA9IChyYWlkNV9jb25mX3Qg KikgbWRkZXYtPnByaXZhdGU7DQogCVBSSU5USygicmFpZDU6IGVycm9yIGNhbGxlZFxuIik7DQog DQogCWlmICghcmRldi0+ZmF1bHR5KSB7DQotCQltZGRldi0+c2JfZGlydHkgPSAxOw0KLQkJaWYg KHJkZXYtPmluX3N5bmMpIHsNCi0JCQljb25mLT53b3JraW5nX2Rpc2tzLS07DQotCQkJbWRkZXYt PmRlZ3JhZGVkKys7DQotCQkJY29uZi0+ZmFpbGVkX2Rpc2tzKys7DQotCQkJcmRldi0+aW5fc3lu YyA9IDA7DQotCQkJLyoNCi0JCQkgKiBpZiByZWNvdmVyeSB3YXMgcnVubmluZywgbWFrZSBzdXJl IGl0IGFib3J0cy4NCi0JCQkgKi8NCi0JCQlzZXRfYml0KE1EX1JFQ09WRVJZX0VSUiwgJm1kZGV2 LT5yZWNvdmVyeSk7DQotCQl9DQotCQlyZGV2LT5mYXVsdHkgPSAxOw0KLQkJcHJpbnRrIChLRVJO X0FMRVJUDQotCQkJInJhaWQ1OiBEaXNrIGZhaWx1cmUgb24gJXMsIGRpc2FibGluZyBkZXZpY2Uu Ig0KLQkJCSIgT3BlcmF0aW9uIGNvbnRpbnVpbmcgb24gJWQgZGV2aWNlc1xuIiwNCi0JCQliZGV2 bmFtZShyZGV2LT5iZGV2LGIpLCBjb25mLT53b3JraW5nX2Rpc2tzKTsNCisJCWludCBtZGRpc2tz ID0gMDsNCisJCW1ka19yZGV2X3QgKnJkOw0KKwkJbWRrX3JkZXZfdCAqcmRldnMgPSBOVUxMOw0K KwkJc3RydWN0IGxpc3RfaGVhZCAqcnRtcDsNCisJCWludCBpOw0KKw0KKwkJSVRFUkFURV9SREVW KG1kZGV2LHJkLHJ0bXApDQorCQkgICAgew0KKwkJCXByaW50ayhLRVJOX0lORk8gIm1kZGV2JWQ6 ICVzXG4iLCBtZGRpc2tzLCBiZGV2bmFtZShyZC0+YmRldixiKSk7DQorCQkJbWRkaXNrcysrOw0K KwkJICAgIH0NCisJCWZvciAoaSA9IDA7IChyZCA9IGNvbmYtPmRpc2tzW2ldLnJkZXYpOyBpKysp IHsNCisJCQlwcmludGsoS0VSTl9JTkZPICJyNWRldiVkOiAlc1xuIiwgaSwgYmRldm5hbWUocmQt PmJkZXYsYikpOw0KKwkJfQ0KKwkJSVRFUkFURV9SREVWKG1kZGV2LHJkLHJ0bXApDQorCQkgICAg ew0KKwkJCXJkZXZzID0gcmQ7DQorCQkJYnJlYWs7DQorCQkgICAgfQ0KK3ByaW50aygiJWQgJWQg PiAlZCAlZCBpbnM6JWQgJXBcbiIsDQorCW1kZGV2LT5yYWlkX2Rpc2tzLCBtZGRpc2tzLCBjb25m LT5yYWlkX2Rpc2tzLCBtZGRldi0+ZGVncmFkZWQsIHJkZXYtPmluX3N5bmMsIHJkZXZzKTsNCisJ CWlmIChjb25mLT5kaXNrc1tjb25mLT5yYWlkX2Rpc2tzXS5yZGV2ID09IHJkZXYgJiYgcmRldi0+ aW5fc3luYykgew0KKwkJICAgIC8qIGluX3N5bmMsIGJ1dCBtdXN0IGJlIGhhbmRsZWQgc3BlY2lh bGx5LCBkb24ndCBsZXQgJ2RlZ3JhZGVkKysnICovDQorCQkgICAgcHJpbnRrICgiYWN0aXZlIHNw YXJlIGZhaWxlZCAlcyAoaW5fc3luYylcbiIsDQorCQkJCWJkZXZuYW1lKHJkZXYtPmJkZXYsYikp Ow0KKwkJICAgIG1kZGV2LT5zYl9kaXJ0eSA9IDE7DQorCQkgICAgcmRldi0+aW5fc3luYyA9IDA7 DQorCQkgICAgcmRldi0+ZmF1bHR5ID0gMTsNCisJCSAgICByZGV2LT5yYWlkX2Rpc2sgPSBjb25m LT5yYWlkX2Rpc2tzOwkJLyogbWUgYXMgbXlzZWxmLCBhZ2FpbiA7KSAqLw0KKwkJICAgIGNvbmYt Pm1pcnJvcml0ID0gLTE7DQorCQl9IGVsc2UgaWYgKG1kZGlza3MgPiBjb25mLT5yYWlkX2Rpc2tz ICYmICFtZGRldi0+ZGVncmFkZWQgJiYgcmRldi0+aW5fc3luYykgew0KKwkJICAgIC8qIGhhdmUg YWN0aXZlIHNwYXJlLCBhcnJheSBpcyBvcHRpbWFsLCByZW1vdmVkIGRpc2sgbWVtYmVyDQorCQkJ ICAgIG9mIGl0IChidXQgbm90IHRoZSBhY3RpdmUgc3BhcmUpICovDQorCQkgICAgaWYgKHJkZXYt PnJhaWRfZGlzayA9PSBjb25mLT5taXJyb3JpdCAmJiBjb25mLT5kaXNrc1tjb25mLT5yYWlkX2Rp c2tzXS5yZGV2KSB7DQorCQkJaWYgKCFjb25mLT5kaXNrc1tjb25mLT5yYWlkX2Rpc2tzXS5yZGV2 LT5pbl9zeW5jKSB7DQorCQkJICAgIHByaW50ayhLRVJOX0FMRVJUICJkaXNrICVzIGZhaWxlZCBh bmQgYWN0aXZlIHNwYXJlIGlzbid0IGluX3N5bmMgeWV0LCByZWFkZCBhcyBub3JtYWwgc3BhcmVc biIsDQorCQkJCQliZGV2bmFtZShyZGV2LT5iZGV2LGIpKTsNCisJCQkgICAgLyogbWF5YmUgc2hv dWxkbid0IHN0b3AgaGVyZSwgYnV0IHdlIGNhbid0IGNhbGwgdGhpcyBkaXNrIGFzDQorCQkJCSdh Y3RpdmUgc3BhcmUnIGFueW1vcmUsIGNhdXNlIGl0J3MgYSBzaW1wbGUgcmVidWlsZCBmcm9tDQor CQkJCWEgZGVncmFkZWQgYXJyYXksIGZlYXIgb2YgYmFkIGJsb2NrcyEgKi8NCisJCQkgICAgY29u Zi0+bWlycm9yaXQgPSAtMTsNCisJCQkgICAgZ290byBsZXRpdGdvOw0KKwkJCX0gZWxzZSB7DQor CQkJICAgIGludCByZXQ7DQorDQorCQkJICAgIC8qIGhvdCByZXBsYWNlIHRoZSBzeW5jZWQgZHJp dmUgd2l0aCB0aGUgJ2FjdGl2ZSBzcGFyZScNCisJCQkJdGhpcyBpcyByZWFsbHkgImhvdCIsIEkg Y2FuJ3Qgc2VlIGNsZWFybHkgdGhlIHRoaW5ncw0KKwkJCQl3aGF0IEkgaGF2ZSB0byBkbyBoZXJl LiA6fQ0KKwkJCQlwcmF5LiAqLw0KKw0KKwkJCSAgICBwcmludGsoS0VSTl9BTEVSVCAicmVwbGFj ZSAlcyB3aXRoIGluX3N5bmMgYWN0aXZlIHNwYXJlICVzXG4iLA0KKwkJCQkgICAgYmRldm5hbWUo cmRldi0+YmRldixiKSwNCisJCQkJICAgIGJkZXZuYW1lKHJkZXZzLT5iZGV2LGIyKSk7DQorCQkJ ICAgIHJkZXYtPmluX3N5bmMgPSAwOw0KKwkJCSAgICByZGV2LT5mYXVsdHkgPSAxOw0KKw0KKwkJ CSAgICBjb25mLT5taXJyb3JpdCA9IC0xOw0KKw0KKwkJCSAgICAvKiBteSBHb2QsIGFtIEkgc2Fu ZT8gKi8NCisJCQkgICAgd2hpbGUgKChpID0gYXRvbWljX3JlYWQoJnJkZXYtPm5yX3BlbmRpbmcp KSkgew0KKwkJCQlwcmludGsoIndhaXRpbmcgZm9yIGRpc2sgJWQgLi4gJWRcbiIsDQorCQkJCQly ZGV2LT5yYWlkX2Rpc2ssIGkpOw0KKwkJCSAgICB9DQorCQkJICAgIHJldCA9IHJhaWQ1X3JlbW92 ZV9kaXNrKG1kZGV2LCByZGV2LT5yYWlkX2Rpc2spOw0KKwkJCSAgICBpZiAocmV0KSB7DQorCQkJ CXByaW50ayhLRVJOX1dBUk5JTkcgInJhaWQ1X3JlbW92ZV9kaXNrMTogYnVzeT8hXG4iKTsNCisJ CQkJcmV0dXJuOwkvLyBzaG91bGQgaXQgbm90aGluZyB0byBkbw0KKwkJCSAgICB9DQorCQkJICAg IHJldCA9IHJhaWQ1X2FkZF9kaXNrKG1kZGV2LCBjb25mLT5kaXNrc1tjb25mLT5yYWlkX2Rpc2tz XS5yZGV2KTsNCisJCQkgICAgaWYgKCFyZXQpIHsNCisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAi cmFpZDVfYWRkX2Rpc2s6IG5vIGZyZWUgc2xvdD8hXG4iKTsNCisJCQkJcmV0dXJuOwkvLyAuLg0K KwkJCSAgICB9DQorDQorCQkJICAgIHdoaWxlICgoaSA9IGF0b21pY19yZWFkKCZjb25mLT5kaXNr c1tjb25mLT5yYWlkX2Rpc2tzXS5yZGV2LT5ucl9wZW5kaW5nKSkpIHsNCisJCQkJcHJpbnRrKCJ3 YWl0aW5nIGZvciBkaXNrICVkIC4uICVkXG4iLA0KKwkJCQkJY29uZi0+cmFpZF9kaXNrcywgaSk7 DQorCQkJICAgIH0NCisJCQkgICAgcmV0ID0gcmFpZDVfcmVtb3ZlX2Rpc2sobWRkZXYsIGNvbmYt PnJhaWRfZGlza3MpOw0KKwkJCSAgICBpZiAocmV0KSB7DQorCQkJCXByaW50ayhLRVJOX1dBUk5J TkcgInJhaWQ1X3JlbW92ZV9kaXNrMjogYnVzeT8hXG4iKTsNCisJCQkJcmV0dXJuOwkvLyAuLg0K KwkJCSAgICB9DQorDQorCQkJICAgIGNvbmYtPmRpc2tzW3JkZXYtPnJhaWRfZGlza10ucmRldi0+ aW5fc3luYyA9IDE7DQorDQorCQkJICAgIC8qIGJvcnJvd2VkIGZyb20gaG90X3JlbW92ZV9kaXNr KCkgKi8NCisJCQkgICAga2lja19yZGV2X2Zyb21fYXJyYXkocmRldik7DQorCQkJICAgIC8vbWRf dXBkYXRlX3NiKG1kZGV2KTsNCisJCQl9DQorCQkgICAgfSBlbHNlIHsNCisJCQkvKiBpbl9zeW5j IGRpc2sgZmFpbGVkICghZGVncmFkZWQpLCB0cnlpbmcgdG8gbWFrZSBhIGNvcHkNCisJCQkgICAg dG8gYSBzcGFyZSB7YW5kIHdlIGNvdWxkIGNhbGwgaXQgJ2FjdGl2ZSBzcGFyZScgZnJvbSBub3c6 fSAqLw0KKwkJCXByaW50ayhLRVJOX0FMRVJUICJyZXN5bmMgZnJvbSAlcyB0byBzcGFyZSAlcyAo JWQpXG4iLA0KKwkJCQliZGV2bmFtZShyZGV2LT5iZGV2LGIpLA0KKwkJCSAgICAgICAgYmRldm5h bWUocmRldnMtPmJkZXYsYjIpLA0KKwkJCQljb25mLT5yYWlkX2Rpc2tzKTsNCisJCQljb25mLT5t aXJyb3JpdCA9IHJkZXYtPnJhaWRfZGlzazsNCisNCisJCQltZGRldi0+ZGVncmFkZWQrKzsJLyog Zm9yIGNhbGwgcmFpZDVfaG90X2FkZF9kaXNrKCksIHJlc2V0IHRoZXJlICovDQorCQkgICAgfQ0K KwkJfSBlbHNlIHsNCitsZXRpdGdvOg0KKwkJICAgIG1kZGV2LT5zYl9kaXJ0eSA9IDE7DQorCQkg ICAgaWYgKHJkZXYtPmluX3N5bmMpIHsNCisJCQkgICAgY29uZi0+d29ya2luZ19kaXNrcy0tOw0K KwkJCSAgICBtZGRldi0+ZGVncmFkZWQrKzsNCisJCQkgICAgY29uZi0+ZmFpbGVkX2Rpc2tzKys7 DQorCQkJICAgIHJkZXYtPmluX3N5bmMgPSAwOw0KKwkJCSAgICAvKg0KKwkJCSAgICAgKiBpZiBy ZWNvdmVyeSB3YXMgcnVubmluZywgbWFrZSBzdXJlIGl0IGFib3J0cy4NCisJCQkgICAgICovDQor CQkJICAgIHNldF9iaXQoTURfUkVDT1ZFUllfRVJSLCAmbWRkZXYtPnJlY292ZXJ5KTsNCisJCSAg ICB9DQorCQkgICAgcmRldi0+ZmF1bHR5ID0gMTsNCisJCSAgICBwcmludGsgKEtFUk5fQUxFUlQN CisJCQkgICAgInJhaWQ1OiBEaXNrIGZhaWx1cmUgb24gJXMsIGRpc2FibGluZyBkZXZpY2UuIg0K KwkJCSAgICAiIE9wZXJhdGlvbiBjb250aW51aW5nIG9uICVkIGRldmljZXNcbiIsDQorCQkJICAg IGJkZXZuYW1lKHJkZXYtPmJkZXYsYiksIGNvbmYtPndvcmtpbmdfZGlza3MpOw0KKwkJfQ0KIAl9 DQogfQkNCiANCkBAIC04OTYsNiArMTAyOSw4IEBADQogCWludCBsb2NrZWQ9MCwgdXB0b2RhdGU9 MCwgdG9fcmVhZD0wLCB0b193cml0ZT0wLCBmYWlsZWQ9MCwgd3JpdHRlbj0wOw0KIAlpbnQgbm9u X292ZXJ3cml0ZSA9IDA7DQogCWludCBmYWlsZWRfbnVtPTA7DQorCWludCBhc3BhcmU9MCwgYXNw YXJlbnVtPS0xOw0KKwlzdHJ1Y3QgZGlza19pbmZvICphc3BhcmVkZXY7DQogCXN0cnVjdCByNWRl diAqZGV2Ow0KIA0KIAlQUklOVEsoImhhbmRsaW5nIHN0cmlwZSAlbGx1LCBjbnQ9JWQsIHBkX2lk eD0lZFxuIiwNCkBAIC05MDcsOSArMTA0MiwxNiBAQA0KIAljbGVhcl9iaXQoU1RSSVBFX0RFTEFZ RUQsICZzaC0+c3RhdGUpOw0KIA0KIAlzeW5jaW5nID0gdGVzdF9iaXQoU1RSSVBFX1NZTkNJTkcs ICZzaC0+c3RhdGUpOw0KKwlhc3BhcmVkZXYgPSAmY29uZi0+ZGlza3NbY29uZi0+cmFpZF9kaXNr c107DQorCWlmICghY29uZi0+bWRkZXYtPmRlZ3JhZGVkICYmIGFzcGFyZWRldi0+cmRldiAmJiAh YXNwYXJlZGV2LT5yZGV2LT5mYXVsdHkgJiYNCisJCWNvbmYtPm1pcnJvcml0ICE9IC0xKSB7DQor CSAgICBhc3BhcmUrKzsNCisJICAgIGFzcGFyZW51bSA9IHNoLT5yYWlkX2NvbmYtPm1pcnJvcml0 Ow0KKwkgICAgUFJJTlRLKCJoYXMgYXNwYXJlICglZClcbiIsIGFzcGFyZW51bSk7DQorCX0NCiAJ LyogTm93IHRvIGxvb2sgYXJvdW5kIGFuZCBzZWUgd2hhdCBjYW4gYmUgZG9uZSAqLw0KIA0KLQlm b3IgKGk9ZGlza3M7IGktLTsgKSB7DQorCWZvciAoaT1kaXNrcythc3BhcmU7IGktLTsgKSB7DQog CQltZGtfcmRldl90ICpyZGV2Ow0KIAkJZGV2ID0gJnNoLT5kZXZbaV07DQogCQljbGVhcl9iaXQo UjVfSW5zeW5jLCAmZGV2LT5mbGFncyk7DQpAQCAtOTUzLDEyICsxMDk1LDE3IEBADQogCQl9DQog CQlpZiAoZGV2LT53cml0dGVuKSB3cml0dGVuKys7DQogCQlyZGV2ID0gY29uZi0+ZGlza3NbaV0u cmRldjsgLyogRklYTUUsIHNob3VsZCBJIGJlIGxvb2tpbmcgcmRldiAqLw0KLQkJaWYgKCFyZGV2 IHx8ICFyZGV2LT5pbl9zeW5jIHx8IHJkZXYtPnJlcnIgLypmb3JjZWQgZXJyb3IqLykgew0KKwkJ aWYgKCFyZGV2IHx8ICFyZGV2LT5pbl9zeW5jIHx8DQorCQkgICAgKHRlc3RfYml0KFI1X0ZBSUxF RCwgJmRldi0+ZmxhZ3MpICYmICF0ZXN0X2JpdChSNV9VUFRPREFURSwgJmRldi0+ZmxhZ3MpKSkg ew0KIAkJCWZhaWxlZCsrOw0KIAkJCWZhaWxlZF9udW0gPSBpOw0KKwkJCVBSSU5USygiZGV2aWNl ICVkIGZhaWxlZCBmb3IgdGhpcyBzdHJpcGUgciVwIHclcFxuIiwgaSwgZGV2LT50b3JlYWQsIGRl di0+dG93cml0ZSk7DQogCQl9IGVsc2UNCiAJCQlzZXRfYml0KFI1X0luc3luYywgJmRldi0+Zmxh Z3MpOw0KIAl9DQorCWlmIChhc3BhcmUgJiYgZmFpbGVkID4gMSkNCisJICAgIGZhaWxlZC0tOwkv KiBmYWlsZWQgPSAxIG1lYW5zICJhbGwgb2siIGlmIHdlJ3ZlIGFzcGFyZSwgdGhpcyBpcyBzaW1w bGVzdA0KKwkJCSAgICBtZXRob2QgdG8gZG8gb3VyIHdvcmsgKi8NCiAJUFJJTlRLKCJsb2NrZWQ9 JWQgdXB0b2RhdGU9JWQgdG9fcmVhZD0lZCINCiAJCSIgdG9fd3JpdGU9JWQgZmFpbGVkPSVkIGZh aWxlZF9udW09JWRcbiIsDQogCQlsb2NrZWQsIHVwdG9kYXRlLCB0b19yZWFkLCB0b193cml0ZSwg ZmFpbGVkLCBmYWlsZWRfbnVtKTsNCkBAIC0xMDAwLDE0ICsxMTQ3LDggQEANCiAJCQkJYmkgPSBi aTI7DQogCQkJfQ0KIA0KLQkJCS8qIGZhaWwgYW55IHJlYWRzIGlmIHRoaXMgZGV2aWNlIGlzIG5v bi1vcGVyYXRpb25hbCBvcg0KLQkJCSAgICB0aGVyZSdzIGZvcmNlZCByZWFkIGVycm9yICovDQor CQkJLyogZmFpbCBhbnkgcmVhZHMgaWYgdGhpcyBkZXZpY2UgaXMgbm9uLW9wZXJhdGlvbmFsICov DQogCQkJaWYgKCF0ZXN0X2JpdChSNV9JbnN5bmMsICZzaC0+ZGV2W2ldLmZsYWdzKSkgew0KLQkJ CQlpZiAoY29uZi0+ZGlza3NbaV0ucmRldiAmJiBjb25mLT5kaXNrc1tpXS5yZGV2LT5yZXJyKSB7 DQotCQkJCSAgICBjb25mLT5kaXNrc1tpXS5yZGV2LT5yZXJyID0gMDsNCi0JCQkJICAgIHByaW50 ayAoS0VSTl9OT1RJQ0UgInJhaWQ1OiBmb3JjZWQgZXJyb3Igb24gJWQgKHIlZCB3JWQpXG4iLA0K LQkJCQkJICAgIGksIHRvX3JlYWQsIHRvX3dyaXRlKTsNCi0JCQkJfQ0KIAkJCQliaSA9IHNoLT5k ZXZbaV0udG9yZWFkOw0KIAkJCQlzaC0+ZGV2W2ldLnRvcmVhZCA9IE5VTEw7DQogCQkJCWlmICh0 ZXN0X2FuZF9jbGVhcl9iaXQoUjVfT3ZlcmxhcCwgJnNoLT5kZXZbaV0uZmxhZ3MpKQ0KQEAgLTEw MjcsNiArMTE2OCw3IEBADQogCQlzcGluX3VubG9ja19pcnEoJmNvbmYtPmRldmljZV9sb2NrKTsN CiAJfQ0KIAlpZiAoZmFpbGVkID4gMSAmJiBzeW5jaW5nKSB7DQorCQlwcmludGsoS0VSTl9BTEVS VCAic3luYyBzdG9wcGVkIGJ5IElPIGVycm9yXG4iKTsNCiAJCW1kX2RvbmVfc3luYyhjb25mLT5t ZGRldiwgU1RSSVBFX1NFQ1RPUlMsMCk7DQogCQljbGVhcl9iaXQoU1RSSVBFX1NZTkNJTkcsICZz aC0+c3RhdGUpOw0KIAkJc3luY2luZyA9IDA7DQpAQCAtMTE5OCw2ICsxMzQwLDIyIEBADQogCQkJ CQlQUklOVEsoIldyaXRpbmcgYmxvY2sgJWRcbiIsIGkpOw0KIAkJCQkJbG9ja2VkKys7DQogCQkJ CQlzZXRfYml0KFI1X1dhbnR3cml0ZSwgJnNoLT5kZXZbaV0uZmxhZ3MpOw0KKwkJCQkJaWYgKGFz cGFyZSAmJiBpID09IGFzcGFyZW51bSkgew0KKwkJCQkJICAgIGNoYXIgKnBzLCAqcGQ7DQorDQor CQkJCQkgICAgLyogbWlycm9yaW5nIHRoaXMgbmV3IGJsb2NrICovDQorCQkJCQkgICAgUFJJTlRL KCJXcml0aW5nIHRvIGFzcGFyZSB0b28gJWQtPiVkXG4iLA0KKwkJCQkJCQlpLCBjb25mLT5yYWlk X2Rpc2tzKTsNCisJCQkJCSAgICAvKmlmICh0ZXN0X2JpdChSNV9MT0NLRUQsICZzaC0+ZGV2W2Nv bmYtPnJhaWRfZGlza3NdLmZsYWdzKSkgew0KKwkJCQkJCXByaW50aygiYmF6bWVnLCBleiBsb2tr b2x0MSEhIVxuIik7DQorCQkJCQkgICAgfSovDQorCQkJCQkgICAgcHMgPSBwYWdlX2FkZHJlc3Mo c2gtPmRldltpXS5wYWdlKTsNCisJCQkJCSAgICBwZCA9IHBhZ2VfYWRkcmVzcyhzaC0+ZGV2W2Nv bmYtPnJhaWRfZGlza3NdLnBhZ2UpOw0KKwkJCQkJICAgIC8qIGJldHRlciBpZGVhPyAqLw0KKwkJ CQkJICAgIG1lbWNweShwZCwgcHMsIFNUUklQRV9TSVpFKTsNCisJCQkJCSAgICBzZXRfYml0KFI1 X0xPQ0tFRCwgJnNoLT5kZXZbY29uZi0+cmFpZF9kaXNrc10uZmxhZ3MpOw0KKwkJCQkJICAgIHNl dF9iaXQoUjVfV2FudHdyaXRlLCAmc2gtPmRldltjb25mLT5yYWlkX2Rpc2tzXS5mbGFncyk7DQor CQkJCQl9DQogCQkJCQlpZiAoIXRlc3RfYml0KFI1X0luc3luYywgJnNoLT5kZXZbaV0uZmxhZ3Mp DQogCQkJCQkgICAgfHwgKGk9PXNoLT5wZF9pZHggJiYgZmFpbGVkID09IDApKQ0KIAkJCQkJCXNl dF9iaXQoU1RSSVBFX0lOU1lOQywgJnNoLT5zdGF0ZSk7DQpAQCAtMTIzNCwxNCArMTM5MiwzMCBA QA0KIAkJCWlmIChmYWlsZWQ9PTApDQogCQkJCWZhaWxlZF9udW0gPSBzaC0+cGRfaWR4Ow0KIAkJ CS8qIHNob3VsZCBiZSBhYmxlIHRvIGNvbXB1dGUgdGhlIG1pc3NpbmcgYmxvY2sgYW5kIHdyaXRl IGl0IHRvIHNwYXJlICovDQorCQkJaWYgKGFzcGFyZSkNCisJCQkgICAgZmFpbGVkX251bSA9IGFz cGFyZW51bTsNCiAJCQlpZiAoIXRlc3RfYml0KFI1X1VQVE9EQVRFLCAmc2gtPmRldltmYWlsZWRf bnVtXS5mbGFncykpIHsNCiAJCQkJaWYgKHVwdG9kYXRlKzEgIT0gZGlza3MpDQogCQkJCQlCVUco KTsNCiAJCQkJY29tcHV0ZV9ibG9jayhzaCwgZmFpbGVkX251bSk7DQogCQkJCXVwdG9kYXRlKys7 DQogCQkJfQ0KKwkJCWlmIChhc3BhcmUpIHsNCisJCQkgICAgY2hhciAqcHMsICpwZDsNCisNCisJ CQkgICAgcHMgPSBwYWdlX2FkZHJlc3Moc2gtPmRldltmYWlsZWRfbnVtXS5wYWdlKTsNCisJCQkg ICAgcGQgPSBwYWdlX2FkZHJlc3Moc2gtPmRldltjb25mLT5yYWlkX2Rpc2tzXS5wYWdlKTsNCisJ CQkgICAgbWVtY3B5KHBkLCBwcywgU1RSSVBFX1NJWkUpOw0KKwkJCSAgICBQUklOVEsoIlI1X1dh bnR3cml0ZSB0byBhc3BhcmUsIHVwdG9kYXRlOiAlZCAlcC0+JXBcbiIsDQorCQkJCQl1cHRvZGF0 ZSwgcHMsIHBkKTsNCisJCQkgICAgLyppZiAodGVzdF9iaXQoUjVfTE9DS0VELCAmc2gtPmRldltj b25mLT5yYWlkX2Rpc2tzXS5mbGFncykpIHsNCisJCQkJcHJpbnRrKCJiYXptZWcsIGV6IGxva2tv bHQyISEhXG4iKTsNCisJCQkgICAgfSovDQorCQkJfQ0KIAkJCWlmICh1cHRvZGF0ZSAhPSBkaXNr cykNCiAJCQkJQlVHKCk7DQorCQkJaWYgKGFzcGFyZSkNCisJCQkgICAgZmFpbGVkX251bSA9IGNv bmYtPnJhaWRfZGlza3M7DQogCQkJZGV2ID0gJnNoLT5kZXZbZmFpbGVkX251bV07DQogCQkJc2V0 X2JpdChSNV9MT0NLRUQsICZkZXYtPmZsYWdzKTsNCiAJCQlzZXRfYml0KFI1X1dhbnR3cml0ZSwg JmRldi0+ZmxhZ3MpOw0KQEAgLTEyNjUsNyArMTQzOSw3IEBADQogCQliaS0+Ymlfc2l6ZSA9IDA7 DQogCQliaS0+YmlfZW5kX2lvKGJpLCBieXRlcywgMCk7DQogCX0NCi0JZm9yIChpPWRpc2tzOyBp LS0gOykgew0KKwlmb3IgKGk9ZGlza3MrYXNwYXJlOyBpLS0gOykgew0KIAkJaW50IHJ3Ow0KIAkJ c3RydWN0IGJpbyAqYmk7DQogCQltZGtfcmRldl90ICpyZGV2Ow0KQEAgLTE1MDcsNiArMTY4MSwx NSBAQA0KIAkJdW5wbHVnX3NsYXZlcyhtZGRldik7DQogCQlyZXR1cm4gMDsNCiAJfQ0KKwkvKiBp ZiB0aGVyZSBpcyAxIG9yIG1vcmUgZmFpbGVkIGRyaXZlcyBhbmQgd2UgYXJlIHRyeWluZw0KKwkg KiB0byByZXN5bmMsIHRoZW4gYXNzZXJ0IHRoYXQgd2UgYXJlIGZpbmlzaGVkLCBiZWNhdXNlIHRo ZXJlIGlzDQorCSAqIG5vdGhpbmcgd2UgY2FuIGRvLg0KKwkgKi8NCisJaWYgKG1kZGV2LT5kZWdy YWRlZCA+PSAxICYmIHRlc3RfYml0KE1EX1JFQ09WRVJZX1NZTkMsICZtZGRldi0+cmVjb3Zlcnkp KSB7DQorCQlpbnQgcnYgPSAobWRkZXYtPnNpemUgPDwgMSkgLSBzZWN0b3JfbnI7DQorCQltZF9k b25lX3N5bmMobWRkZXYsIHJ2LCAxKTsNCisJCXJldHVybiBydjsNCisJfQ0KIA0KIAl4ID0gc2Vj dG9yX25yOw0KIAljaHVua19vZmZzZXQgPSBzZWN0b3JfZGl2KHgsIHNlY3RvcnNfcGVyX2NodW5r KTsNCkBAIC0xNjA1LDExICsxNzg4LDExIEBADQogCX0NCiANCiAJbWRkZXYtPnByaXZhdGUgPSBr bWFsbG9jIChzaXplb2YgKHJhaWQ1X2NvbmZfdCkNCi0JCQkJICArIG1kZGV2LT5yYWlkX2Rpc2tz ICogc2l6ZW9mKHN0cnVjdCBkaXNrX2luZm8pLA0KKwkJCQkgICsgKG1kZGV2LT5yYWlkX2Rpc2tz ICsgMSkgKiBzaXplb2Yoc3RydWN0IGRpc2tfaW5mbyksDQogCQkJCSAgR0ZQX0tFUk5FTCk7DQog CWlmICgoY29uZiA9IG1kZGV2LT5wcml2YXRlKSA9PSBOVUxMKQ0KIAkJZ290byBhYm9ydDsNCi0J bWVtc2V0IChjb25mLCAwLCBzaXplb2YgKCpjb25mKSArIG1kZGV2LT5yYWlkX2Rpc2tzICogc2l6 ZW9mKHN0cnVjdCBkaXNrX2luZm8pICk7DQorCW1lbXNldCAoY29uZiwgMCwgc2l6ZW9mICgqY29u ZikgKyAobWRkZXYtPnJhaWRfZGlza3MgKyAxKSAqIHNpemVvZihzdHJ1Y3QgZGlza19pbmZvKSAp Ow0KIAljb25mLT5tZGRldiA9IG1kZGV2Ow0KIA0KIAlpZiAoKGNvbmYtPnN0cmlwZV9oYXNodGJs ID0gKHN0cnVjdCBzdHJpcGVfaGVhZCAqKikgX19nZXRfZnJlZV9wYWdlcyhHRlBfQVRPTUlDLCBI QVNIX1BBR0VTX09SREVSKSkgPT0gTlVMTCkNCkBAIC0xNjM5LDcgKzE4MjIsNiBAQA0KIA0KIAkJ ZGlzay0+cmRldiA9IHJkZXY7DQogDQotCQlyZGV2LT5yZXJyID0gMDsJCS8qICEhISAqLw0KIAkJ aWYgKHJkZXYtPmluX3N5bmMpIHsNCiAJCQljaGFyIGJbQkRFVk5BTUVfU0laRV07DQogCQkJcHJp bnRrKEtFUk5fSU5GTyAicmFpZDU6IGRldmljZSAlcyBvcGVyYXRpb25hbCBhcyByYWlkIg0KQEAg LTE2NTAsNiArMTgzMiw3IEBADQogCX0NCiANCiAJY29uZi0+cmFpZF9kaXNrcyA9IG1kZGV2LT5y YWlkX2Rpc2tzOw0KKwljb25mLT5taXJyb3JpdCA9IC0xOw0KIAkvKg0KIAkgKiAwIGZvciBhIGZ1 bGx5IGZ1bmN0aW9uYWwgYXJyYXksIDEgZm9yIGEgZGVncmFkZWQgYXJyYXkuDQogCSAqLw0KQEAg LTE2OTksNyArMTg4Miw3IEBADQogCQl9DQogCX0NCiBtZW1vcnkgPSBjb25mLT5tYXhfbnJfc3Ry aXBlcyAqIChzaXplb2Yoc3RydWN0IHN0cmlwZV9oZWFkKSArDQotCQkgY29uZi0+cmFpZF9kaXNr cyAqICgoc2l6ZW9mKHN0cnVjdCBiaW8pICsgUEFHRV9TSVpFKSkpIC8gMTAyNDsNCisJCSAoY29u Zi0+cmFpZF9kaXNrcysxKSAqICgoc2l6ZW9mKHN0cnVjdCBiaW8pICsgUEFHRV9TSVpFKSkpIC8g MTAyNDsNCiAJaWYgKGdyb3dfc3RyaXBlcyhjb25mLCBjb25mLT5tYXhfbnJfc3RyaXBlcykpIHsN CiAJCXByaW50ayhLRVJOX0VSUiANCiAJCQkicmFpZDU6IGNvdWxkbid0IGFsbG9jYXRlICVka0Ig Zm9yIGJ1ZmZlcnNcbiIsIG1lbW9yeSk7DQpAQCAtMTg1OSw2ICsyMDQyLDE3IEBADQogCQkJdG1w LT5yZGV2LT5pbl9zeW5jID0gMTsNCiAJCX0NCiAJfQ0KKwl0bXAgPSBjb25mLT5kaXNrcyArIGk7 DQorCWlmICh0bXAtPnJkZXYgJiYgIXRtcC0+cmRldi0+ZmF1bHR5ICYmICF0bXAtPnJkZXYtPmlu X3N5bmMpIHsNCisJICAgIC8qIHN5bmMgZG9uZSB0byB0aGUgJ2FjdGl2ZSBzcGFyZScgKi8NCisJ ICAgIHRtcC0+cmRldi0+aW5fc3luYyA9IDE7DQorDQorCSAgICBwcmludGsoS0VSTl9OT1RJQ0Ug InJhaWQ1X3NwYXJlX2FjdGl2ZTogJWQgaW5fc3luYyAlZC0+JWRcbiIsDQorCQkJaSwgdG1wLT5y ZGV2LT5yYWlkX2Rpc2ssIGNvbmYtPm1pcnJvcml0KTsNCisNCisJICAgIC8qIHNjYXJ5Li4/IDp9 ICovDQorCSAgICB0bXAtPnJkZXYtPnJhaWRfZGlzayA9IGNvbmYtPm1pcnJvcml0Ow0KKwl9DQog CXByaW50X3JhaWQ1X2NvbmYoY29uZik7DQogCXJldHVybiAwOw0KIH0NCkBAIC0xODcyLDYgKzIw NjYsNyBAQA0KIA0KIAlwcmludF9yYWlkNV9jb25mKGNvbmYpOw0KIAlyZGV2ID0gcC0+cmRldjsN CitwcmludGsoInJhaWQ1X3JlbW92ZV9kaXNrICVkXG4iLCBudW1iZXIpOw0KIAlpZiAocmRldikg ew0KIAkJaWYgKHJkZXYtPmluX3N5bmMgfHwNCiAJCSAgICBhdG9taWNfcmVhZCgmcmRldi0+bnJf cGVuZGluZykpIHsNCkBAIC0xODk5LDE4ICsyMDk0LDM1IEBADQogCWludCBkaXNrOw0KIAlzdHJ1 Y3QgZGlza19pbmZvICpwOw0KIA0KKwlpZiAobWRkZXYtPmRlZ3JhZGVkID4gMSkNCisJCS8qIG5v IHBvaW50IGFkZGluZyBhIGRldmljZSAqLw0KKwkJcmV0dXJuIDA7DQorDQogCS8qDQogCSAqIGZp bmQgdGhlIGRpc2sgLi4uDQogCSAqLw0KIAlmb3IgKGRpc2s9MDsgZGlzayA8IG1kZGV2LT5yYWlk X2Rpc2tzOyBkaXNrKyspDQogCQlpZiAoKHA9Y29uZi0+ZGlza3MgKyBkaXNrKS0+cmRldiA9PSBO VUxMKSB7DQogCQkJcmRldi0+aW5fc3luYyA9IDA7DQotCQkJcmRldi0+cmVyciA9IDA7CQkvKiAh ISEgKi8NCiAJCQlyZGV2LT5yYWlkX2Rpc2sgPSBkaXNrOw0KIAkJCWZvdW5kID0gMTsNCiAJCQlw LT5yZGV2ID0gcmRldjsNCiAJCQlicmVhazsNCiAJCX0NCisNCisJaWYgKCFmb3VuZCkgew0KKwkg ICAgLyogYXJyYXkgb3B0aW1hbCwgdGhpcyBzaG91bGQgYmUgdGhlICdhY3RpdmUgc3BhcmUnICov DQorCSAgICBjb25mLT5kaXNrc1tkaXNrXS5yZGV2ID0gcmRldjsNCisJICAgIHJkZXYtPmluX3N5 bmMgPSAwOw0KKwkgICAgcmRldi0+cmFpZF9kaXNrID0gY29uZi0+cmFpZF9kaXNrczsNCisNCisJ ICAgIG1kZGV2LT5kZWdyYWRlZC0tOw0KKwkgICAgZm91bmQrKzsJLyogY2FsbCByZXN5bmMgKi8N CisNCisJICAgIHByaW50ayhLRVJOX0lORk8gImFkZGVkIHNwYXJlIGZvciBhY3RpdmUgcmVzeW5j XG4iKTsNCisJfQ0KKwlwcmludGsoS0VSTl9JTkZPICJyYWlkNV9hZGRfZGlzazogJWQgKCVkKVxu IiwgZGlzaywgZm91bmQpOw0KKw0KIAlwcmludF9yYWlkNV9jb25mKGNvbmYpOw0KIAlyZXR1cm4g Zm91bmQ7DQogfQ0K --=-DvtaF2vGlPL1euJhlIZS--