[PATCH] proactive raid5 disk replacement for 2.6.11, updated

[PATCH] proactive raid5 disk replacement for 2.6.11, updated

am 18.08.2005 01:52:10 von Pallai Roland

--=-qUfi0mPUCbSVjUIavgzS
Content-Type: text/plain
Content-Transfer-Encoding: 7bit


per-device bad block cache has been implemented to speed up arrays with
partially failed drives (replies are often slow from those). also
helps to determine badly damaged drives based on number of bad blocks,
and can take an action if steps over an user defined threshold
(see /proc/sys/dev/raid/badblock_tolerance).
rewrite of a bad stripe will delete the entry from the cache, so it
honors the auto sector reallocation feature of ATA drives

performance is affected just a little bit if there's no or some
registered bad blocks, but over a million that could be a problem
currently, I'll examine it later..

if we've a spare and a drive had kicked, that spare becomes to 'active
spare', sync begins, but the original (failed) drive won't be kicked
until the sync will not have finished. if the original drive still drops
errors after had been synced, the in_sync spare replaces that online
otherwise you can do it manually (mdadm -f)

you can check the list of registered bad sectors in /proc/mdstat (in
debug mode), and the size of the cache with: grep _bbc /proc/slabinfo


please let me know if you're interested in, otherwise I'll not flood
the list with this topic..


my /proc/mdstat now:

md0 : active raid5 ram4[2] md2[1] md1[0]
8064 blocks level 5, 64k chunk, algorithm 2 [3/3] [UUU]
known bad sectors on active devices:
ram4
md2
md1 56 136 232 472 600 872 1176 1248 1336 1568 1688 1952 2104

md2 : active faulty ram1[0]
4096 blocks nfaults=0

md1 : active faulty ram0[0]
4096 blocks ReadPersistent=92(100) nfaults=13


--
dap



--=-qUfi0mPUCbSVjUIavgzS
Content-Disposition: attachment; filename=04_raid5-asp-dap3.diff
Content-Type: text/x-patch; name=04_raid5-asp-dap3.diff; charset=ISO-8859-2
Content-Transfer-Encoding: base64

DQogdGhpcyBpcyBhIGZlYXR1cmUgcGF0Y2ggdGhhdCBpbXBsZW1lbnRzICdw cm9hY3RpdmUgcmFp
ZDUgZGlzaw0KcmVwbGFjZW1lbnQnIChodHRwOi8vd3d3LmFyY3RpYy5vcmcv fmRlYW4vcmFpZC13
aXNobGlzdC5odG1sKSwNCnRoYXQgY291bGQgaGVscCBhIGxvdCBvbiBsYXJn ZSByYWlkNSBhcnJh
eXMgYnVpbHQgZnJvbSBjaGVhcCBzYXRhDQpkcml2ZXJzIHdoZW4gdGhlIElP IHRyYWZmaWMgc3Vj
aCBsYXJnZSB0aGF0IGRhaWx5IG1lZGlhIHNjYW4gb24gdGhlDQpkaXNrcyBp c24ndCBwb3NzaWJs
ZS4NCiBsaW51eCBzb2Z0d2FyZSByYWlkIGlzIHZlcnkgZnJhZ2lsZSBieSBk ZWZhdWx0LCB0aGUg
dHlwaWNhbCAobmVydm91cykNCmJyZWFrZG93biBzaXR1YXRpb246IEkgbm90 aWNlZCBhIGJhZCBi
bG9jayBvbiBhIGRyaXZlLCByZXBsYWNlIGl0LA0KYW5kIHRoZSByZXN5bmMg ZmFpbHMgY2F1c2Ug
YW5vdGhlciAyLTMgZGlza3MgaGFzIGhpZGRlbiBiYWRibG9ja3MgdG9vLg0K SSd2ZSB0byBzYXZl
IHRoZSBkaXNrcyBhbmQgcmVidWlsZCBiYWQgYmxvY2tzIHdpdGggYSB1c2Vy c3BhY2UgdG9vbCAo
YnkNCmhhbmQuLiksIG1lYW53aGlsZSB0aGUgc2l0ZSBpcyBkb3duIGZvciBo b3Vycy4gYmFkOyBl
c3BlY2lhbGx5IHdoZW4gYQ0KcGFpciBvZiBzaW1wbGUgc3RlcHMgZW5vdWdo IHRvIGF2b2lkIGZy
b20gdGhpcyBhdHlwaWNhbCBwcm9ibGVtOg0KIDEuIGRvbnQga2ljayBhIGRy aXZlIG9uIHJlYWQg
ZXJyb3IgY2F1c2UgaXQgaXMgcG9zc2libGUgdGhhdCA5OS45OSUgaXMNCnVz ZWFibGUgYW5kIHdp
bGwgaGVscCAodG8gc2VydmUgYW5kIHRvIHNhdmUgZGF0YSkgaWYgYW5vdGhl ciBkcml2ZSBzaG93
DQpiYWQgc2VjdG9ycyBpbiBzYW1lIGFycmF5DQogMi4gbGV0IHRvIG1pcnJv ciBhIHBhcnRpYWxs
eSBmYWlsZWQgZHJpdmUgdG8gYSBzcGFyZSBfb25saW5lXyBhbmQgcmVwbGFj ZQ0KdGhlIHNvdXJj
ZSBvZiB0aGUgbWlycm9yIHdpdGggdGhlIHNwYXJlIHdoZW4gaXQncyBkb25l LiBiYWQgYmxvY2tz
IGlzbid0DQphIHByb2JsZW0gdW5sZXNzIHNhbWUgc2VjdG9yIGRhbWFnZWQg b24gdHdvIGRpc2tz
IHdoYXQncyBhIHJhcmUgY2FzZS4gaW4NCnRoaXMgd2F5IGlzIHBvc3NpYmxl IHRvIGZpeCBhbiBh
cnJheSB3aXRoIHBhcnRpYWxseSBmYWlsZWQgZHJpdmVzDQp3aXRob3V0IGRh dGEgbG9zcyBhbmQg
d2l0aG91dCBkb3dudGltZQ0KDQogSSdtIG5vdCBhIHByb2dyYW1tZXIganVz dCBhIHN5c2FkbSB3
aG8gYWRtaW5zIGEgbGFyZ2Ugc29mdHdhcmUgc2F0YQ0KYXJyYXksIGJ1dCBt eSBhbmdyeSBnb3Qg
YmlnZ2VyIHRoYW4gbXkgbGF6aW5lc3MsIHNvIEkgbWFkZSB0aGlzIHBhdGNo IG9uDQp0aGlzIHdl
ZWtlbmQuLiBJIGRvbid0IHVuZGVyc3RhbmQgZXZlcnkgcGllY2Ugb2YgdGhl IG1kIGNvZGUgKGVn
LiB0aGUNCmlmLWZvcmVzdCBvZiB0aGUgaGFuZGxlX3N0cmlwZSA6KSB5ZXQs IHNvIHRoaXMgcGF0
Y2ggbWF5IGJlIGEgYnVnLWNvbG9ueQ0KYW5kIHdyb25nIGJ5IGRlc2lnbiwg YnV0IEkndmUgdGVz
dGVkIGl0IHVuZGVyIGhlYXZ5IHN0cmVzcyB3aXRoIGJvdGggb2YNCidmYXVs dHknIG1vZHVsZSBh
bmQgcmVhbCBkaXNrcywgYW5kIGl0IHdvcmtzIGZpbmUhDQoNCiBpZGVhcywg cGllY2Ugb2YgYWR2
aWNlLCBidWdmaXgvZW5jaGFuY2VtZW50IGlzIHdlbGNvbWVkIQ0KDQoNCiAo SSBrbm93LCByYWlk
NiBjb3VsZCBiZSBhbm90aGVyIHNvbHV0aW9uIGZvciB0aGlzIHByb2JsZW0s IGJ1dCB0aGF0J3Mg
YQ0KbGFyZ2Ugb3ZlcmhlYWQuKQ0KDQoNCnVzZToNCg0KMS4gcGF0Y2ggdGhl IGtlcm5lbCwgdGhp
cyBvbmUgaXMgYWdhaW5zdCAyLjYuMTENCjIuIHR5cGU6DQoNCiMgbWFrZSBk cml2ZXMNCm1kYWRt
IC1CIC1uMSAtbCBmYXVsdHkgL2Rldi9tZC8xIC9kZXYvcmQvMA0KbWRhZG0g LUIgLW4xIC1sIGZh
dWx0eSAvZGV2L21kLzIgL2Rldi9yZC8xDQptZGFkbSAtQiAtbjEgLWwgZmF1 bHR5IC9kZXYvbWQv
MyAvZGV2L3JkLzINCg0KIyBtYWtlIHRoZSBhcnJheQ0KbWRhZG0gLUMgLW4z IC1sNSAvZGV2L21k
LzAgL2Rldi9tZC8xIC9kZXYvbWQvMiAvZGV2L21kLzMNCg0KIyAuLiB3YWl0 IGZvciBzeW5jIC4u
DQoNCiMgZ3JvdyBiYWQgYmxvY2tzIGFzIG1hKnRvciBkb2VzDQptZGFkbSAt LWdyb3cgLWwgZmF1
bHR5IC1wIHJwNDU0IC9kZXYvbWQvMQ0KbWRhZG0gLS1ncm93IC1sIGZhdWx0 eSAtcCBycDczOCAv
ZGV2L21kLzINCg0KIyBhZGQgYSBzcGFyZQ0KbWRhZG0gLWEgL2Rldi9tZC8w IC9kZXYvcmQvNA0K
DQojIC0+IGZhaWwgYSBkcml2ZSwgc3luYyBiZWdpbnMgPC0NCiMgIHRoZSBt ZC8xIHdpbGwgbm90
IG1hcmtlZCBhcyBmYWlsZWQsIHRoaXMgaXMgdGhlIHBvaW50LCBidXQgaWYg eW91IHdhbnQgdG8s
DQojICB5b3UgY2FuIGlzc3VlIHRoaXMgY29tbWFuZCBhZ2FpbiENCm1kYWRt IC1mIC9kZXYvbWQv
MCAvZGV2L21kLzENCg0KIyBrZXJuZWw6DQojICByZXN5bmMgZnJvbSBtZDEg dG8gc3BhcmUgcmFt
NA0KIyAgYWRkZWQgc3BhcmUgZm9yIGFjdGl2ZSByZXN5bmMNCg0KIyAuLiB3 b25kZXIgdGhlIHJl
YWQgZXJyb3JzIGZyb20gbWRbMTJdIGFuZCB0aGUgc3luYyBnb2VzIG9uIQ0K IyBmZWVsIGZyZWUg
dG8gc3RyZXNzIHRoZSBtZCBhdCB0aGlzIHRpbWUsIG1rZnMsIGRkLCBiYWRi bG9ja3MsIGV0Yw0K
DQojIGtlcm5lbDoNCiMgIHJhaWQ1X3NwYXJlX2FjdGl2ZTogMyBpbl9zeW5j IDMtPjANCiMgL3By
b2MvbWRzdGF0Og0KIyAgbWQwIDogYWN0aXZlIHJhaWQ1IHJhbTRbMF0gbWQz WzJdIG1kMlsxXSBt
ZDFbMF0NCiMgLT4gcmFtNCBhbmQgbWQxIGhhcyBzYW1lIGlkLCB0aGlzIG1l YW5zIHRoZSBzcGFy
ZSBpcyBhIGNvbXBsZXRlIG1pcnJvciwNCiMgICAgICAgaWYgeW91IHN0b3Ag dGhlIGFycmF5IHlv
dSBjYW4gYXNzZW1ibHkgaXQgd2l0aCByYW00IGluc3RlYWQgb2YgbWQxLA0K IyAgICAgICB0aGUg
c3VwZXJibG9jayBzYW1lIGJvdGggb2YgdGhlbQ0KDQojIGNoZWNrIHRoZSBt aXJyb3IgKHN0b3Ag
d3JpdGUgc3RyZXNzIGlmIGFueSkNCm1kYWRtIC0tZ3JvdyAtbCBmYXVsdHkg LXAgbm9uZSAvZGV2
L21kLzENCmNtcCAvZGV2L21kLzEgL2Rldi9yZC80DQoNCiMgaG90LXJlcGxh Y2UgdGhlIG1pcnJv
cmVkIC1wYXJ0aWFsbHkgZmFpbGVkLSBkZXZpY2Ugd2l0aCB0aGUgYWN0aXZl IHNwYXJlDQojICAo
eWVzLCBtYXJrIGl0IGFzIGZhaWxlZCBhZ2FpbiwgYnV0IGlmIHRoZXJlJ3Mg YSBzeW5jaW5nLSBv
ciBzeW5jZWQgJ2FjdGl2ZSBzcGFyZScNCiMgICAgICAgdGhlIC1mIHJlYWxs eSBmYWlscyB0aGUg
ZGV2aWNlIG9yIHJlcGxhY2UgaXQgd2l0aCB0aGUgc3luY2VkIHNwYXJlKQ0K bWRhZG0gLWYgL2Rl
di9tZC8wIC9kZXYvbWQvMQ0KDQojIGtlcm5lbDoNCiMgIHJlcGxhY2UgbWQx IHdpdGggaW5fc3lu
YyBhY3RpdmUgc3BhcmUgcmFtNA0KDQojIGFuZCB2b2lsYSENCiMgL3Byb2Mv bWRzdGF0Og0KIyAg
bWQwIDogYWN0aXZlIHJhaWQ1IHJhbTRbMF0gbWQzWzJdIG1kMlsxXQ0KDQoN CnVwZGF0ZToNCg0K
IHBlci1kZXZpY2UgYmFkIGJsb2NrIGNhY2hlIGhhcyBiZWVuIGltcGxlbWVu dGVkIHRvIHNwZWVk
IHVwIGFycmF5cyB3aXRoDQpwYXJ0aWFsbHkgZmFpbGVkIGRyaXZlcyAocmVw bGllcyBhcmUgb2Z0
ZW4gc2xvdyBmcm9tIHRob3NlKS4gYWxzbw0KaGVscHMgdG8gZGV0ZXJtaW5l IGJhZGx5IGRhbWFn
ZWQgZHJpdmVzIGJhc2VkIG9uIG51bWJlciBvZiBiYWQgYmxvY2tzLA0KYW5k IGNhbiB0YWtlIGFu
IGFjdGlvbiBpZiBzdGVwcyBvdmVyIGFuIHVzZXIgZGVmaW5lZCB0aHJlc2hv bGQNCihzZWUgL3By
b2Mvc3lzL2Rldi9yYWlkL2JhZGJsb2NrX3RvbGVyYW5jZSkuDQpyZXdyaXRl IG9mIGEgYmFkIHN0
cmlwZSB3aWxsIGRlbGV0ZSB0aGUgZW50cnkgZnJvbSB0aGUgY2FjaGUsIHNv IGl0IGhvbm9ycw0K
dGhlIGF1dG8gc2VjdG9yIHJlYWxsb2NhdGlvbiBmZWF0dXJlIG9mIEFUQSBk cml2ZXMNCg0KIHBl
cmZvcm1hbmNlIGlzIGFmZmVjdGVkIGp1c3QgYSBsaXR0bGUgYml0IGlmIHRo ZXJlJ3Mgbm8gb3Ig
c29tZSByZWdpc3RlcmVkDQpiYWQgYmxvY2tzLCBidXQgb3ZlciBhIG1pbGxp b24gdGhhdCBjb3Vs
ZCBiZSBhIHByb2JsZW0gY3VycmVudGx5LCBJJ2xsIGV4YW1pbmUNCml0IGxh dGVyLi4NCg0KIGlm
IHdlJ3ZlIGEgc3BhcmUgYW5kIGEgZHJpdmUgaGFkIGtpY2tlZCwgdGhhdCBz cGFyZSBiZWNvbWVz
IHRvDQonYWN0aXZlIHNwYXJlJywgc3luYyBiZWdpbnMsIGJ1dCB0aGUgb3Jp Z2luYWwgKGZhaWxl
ZCkgZHJpdmUgd29uJ3QgYmUNCmtpY2tlZCB1bnRpbCB0aGUgc3luYyB3aWxs IG5vdCBoYXZlIGZp
bmlzaGVkLiBpZiB0aGUgb3JpZ2luYWwgZHJpdmUgc3RpbGwNCmRyb3BzIGVy cm9ycyBhZnRlciBo
YWQgYmVlbiBzeW5jZWQsIHRoZSBpbl9zeW5jIHNwYXJlIHJlcGxhY2VzIHRo YXQgb25saW5lDQoN
CiB5b3UgY2FuIGNoZWNrIHRoZSBsaXN0IG9mIHJlZ2lzdGVyZWQgYmFkIHNl Y3RvcnMgaW4gL3By
b2MvbWRzdGF0IChpbiBkZWJ1ZyBtb2RlKSwNCmFuZCB0aGUgc2l6ZSBvZiB0 aGUgY2FjaGUgd2l0
aDogZ3JlcCBfYmJjIC9wcm9jL3NsYWJpbmZvDQoNCg0KbXkgL3Byb2MvbWRz dGF0Og0KDQptZDAg
OiBhY3RpdmUgcmFpZDUgcmFtNFsyXSBtZDJbMV0gbWQxWzBdDQogICAgICA4 MDY0IGJsb2NrcyBs
ZXZlbCA1LCA2NGsgY2h1bmssIGFsZ29yaXRobSAyIFszLzNdIFtVVVVdDQog ICAgICBrbm93biBi
YWQgc2VjdG9ycyBvbiBhY3RpdmUgZGV2aWNlczoNCiAgICAgIHJhbTQNCiAg ICAgIG1kMg0KICAg
ICAgbWQxIDU2IDEzNiAyMzIgNDcyIDYwMCA4NzIgMTE3NiAxMjQ4IDEzMzYg MTU2OCAxNjg4IDE5
NTIgMjEwNA0KDQptZDIgOiBhY3RpdmUgZmF1bHR5IHJhbTFbMF0NCiAgICAg IDQwOTYgYmxvY2tz
IG5mYXVsdHM9MA0KICAgICAgDQptZDEgOiBhY3RpdmUgZmF1bHR5IHJhbTBb MF0NCiAgICAgIDQw
OTYgYmxvY2tzIFJlYWRQZXJzaXN0ZW50PTkyKDEwMCkgbmZhdWx0cz0xMw0K ICAgICAgDQoNCg0K
LS0tIGxpbnV4L2luY2x1ZGUvbGludXgvcmFpZC9yYWlkNS5oLm9yaWcJMjAw NS0wMy0wMyAyMzo1
MToyOS4wMDAwMDAwMDAgKzAxMDANCisrKyBsaW51eC9pbmNsdWRlL2xpbnV4 L3JhaWQvcmFpZDUu
aAkyMDA1LTA4LTE0IDAzOjAyOjExLjAwMDAwMDAwMCArMDIwMA0KQEAgLTE0 Nyw2ICsxNDcsNyBA
QA0KICNkZWZpbmUJUjVfVVBUT0RBVEUJMAkvKiBwYWdlIGNvbnRhaW5zIGN1 cnJlbnQgZGF0YSAq
Lw0KICNkZWZpbmUJUjVfTE9DS0VECTEJLyogSU8gaGFzIGJlZW4gc3VibWl0 dGVkIG9uICJyZXEi
ICovDQogI2RlZmluZQlSNV9PVkVSV1JJVEUJMgkvKiB0b3dyaXRlIGNvdmVy cyB3aG9sZSBwYWdl
ICovDQorI2RlZmluZQlSNV9GQUlMRUQJOAkvKiBmYWlsZWQgdG8gcmVhZCB0 aGlzIHN0cmlwZSAq
Lw0KIC8qIGFuZCBzb21lIHRoYXQgYXJlIGludGVybmFsIHRvIGhhbmRsZV9z dHJpcGUgKi8NCiAj
ZGVmaW5lCVI1X0luc3luYwkzCS8qIHJkZXYgJiYgcmRldi0+aW5fc3luYyBh dCBzdGFydCAqLw0K
ICNkZWZpbmUJUjVfV2FudHJlYWQJNAkvKiB3YW50IHRvIHNjaGVkdWxlIGEg cmVhZCAqLw0KQEAg
LTE5Niw4ICsxOTcsMTYgQEANCiAgKi8NCiAgDQogDQorc3RydWN0IGJhZGJs b2NrIHsNCisJc3Ry
dWN0IGJhZGJsb2NrCQkqaGFzaF9uZXh0LCAqKmhhc2hfcHByZXY7IC8qIGhh c2ggcG9pbnRlcnMg
Ki8NCisJc2VjdG9yX3QJCXNlY3RvcjsgLyogc3RyaXBlICMgKi8NCit9Ow0K Kw0KIHN0cnVjdCBk
aXNrX2luZm8gew0KIAltZGtfcmRldl90CSpyZGV2Ow0KKwlzdHJ1Y3QgYmFk YmxvY2sgKipiYWRi
bG9ja19oYXNodGJsOyAvKiBsaXN0IG9mIGtub3duIGJhZGJsb2NrcyAqLw0K KwljaGFyCQljYWNo
ZV9uYW1lWzIwXTsNCisJa21lbV9jYWNoZV90CSpzbGFiX2NhY2hlOyAvKiBi YWRibG9jayBkYiAq
Lw0KIH07DQogDQogc3RydWN0IHJhaWQ1X3ByaXZhdGVfZGF0YSB7DQpAQCAt MjI0LDYgKzIzMyw4
IEBADQogCWludAkJCWluYWN0aXZlX2Jsb2NrZWQ7CS8qIHJlbGVhc2Ugb2Yg aW5hY3RpdmUgc3Ry
aXBlcyBibG9ja2VkLA0KIAkJCQkJCQkgKiB3YWl0aW5nIGZvciAyNSUgdG8g YmUgZnJlZQ0KIAkJ
CQkJCQkgKi8gICAgICAgIA0KKwlpbnQJCQltaXJyb3JpdDsgLyogc291cmNl IGZvciBhY3RpdmUg
c3BhcmUgcmVzeW5jICovDQorDQogCXNwaW5sb2NrX3QJCWRldmljZV9sb2Nr Ow0KIAlzdHJ1Y3Qg
ZGlza19pbmZvCWRpc2tzWzBdOw0KIH07DQotLS0gbGludXgvaW5jbHVkZS9s aW51eC9zeXNjdGwu
aC5vcmlnCTIwMDUtMDctMDYgMjA6MTk6MTAuMDAwMDAwMDAwICswMjAwDQor KysgbGludXgvaW5j
bHVkZS9saW51eC9zeXNjdGwuaAkyMDA1LTA4LTE3IDIyOjAxOjI4LjAwMDAw MDAwMCArMDIwMA0K
QEAgLTc3OCw3ICs3NzgsOCBAQA0KIC8qIC9wcm9jL3N5cy9kZXYvcmFpZCAq Lw0KIGVudW0gew0K
IAlERVZfUkFJRF9TUEVFRF9MSU1JVF9NSU49MSwNCi0JREVWX1JBSURfU1BF RURfTElNSVRfTUFY
PTINCisJREVWX1JBSURfU1BFRURfTElNSVRfTUFYPTIsDQorCURFVl9SQUlE X0JBREJMT0NLX1RP
TEVSQU5DRT0zDQogfTsNCiANCiAvKiAvcHJvYy9zeXMvZGV2L3BhcnBvcnQv ZGVmYXVsdCAqLw0K
LS0tIGxpbnV4L2RyaXZlcnMvbWQvbWQuYy5vcmlnCTIwMDUtMDgtMTQgMjE6 MjI6MDguMDAwMDAw
MDAwICswMjAwDQorKysgbGludXgvZHJpdmVycy9tZC9tZC5jCTIwMDUtMDgt MTQgMTc6MjA6MTUu
MDAwMDAwMDAwICswMjAwDQpAQCAtNzgsNiArNzgsMTAgQEANCiBzdGF0aWMg aW50IHN5c2N0bF9z
cGVlZF9saW1pdF9taW4gPSAxMDAwOw0KIHN0YXRpYyBpbnQgc3lzY3RsX3Nw ZWVkX2xpbWl0X21h
eCA9IDIwMDAwMDsNCiANCisvKiBvdmVyIHRoaXMgbGltaXQgdGhlIGRyaXZl J2xsIGJlIG1hcmtl
ZCBhcyBmYWlsZWQuIG1lYXN1cmUgaXMgYmxvY2suICovDQoraW50IHN5c2N0 bF9iYWRibG9ja190
b2xlcmFuY2UgPSAxMDAwMDsNCisNCisNCiBzdGF0aWMgc3RydWN0IGN0bF90 YWJsZV9oZWFkZXIg
KnJhaWRfdGFibGVfaGVhZGVyOw0KIA0KIHN0YXRpYyBjdGxfdGFibGUgcmFp ZF90YWJsZVtdID0g
ew0KQEAgLTk3LDYgKzEwMSwxNCBAQA0KIAkJLm1vZGUJCT0gMDY0NCwNCiAJ CS5wcm9jX2hhbmRs
ZXIJPSAmcHJvY19kb2ludHZlYywNCiAJfSwNCisJew0KKwkJLmN0bF9uYW1l CT0gREVWX1JBSURf
QkFEQkxPQ0tfVE9MRVJBTkNFLA0KKwkJLnByb2NuYW1lCT0gImJhZGJsb2Nr X3RvbGVyYW5jZSIs
DQorCQkuZGF0YQkJPSAmc3lzY3RsX2JhZGJsb2NrX3RvbGVyYW5jZSwNCisJ CS5tYXhsZW4JCT0g
c2l6ZW9mKGludCksDQorCQkubW9kZQkJPSAwNjQ0LA0KKwkJLnByb2NfaGFu ZGxlcgk9ICZwcm9j
X2RvaW50dmVjLA0KKwl9LA0KIAl7IC5jdGxfbmFtZSA9IDAgfQ0KIH07DQog DQpAQCAtMzUyNSwx
MCArMzUzNywxMiBAQA0KIAkJfQ0KIAkJaWYgKG1kZGV2LT5zeW5jX3RocmVh ZCkgew0KIAkJCS8q
IHJlc3luYyBoYXMgZmluaXNoZWQsIGNvbGxlY3QgcmVzdWx0ICovDQorcHJp bnRrKCJtZF9jaGVj
a19yZWNvdmVyeTogcmVzeW5jIGhhcyBmaW5pc2hlZFxuIik7DQogCQkJbWRf dW5yZWdpc3Rlcl90
aHJlYWQobWRkZXYtPnN5bmNfdGhyZWFkKTsNCiAJCQltZGRldi0+c3luY190 aHJlYWQgPSBOVUxM
Ow0KIAkJCWlmICghdGVzdF9iaXQoTURfUkVDT1ZFUllfRVJSLCAmbWRkZXYt PnJlY292ZXJ5KSAm
Jg0KIAkJCSAgICAhdGVzdF9iaXQoTURfUkVDT1ZFUllfSU5UUiwgJm1kZGV2 LT5yZWNvdmVyeSkp
IHsNCitwcmludGsoIm1kX2NoZWNrX3JlY292ZXJ5OiBhY3RpdmF0ZSBhbnkg c3BhcmVzXG4iKTsN
CiAJCQkJLyogc3VjY2Vzcy4uLiovDQogCQkJCS8qIGFjdGl2YXRlIGFueSBz cGFyZXMgKi8NCiAJ
CQkJbWRkZXYtPnBlcnMtPnNwYXJlX2FjdGl2ZShtZGRldik7DQpAQCAtMzU0 NSwxOCArMzU1OSwx
OSBAQA0KIA0KIAkJLyogbm8gcmVjb3ZlcnkgaXMgcnVubmluZy4NCiAJCSAq IHJlbW92ZSBhbnkg
ZmFpbGVkIGRyaXZlcywgdGhlbg0KLQkJICogYWRkIHNwYXJlcyBpZiBwb3Nz aWJsZQ0KKwkJICog
YWRkIHNwYXJlcyBpZiBwb3NzaWJsZS4NCisJCSAqIFNwYXJlIGFyZSBhbHNv IHJlbW92ZWQgYW5k
IHJlLWFkZGVkLCB0byBhbGxvdw0KKwkJICogdGhlIHBlcnNvbmFsaXR5IHRv IGZhaWwgdGhlIHJl
LWFkZC4NCiAJCSAqLw0KLQkJSVRFUkFURV9SREVWKG1kZGV2LHJkZXYscnRt cCkgew0KKwkJSVRF
UkFURV9SREVWKG1kZGV2LHJkZXYscnRtcCkNCiAJCQlpZiAocmRldi0+cmFp ZF9kaXNrID49IDAg
JiYNCi0JCQkgICAgcmRldi0+ZmF1bHR5ICYmDQorCQkJICAgIChyZGV2LT5m YXVsdHkgfHwgISBy
ZGV2LT5pbl9zeW5jKSAmJg0KIAkJCSAgICBhdG9taWNfcmVhZCgmcmRldi0+ bnJfcGVuZGluZyk9
PTApIHsNCitwcmludGsoIm1kX2NoZWNrX3JlY292ZXJ5OiBob3RfcmVtb3Zl X2Rpc2tcbiIpOw0K
IAkJCQlpZiAobWRkZXYtPnBlcnMtPmhvdF9yZW1vdmVfZGlzayhtZGRldiwg cmRldi0+cmFpZF9k
aXNrKT09MCkNCiAJCQkJCXJkZXYtPnJhaWRfZGlzayA9IC0xOw0KIAkJCX0N Ci0JCQlpZiAoIXJk
ZXYtPmZhdWx0eSAmJiByZGV2LT5yYWlkX2Rpc2sgPj0gMCAmJiAhcmRldi0+ aW5fc3luYykNCi0J
CQkJc3BhcmVzKys7DQotCQl9DQorDQogCQlpZiAobWRkZXYtPmRlZ3JhZGVk KSB7DQogCQkJSVRF
UkFURV9SREVWKG1kZGV2LHJkZXYscnRtcCkNCiAJCQkJaWYgKHJkZXYtPnJh aWRfZGlzayA8IDAN
CkBAIC0zNzY0LDQgKzM3ODMsNiBAQA0KIEVYUE9SVF9TWU1CT0wobWRfd2Fr ZXVwX3RocmVhZCk7
DQogRVhQT1JUX1NZTUJPTChtZF9wcmludF9kZXZpY2VzKTsNCiBFWFBPUlRf U1lNQk9MKG1kX2No
ZWNrX3JlY292ZXJ5KTsNCitFWFBPUlRfU1lNQk9MKGtpY2tfcmRldl9mcm9t X2FycmF5KTsJLy8g
Zml4bWUNCitFWFBPUlRfU1lNQk9MKHN5c2N0bF9iYWRibG9ja190b2xlcmFu Y2UpOw0KIE1PRFVM
RV9MSUNFTlNFKCJHUEwiKTsNCi0tLSBsaW51eC9kcml2ZXJzL21kL3JhaWQ1 LmMub3JpZwkyMDA1
LTA4LTE0IDIxOjIyOjA4LjAwMDAwMDAwMCArMDIwMA0KKysrIGxpbnV4L2Ry aXZlcnMvbWQvcmFp
ZDUuYwkyMDA1LTA4LTE0IDIwOjQ5OjQ5LjAwMDAwMDAwMCArMDIwMA0KQEAg LTQwLDYgKzQwLDE4
IEBADQogDQogI2RlZmluZSBzdHJpcGVfaGFzaChjb25mLCBzZWN0KQkoKGNv bmYpLT5zdHJpcGVf
aGFzaHRibFsoKHNlY3QpID4+IFNUUklQRV9TSElGVCkgJiBIQVNIX01BU0td KQ0KIA0KKyAvKg0K
KyAqIHBlci1kZXZpY2UgYmFkYmxvY2sgY2FjaGUNCisgKi8NCisNCisjZGVm aW5lCUJCX1NISUZU
CQkoUEFHRV9TSElGVC8qMTIqLyAtIDkpDQorI2RlZmluZQlCQl9IQVNIX1BB R0VTCQkxDQorI2Rl
ZmluZQlCQl9OUl9IQVNICQkoSEFTSF9QQUdFUyAqIFBBR0VfU0laRSAvIHNp emVvZihzdHJ1Y3Qg
YmFkYmxvY2sgKikpDQorI2RlZmluZQlCQl9IQVNIX01BU0sJCShCQl9OUl9I QVNIIC0gMSkNCisN
CisjZGVmaW5lCWJiX2hhc2goZGlzaywgc2VjdCkJKChkaXNrKS0+YmFkYmxv Y2tfaGFzaHRibFso
KHNlY3QpID4+IEJCX1NISUZUKSAmIEJCX0hBU0hfTUFTS10pDQorI2RlZmlu ZQliYl9oYXNobnIo
c2VjdCkJCSgoKHNlY3QpID4+IEJCX1NISUZUKSAmIEJCX0hBU0hfTUFTSykN CisNCiAvKiBiaW8n
cyBhdHRhY2hlZCB0byBhIHN0cmlwZStkZXZpY2UgZm9yIEkvTyBhcmUgbGlu a2VkIHRvZ2V0aGVy
IGluIGJpX3NlY3Rvcg0KICAqIG9yZGVyIHdpdGhvdXQgb3ZlcmxhcC4gIFRo ZXJlIG1heSBiZSBz
ZXZlcmFsIGJpbydzIHBlciBzdHJpcGUrZGV2aWNlLCBhbmQNCiAgKiBhIGJp byBjb3VsZCBzcGFu
IHNldmVyYWwgZGV2aWNlcy4NCkBAIC01Myw3ICs2NSw3IEBADQogLyoNCiAg KiBUaGUgZm9sbG93
aW5nIGNhbiBiZSB1c2VkIHRvIGRlYnVnIHRoZSBkcml2ZXINCiAgKi8NCi0j ZGVmaW5lIFJBSUQ1
X0RFQlVHCTANCisjZGVmaW5lIFJBSUQ1X0RFQlVHCTENCiAjZGVmaW5lIFJB SUQ1X1BBUkFOT0lB
CTENCiAjaWYgUkFJRDVfUEFSQU5PSUEgJiYgZGVmaW5lZChDT05GSUdfU01Q KQ0KICMgZGVmaW5l
IENIRUNLX0RFVkxPQ0soKSBhc3NlcnRfc3Bpbl9sb2NrZWQoJmNvbmYtPmRl dmljZV9sb2NrKQ0K
QEAgLTYxLDEzICs3MywxNTkgQEANCiAjIGRlZmluZSBDSEVDS19ERVZMT0NL KCkNCiAjZW5kaWYN
CiANCi0jZGVmaW5lIFBSSU5USyh4Li4uKSAoKHZvaWQpKFJBSUQ1X0RFQlVH ICYmIHByaW50ayh4
KSkpDQorI2RlZmluZSBQUklOVEsoeC4uLikgKCh2b2lkKShSQUlENV9ERUJV RyAmJiBwcmludGso
S0VSTl9ERUJVRyB4KSkpDQogI2lmIFJBSUQ1X0RFQlVHDQogI2RlZmluZSBp bmxpbmUNCiAjZGVm
aW5lIF9faW5saW5lX18NCiAjZW5kaWYNCiANCiBzdGF0aWMgdm9pZCBwcmlu dF9yYWlkNV9jb25m
IChyYWlkNV9jb25mX3QgKmNvbmYpOw0KK2V4dGVybiBpbnQgc3lzY3RsX2Jh ZGJsb2NrX3RvbGVy
YW5jZTsNCisNCisNCitzdGF0aWMgdm9pZCBiYl9pbnNlcnRfaGFzaChzdHJ1 Y3QgZGlza19pbmZv
ICpkaXNrLCBzdHJ1Y3QgYmFkYmxvY2sgKmJiKQ0KK3sNCisJc3RydWN0IGJh ZGJsb2NrICoqYmJw
ID0gJmJiX2hhc2goZGlzaywgYmItPnNlY3Rvcik7DQorDQorCS8qcHJpbnRr KCJiYl9pbnNlcnRf
aGFzaCgpLCBzZWN0b3IgJWxsdSBoYXNobnIgJWx1XG4iLCAodW5zaWduZWQg bG9uZyBsb25nKWJi
LT5zZWN0b3IsDQorCQliYl9oYXNobnIoYmItPnNlY3RvcikpOyovDQorDQor CWlmICgoYmItPmhh
c2hfbmV4dCA9ICpiYnApICE9IE5VTEwpDQorCQkoKmJicCktPmhhc2hfcHBy ZXYgPSAmYmItPmhh
c2hfbmV4dDsNCisJKmJicCA9IGJiOwkNCisJYmItPmhhc2hfcHByZXYgPSBi YnA7DQorfQ0KKw0K
K3N0YXRpYyB2b2lkIGJiX3JlbW92ZV9oYXNoKHN0cnVjdCBiYWRibG9jayAq YmIpDQorew0KKwkv
KnByaW50aygicmVtb3ZlX2hhc2goKSwgc2VjdG9yICVsbHUgaGFzaG5yICVs dVxuIiwgKHVuc2ln
bmVkIGxvbmcgbG9uZyliYi0+c2VjdG9yLA0KKwkJYmJfaGFzaG5yKGJiLT5z ZWN0b3IpKTsqLw0K
Kw0KKwlpZiAoYmItPmhhc2hfcHByZXYpIHsNCisJCWlmIChiYi0+aGFzaF9u ZXh0KQ0KKwkJCWJi
LT5oYXNoX25leHQtPmhhc2hfcHByZXYgPSBiYi0+aGFzaF9wcHJldjsNCisJ CSpiYi0+aGFzaF9w
cHJldiA9IGJiLT5oYXNoX25leHQ7DQorCQliYi0+aGFzaF9wcHJldiA9IE5V TEw7DQorCX0NCit9
DQorDQorc3RhdGljIHN0cnVjdCBiYWRibG9jayAqX19maW5kX2JhZGJsb2Nr KHN0cnVjdCBkaXNr
X2luZm8gKmRpc2ssIHNlY3Rvcl90IHNlY3RvcikNCit7DQorCXN0cnVjdCBi YWRibG9jayAqYmI7
DQorDQorCWZvciAoYmIgPSBiYl9oYXNoKGRpc2ssIHNlY3Rvcik7IGJiOyBi YiA9IGJiLT5oYXNo
X25leHQpDQorCQlpZiAoYmItPnNlY3RvciA9PSBzZWN0b3IpDQorCQkJcmV0 dXJuIGJiOw0KKwly
ZXR1cm4gTlVMTDsNCit9DQorDQorc3RhdGljIHN0cnVjdCBiYWRibG9jayAq ZmluZF9iYWRibG9j
ayhzdHJ1Y3QgZGlza19pbmZvICpkaXNrLCBzZWN0b3JfdCBzZWN0b3IpDQor ew0KKwlyYWlkNV9j
b25mX3QgKmNvbmYgPSAocmFpZDVfY29uZl90ICopIGRpc2stPnJkZXYtPm1k ZGV2LT5wcml2YXRl
Ow0KKwlzdHJ1Y3QgYmFkYmxvY2sgKmJiOw0KKw0KKwlzcGluX2xvY2tfaXJx KCZjb25mLT5kZXZp
Y2VfbG9jayk7DQorCWJiID0gX19maW5kX2JhZGJsb2NrKGRpc2ssIHNlY3Rv cik7DQorCXNwaW5f
dW5sb2NrX2lycSgmY29uZi0+ZGV2aWNlX2xvY2spOw0KKwlyZXR1cm4gYmI7 DQorfQ0KKw0KK3N0
YXRpYyB1bnNpZ25lZCBsb25nIGNvdW50X2JhZGJsb2NrcyAoc3RydWN0IGRp c2tfaW5mbyAqZGlz
aykNCit7DQorCXJhaWQ1X2NvbmZfdCAqY29uZiA9IChyYWlkNV9jb25mX3Qg KikgZGlzay0+cmRl
di0+bWRkZXYtPnByaXZhdGU7DQorCXN0cnVjdCBiYWRibG9jayAqYmI7DQor CWludCBqOw0KKwlp
bnQgbiA9IDA7DQorDQorCXNwaW5fbG9ja19pcnEoJmNvbmYtPmRldmljZV9s b2NrKTsNCisJZm9y
IChqID0gMDsgaiA8IEJCX05SX0hBU0g7IGorKykgew0KKwkJYmIgPSBkaXNr LT5iYWRibG9ja19o
YXNodGJsW2pdOw0KKwkJZm9yICg7IGJiOyBiYiA9IGJiLT5oYXNoX25leHQp DQorCQkJbisrOw0K
Kwl9DQorCXNwaW5fdW5sb2NrX2lycSgmY29uZi0+ZGV2aWNlX2xvY2spOw0K Kw0KKwlyZXR1cm4g
bjsNCit9DQorDQorc3RhdGljIGludCBncm93X2JhZGJsb2NrcyhzdHJ1Y3Qg ZGlza19pbmZvICpk
aXNrKQ0KK3sNCisJY2hhciBiW0JERVZOQU1FX1NJWkVdOw0KKwlrbWVtX2Nh Y2hlX3QgKnNjOw0K
Kw0KKwkvKiBoYXNoIHRhYmxlICovDQorCWlmICgoZGlzay0+YmFkYmxvY2tf aGFzaHRibCA9IChz
dHJ1Y3QgYmFkYmxvY2sgKiopIF9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0FUT01J QywgSEFTSF9QQUdF
U19PUkRFUikpID09IE5VTEwpIHsNCisJICAgIHByaW50aygiZ3Jvd19iYWRi bG9ja3M6IF9fZ2V0
X2ZyZWVfcGFnZXMgZmFpbGVkXG4iKTsNCisJICAgIHJldHVybiAwOw0KKwl9 DQorCW1lbXNldChk
aXNrLT5iYWRibG9ja19oYXNodGJsLCAwLCBCQl9IQVNIX1BBR0VTICogUEFH RV9TSVpFKTsNCisN
CisJLyogYmFkYmxvY2tzIGRiICovDQorCXNwcmludGYoZGlzay0+Y2FjaGVf bmFtZSwgInJhaWQ1
LyVzXyVzX2JiYyIsIG1kbmFtZShkaXNrLT5yZGV2LT5tZGRldiksDQorCQkJ YmRldm5hbWUoZGlz
ay0+cmRldi0+YmRldiwgYikpOw0KKwlzYyA9IGttZW1fY2FjaGVfY3JlYXRl KGRpc2stPmNhY2hl
X25hbWUsDQorCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgYmFkYmxvY2spLA0K KwkJCSAgICAgICAw
LCAwLCBOVUxMLCBOVUxMKTsNCisJaWYgKCFzYykgew0KKwkJcHJpbnRrKCJn cm93X2JhZGJsb2Nr
czoga21lbV9jYWNoZV9jcmVhdGUgZmFpbGVkXG4iKTsNCisJCXJldHVybiAx Ow0KKwl9DQorCWRp
c2stPnNsYWJfY2FjaGUgPSBzYzsNCisNCisJcmV0dXJuIDA7DQorfQ0KKw0K K3N0YXRpYyB2b2lk
IHNocmlua19iYWRibG9ja3Moc3RydWN0IGRpc2tfaW5mbyAqZGlzaykNCit7 DQorCXN0cnVjdCBi
YWRibG9jayAqYmI7DQorCWludCBqOw0KKw0KKwkvKiBiYWRibG9ja3MgZGIg Ki8NCisJZm9yIChq
ID0gMDsgaiA8IEJCX05SX0hBU0g7IGorKykgew0KKwkJYmIgPSBkaXNrLT5i YWRibG9ja19oYXNo
dGJsW2pdOw0KKwkJZm9yICg7IGJiOyBiYiA9IGJiLT5oYXNoX25leHQpDQor CQkgICAgICAgIGtt
ZW1fY2FjaGVfZnJlZShkaXNrLT5zbGFiX2NhY2hlLCBiYik7DQorCX0NCisJ a21lbV9jYWNoZV9k
ZXN0cm95KGRpc2stPnNsYWJfY2FjaGUpOw0KKwlkaXNrLT5zbGFiX2NhY2hl ID0gTlVMTDsNCisN
CisJLyogaGFzaCB0YWJsZSAqLw0KKwlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBs b25nKSBkaXNrLT5i
YWRibG9ja19oYXNodGJsLCBIQVNIX1BBR0VTX09SREVSKTsNCit9DQorDQor c3RhdGljIHZvaWQg
c3RvcmVfYmFkYmxvY2soc3RydWN0IGRpc2tfaW5mbyAqZGlzaywgc2VjdG9y X3Qgc2VjdG9yKQ0K
K3sNCisJc3RydWN0IGJhZGJsb2NrICpiYjsNCisJcmFpZDVfY29uZl90ICpj b25mID0gKHJhaWQ1
X2NvbmZfdCAqKSBkaXNrLT5yZGV2LT5tZGRldi0+cHJpdmF0ZTsNCisNCisJ YmIgPSBrbWVtX2Nh
Y2hlX2FsbG9jKGRpc2stPnNsYWJfY2FjaGUsIEdGUF9LRVJORUwpOw0KKwlp ZiAoIWJiKSB7DQor
CQlwcmludGsoInN0b3JlX2JhZGJsb2NrOiBrbWVtX2NhY2hlX2FsbG9jIGZh aWxlZFxuIik7DQor
CQlyZXR1cm47DQorCX0NCisJbWVtc2V0KGJiLCAwLCBzaXplb2YoKmJiKSk7 DQorCWJiLT5zZWN0
b3IgPSBzZWN0b3I7DQorDQorCXNwaW5fbG9ja19pcnEoJmNvbmYtPmRldmlj ZV9sb2NrKTsNCisJ
YmJfaW5zZXJ0X2hhc2goZGlzaywgYmIpOw0KKwlzcGluX3VubG9ja19pcnEo JmNvbmYtPmRldmlj
ZV9sb2NrKTsNCit9DQorDQorc3RhdGljIHZvaWQgZGVsZXRlX2JhZGJsb2Nr KHN0cnVjdCBkaXNr
X2luZm8gKmRpc2ssIHNlY3Rvcl90IHNlY3RvcikNCit7DQorCXN0cnVjdCBi YWRibG9jayAqYmI7
DQorCXJhaWQ1X2NvbmZfdCAqY29uZiA9IChyYWlkNV9jb25mX3QgKikgZGlz ay0+cmRldi0+bWRk
ZXYtPnByaXZhdGU7DQorDQorCWJiID0gZmluZF9iYWRibG9jayhkaXNrLCBz ZWN0b3IpOw0KKwlp
ZiAoIWJiKQ0KKwkJLyogcmVzZXQgb24gd3JpdGUnbGwgY2FsbCB1cyBsaWtl IGFuIGlkaW90IDp9
ICovDQorCQlyZXR1cm47DQorCXNwaW5fbG9ja19pcnEoJmNvbmYtPmRldmlj ZV9sb2NrKTsNCisJ
YmJfcmVtb3ZlX2hhc2goYmIpOw0KKwlrbWVtX2NhY2hlX2ZyZWUoZGlzay0+ c2xhYl9jYWNoZSwg
YmIpOw0KKwlzcGluX3VubG9ja19pcnEoJmNvbmYtPmRldmljZV9sb2NrKTsN Cit9DQorDQogDQog
c3RhdGljIGlubGluZSB2b2lkIF9fcmVsZWFzZV9zdHJpcGUocmFpZDVfY29u Zl90ICpjb25mLCBz
dHJ1Y3Qgc3RyaXBlX2hlYWQgKnNoKQ0KIHsNCkBAIC0yMDEsNyArMzU5LDcg QEANCiAJc2gtPnBk
X2lkeCA9IHBkX2lkeDsNCiAJc2gtPnN0YXRlID0gMDsNCiANCi0JZm9yIChp PWRpc2tzOyBpLS07
ICkgew0KKwlmb3IgKGk9ZGlza3MrMTsgaS0tOyApIHsNCiAJCXN0cnVjdCBy NWRldiAqZGV2ID0g
JnNoLT5kZXZbaV07DQogDQogCQlpZiAoZGV2LT50b3JlYWQgfHwgZGV2LT50 b3dyaXRlIHx8IGRl
di0+d3JpdHRlbiB8fA0KQEAgLTI5MSw4ICs0NDksMTAgQEANCiANCiAJc3By aW50Zihjb25mLT5j
YWNoZV9uYW1lLCAicmFpZDUvJXMiLCBtZG5hbWUoY29uZi0+bWRkZXYpKTsN CiANCisJLyogKzE6
IHdlIG5lZWQgZXh0cmEgc3BhY2UgaW4gdGhlICpzaC0+ZGV2cyBmb3IgdGhl ICdhY3RpdmUgc3Bh
cmUnIHRvIGtlZXANCisJICAgIGhhbmRsZV9zdHJpcGUoKSBzaW1wbGUgKi8N CiAJc2MgPSBrbWVt
X2NhY2hlX2NyZWF0ZShjb25mLT5jYWNoZV9uYW1lLCANCi0JCQkgICAgICAg c2l6ZW9mKHN0cnVj
dCBzdHJpcGVfaGVhZCkrKGRldnMtMSkqc2l6ZW9mKHN0cnVjdCByNWRldiks DQorCQkJICAgICAg
IHNpemVvZihzdHJ1Y3Qgc3RyaXBlX2hlYWQpKyhkZXZzLTErMSkqc2l6ZW9m KHN0cnVjdCByNWRl
diksDQogCQkJICAgICAgIDAsIDAsIE5VTEwsIE5VTEwpOw0KIAlpZiAoIXNj KQ0KIAkJcmV0dXJu
IDE7DQpAQCAtMzAxLDEyICs0NjEsMTIgQEANCiAJCXNoID0ga21lbV9jYWNo ZV9hbGxvYyhzYywg
R0ZQX0tFUk5FTCk7DQogCQlpZiAoIXNoKQ0KIAkJCXJldHVybiAxOw0KLQkJ bWVtc2V0KHNoLCAw
LCBzaXplb2YoKnNoKSArIChkZXZzLTEpKnNpemVvZihzdHJ1Y3QgcjVkZXYp KTsNCisJCW1lbXNl
dChzaCwgMCwgc2l6ZW9mKCpzaCkgKyAoZGV2cy0xKzEpKnNpemVvZihzdHJ1 Y3QgcjVkZXYpKTsN
CiAJCXNoLT5yYWlkX2NvbmYgPSBjb25mOw0KIAkJc3Bpbl9sb2NrX2luaXQo JnNoLT5sb2NrKTsN
CiANCi0JCWlmIChncm93X2J1ZmZlcnMoc2gsIGNvbmYtPnJhaWRfZGlza3Mp KSB7DQotCQkJc2hy
aW5rX2J1ZmZlcnMoc2gsIGNvbmYtPnJhaWRfZGlza3MpOw0KKwkJaWYgKGdy b3dfYnVmZmVycyhz
aCwgY29uZi0+cmFpZF9kaXNrcysxKSkgew0KKwkJCXNocmlua19idWZmZXJz KHNoLCBjb25mLT5y
YWlkX2Rpc2tzKzEpOw0KIAkJCWttZW1fY2FjaGVfZnJlZShzYywgc2gpOw0K IAkJCXJldHVybiAx
Ow0KIAkJfQ0KQEAgLTM5MSwxMCArNTUxLDM5IEBADQogCQl9DQogI2Vsc2UN CiAJCXNldF9iaXQo
UjVfVVBUT0RBVEUsICZzaC0+ZGV2W2ldLmZsYWdzKTsNCisJCWNsZWFyX2Jp dChSNV9GQUlMRUQs
ICZzaC0+ZGV2W2ldLmZsYWdzKTsNCiAjZW5kaWYJCQ0KIAl9IGVsc2Ugew0K KwkgICAgY2hhciBi
W0JERVZOQU1FX1NJWkVdOw0KKw0KKwkgICAgLyoNCisJCXJ1bGUgMS4sOiB0 cnkgdG8ga2VlcCBh
bGwgZGlzayBpbl9zeW5jIGV2ZW4gaWYgd2UndmUgZ290IHJlYWQgZXJyb3Jz LA0KKwkJY2F1c2Ug
dGhlICdhY3RpdmUgc3BhcmUnIG1heSBjYW4gcmVidWlsZCBhIGNvbXBsZXRl IGNvbHVtbiBmcm9t
DQorCQlwYXJ0aWFsbHkgZmFpbGVkIGRyaXZlcw0KKwkgICAgKi8NCisJICAg IGlmIChjb25mLT5k
aXNrc1tpXS5yZGV2LT5pbl9zeW5jICYmIGNvbmYtPndvcmtpbmdfZGlza3Mg PCBjb25mLT5yYWlk
X2Rpc2tzKSB7DQorCQkvKiBiYWQgbmV3cywgYnV0IGtlZXAgaXQsIGNhdXNl IG1kX2Vycm9yKCkg
d291bGQgZG8gYSBjb21wbGV0ZQ0KKwkJICAgIGFycmF5IHNodXRkb3duLCBl dmVuIGlmIDk5Ljk5
JSBpcyB1c2VhYmxlICovDQorCQlwcmludGsoS0VSTl9BTEVSVA0KKwkJCSJy YWlkNV9lbmRfcmVh
ZF9yZXF1ZXN0OiBSZWFkIGZhaWx1cmUgJXMgb24gc2VjdG9yICVsbHUgKCVk KSBpbiBkZWdyYWRl
ZCBtb2RlXG4iDQorCQkJLGJkZXZuYW1lKGNvbmYtPmRpc2tzW2ldLnJkZXYt PmJkZXYsIGIpLA0K
KwkJCSh1bnNpZ25lZCBsb25nIGxvbmcpc2gtPnNlY3RvciwgYXRvbWljX3Jl YWQoJnNoLT5jb3Vu
dCkpOw0KKwkJaWYgKGNvbmYtPm1kZGV2LT5jdXJyX3Jlc3luYykNCisJCSAg ICAvKiByYWlkNV9h
ZGRfZGlzaygpIHdpbGwgbm8gYWNjZXB0IHRoZSBzcGFyZSBhZ2FpbiwNCisJ CQlhbmQgd2lsbCBu
b3QgbG9vcCBmb3JldmVyICovDQorCQkgICAgY29uZi0+bWRkZXYtPmRlZ3Jh ZGVkID0gMjsNCisJ
ICAgIH0gZWxzZSBpZiAoY29uZi0+ZGlza3NbaV0ucmRldi0+aW5fc3luYyAm JiBjb25mLT53b3Jr
aW5nX2Rpc2tzID49IGNvbmYtPnJhaWRfZGlza3MpIHsNCisJCS8qIHdpbGwg YmUgY29tcHV0ZWQg
Ki8NCisJCXByaW50ayhLRVJOX0FMRVJUDQorCQkJInJhaWQ1X2VuZF9yZWFk X3JlcXVlc3Q6IFJl
YWQgZmFpbHVyZSAlcyBvbiBzZWN0b3IgJWxsdSAoJWQpIGluIG9wdGltYWwg bW9kZVxuIg0KKwkJ
CSxiZGV2bmFtZShjb25mLT5kaXNrc1tpXS5yZGV2LT5iZGV2LCBiKSwNCisJ CQkodW5zaWduZWQg
bG9uZyBsb25nKXNoLT5zZWN0b3IsIGF0b21pY19yZWFkKCZzaC0+Y291bnQp KTsNCisJCS8qIGNv
bmYtPmRpc2tzW2ldLnJlcnIrKyAqLw0KKwkgICAgfSBlbHNlDQorCQkvKiBw cmFjdGljYWxseSBp
dCBuZXZlciBoYXBwZW5zICovDQogCQltZF9lcnJvcihjb25mLT5tZGRldiwg Y29uZi0+ZGlza3Nb
aV0ucmRldik7DQotCQljbGVhcl9iaXQoUjVfVVBUT0RBVEUsICZzaC0+ZGV2 W2ldLmZsYWdzKTsN
CisJICAgIGNsZWFyX2JpdChSNV9VUFRPREFURSwgJnNoLT5kZXZbaV0uZmxh Z3MpOw0KKwkgICAg
c2V0X2JpdChSNV9GQUlMRUQsICZzaC0+ZGV2W2ldLmZsYWdzKTsNCiAJfQ0K IAlyZGV2X2RlY19w
ZW5kaW5nKGNvbmYtPmRpc2tzW2ldLnJkZXYsIGNvbmYtPm1kZGV2KTsNCiAj aWYgMA0KQEAgLTQz
MCwxMCArNjE5LDExIEBADQogCVBSSU5USygiZW5kX3dyaXRlX3JlcXVlc3Qg JWxsdS8lZCwgY291
bnQgJWQsIHVwdG9kYXRlOiAlZC5cbiIsIA0KIAkJKHVuc2lnbmVkIGxvbmcg bG9uZylzaC0+c2Vj
dG9yLCBpLCBhdG9taWNfcmVhZCgmc2gtPmNvdW50KSwNCiAJCXVwdG9kYXRl KTsNCisJLyogc29y
cnkNCiAJaWYgKGkgPT0gZGlza3MpIHsNCiAJCUJVRygpOw0KIAkJcmV0dXJu IDA7DQotCX0NCisJ
fSovDQogDQogCXNwaW5fbG9ja19pcnFzYXZlKCZjb25mLT5kZXZpY2VfbG9j aywgZmxhZ3MpOw0K
IAlpZiAoIXVwdG9kYXRlKQ0KQEAgLTQ2NywzMyArNjU3LDE0NCBAQA0KIAlk ZXYtPnJlcS5iaV9w
cml2YXRlID0gc2g7DQogDQogCWRldi0+ZmxhZ3MgPSAwOw0KLQlpZiAoaSAh PSBzaC0+cGRfaWR4
KQ0KKwlpZiAoaSAhPSBzaC0+cGRfaWR4ICYmIGkgPCBzaC0+cmFpZF9jb25m LT5yYWlkX2Rpc2tz
KQkvKiBhY3RpdmUgc3BhcmU/ICovDQogCQlkZXYtPnNlY3RvciA9IGNvbXB1 dGVfYmxvY2tucihz
aCwgaSk7DQogfQ0KIA0KK3N0YXRpYyBpbnQgcmFpZDVfcmVtb3ZlX2Rpc2so bWRkZXZfdCAqbWRk
ZXYsIGludCBudW1iZXIpOw0KK3N0YXRpYyBpbnQgcmFpZDVfYWRkX2Rpc2so bWRkZXZfdCAqbWRk
ZXYsIG1ka19yZGV2X3QgKnJkZXYpOw0KKy8qc3RhdGljKi8gdm9pZCBraWNr X3JkZXZfZnJvbV9h
cnJheShtZGtfcmRldl90ICogcmRldik7DQorLy9zdGF0aWMgdm9pZCBtZF91 cGRhdGVfc2IobWRk
ZXZfdCAqIG1kZGV2KTsNCiBzdGF0aWMgdm9pZCBlcnJvcihtZGRldl90ICpt ZGRldiwgbWRrX3Jk
ZXZfdCAqcmRldikNCiB7DQogCWNoYXIgYltCREVWTkFNRV9TSVpFXTsNCisJ Y2hhciBiMltCREVW
TkFNRV9TSVpFXTsNCiAJcmFpZDVfY29uZl90ICpjb25mID0gKHJhaWQ1X2Nv bmZfdCAqKSBtZGRl
di0+cHJpdmF0ZTsNCiAJUFJJTlRLKCJyYWlkNTogZXJyb3IgY2FsbGVkXG4i KTsNCiANCiAJaWYg
KCFyZGV2LT5mYXVsdHkpIHsNCi0JCW1kZGV2LT5zYl9kaXJ0eSA9IDE7DQot CQlpZiAocmRldi0+
aW5fc3luYykgew0KLQkJCWNvbmYtPndvcmtpbmdfZGlza3MtLTsNCi0JCQlt ZGRldi0+ZGVncmFk
ZWQrKzsNCi0JCQljb25mLT5mYWlsZWRfZGlza3MrKzsNCi0JCQlyZGV2LT5p bl9zeW5jID0gMDsN
Ci0JCQkvKg0KLQkJCSAqIGlmIHJlY292ZXJ5IHdhcyBydW5uaW5nLCBtYWtl IHN1cmUgaXQgYWJv
cnRzLg0KLQkJCSAqLw0KLQkJCXNldF9iaXQoTURfUkVDT1ZFUllfRVJSLCAm bWRkZXYtPnJlY292
ZXJ5KTsNCi0JCX0NCi0JCXJkZXYtPmZhdWx0eSA9IDE7DQotCQlwcmludGsg KEtFUk5fQUxFUlQN
Ci0JCQkicmFpZDU6IERpc2sgZmFpbHVyZSBvbiAlcywgZGlzYWJsaW5nIGRl dmljZS4iDQotCQkJ
IiBPcGVyYXRpb24gY29udGludWluZyBvbiAlZCBkZXZpY2VzXG4iLA0KLQkJ CWJkZXZuYW1lKHJk
ZXYtPmJkZXYsYiksIGNvbmYtPndvcmtpbmdfZGlza3MpOw0KKwkJaW50IG1k ZGlza3MgPSAwOw0K
KwkJbWRrX3JkZXZfdCAqcmQ7DQorCQltZGtfcmRldl90ICpyZGV2cyA9IE5V TEw7DQorCQlzdHJ1
Y3QgbGlzdF9oZWFkICpydG1wOw0KKwkJaW50IGk7DQorDQorCQlJVEVSQVRF X1JERVYobWRkZXYs
cmQscnRtcCkNCisJCSAgICB7DQorCQkJcHJpbnRrKEtFUk5fSU5GTyAibWRk ZXYlZDogJXNcbiIs
IG1kZGlza3MsIGJkZXZuYW1lKHJkLT5iZGV2LGIpKTsNCisJCQltZGRpc2tz Kys7DQorCQkgICAg
fQ0KKwkJZm9yIChpID0gMDsgKHJkID0gY29uZi0+ZGlza3NbaV0ucmRldik7 IGkrKykgew0KKwkJ
CXByaW50ayhLRVJOX0lORk8gInI1ZGV2JWQ6ICVzXG4iLCBpLCBiZGV2bmFt ZShyZC0+YmRldixi
KSk7DQorCQl9DQorCQlJVEVSQVRFX1JERVYobWRkZXYscmQscnRtcCkNCisJ CSAgICB7DQorCQkJ
cmRldnMgPSByZDsNCisJCQlicmVhazsNCisJCSAgICB9DQorcHJpbnRrKCIl ZCAlZCA+ICVkICVk
IGluczolZCAlcFxuIiwNCisJbWRkZXYtPnJhaWRfZGlza3MsIG1kZGlza3Ms IGNvbmYtPnJhaWRf
ZGlza3MsIG1kZGV2LT5kZWdyYWRlZCwgcmRldi0+aW5fc3luYywgcmRldnMp Ow0KKwkJaWYgKGNv
bmYtPmRpc2tzW2NvbmYtPnJhaWRfZGlza3NdLnJkZXYgPT0gcmRldiAmJiBy ZGV2LT5pbl9zeW5j
KSB7DQorCQkgICAgLyogaW5fc3luYywgYnV0IG11c3QgYmUgaGFuZGxlZCBz cGVjaWFsbHksIGRv
bid0IGxldCAnZGVncmFkZWQrKycgKi8NCisJCSAgICBwcmludGsgKCJhY3Rp dmUgc3BhcmUgZmFp
bGVkICVzIChpbl9zeW5jKVxuIiwNCisJCQkJYmRldm5hbWUocmRldi0+YmRl dixiKSk7DQorCQkg
ICAgbWRkZXYtPnNiX2RpcnR5ID0gMTsNCisJCSAgICByZGV2LT5pbl9zeW5j ID0gMDsNCisJCSAg
ICByZGV2LT5mYXVsdHkgPSAxOw0KKwkJICAgIHJkZXYtPnJhaWRfZGlzayA9 IGNvbmYtPnJhaWRf
ZGlza3M7CQkvKiBtZSBhcyBteXNlbGYsIGFnYWluIDspICovDQorCQkgICAg Y29uZi0+bWlycm9y
aXQgPSAtMTsNCisJCX0gZWxzZSBpZiAobWRkaXNrcyA+IGNvbmYtPnJhaWRf ZGlza3MgJiYgIW1k
ZGV2LT5kZWdyYWRlZCAmJiByZGV2LT5pbl9zeW5jKSB7DQorCQkgICAgLyog aGF2ZSBhY3RpdmUg
c3BhcmUsIGFycmF5IGlzIG9wdGltYWwsIHJlbW92ZWQgZGlzayBtZW1iZXIN CisJCQkgICAgb2Yg
aXQgKGJ1dCBub3QgdGhlIGFjdGl2ZSBzcGFyZSkgKi8NCisJCSAgICBpZiAo cmRldi0+cmFpZF9k
aXNrID09IGNvbmYtPm1pcnJvcml0ICYmIGNvbmYtPmRpc2tzW2NvbmYtPnJh aWRfZGlza3NdLnJk
ZXYpIHsNCisJCQlpZiAoIWNvbmYtPmRpc2tzW2NvbmYtPnJhaWRfZGlza3Nd LnJkZXYtPmluX3N5
bmMpIHsNCisJCQkgICAgcHJpbnRrKEtFUk5fQUxFUlQgImRpc2sgJXMgZmFp bGVkIGFuZCBhY3Rp
dmUgc3BhcmUgaXNuJ3QgaW5fc3luYyB5ZXQsIHJlYWRkIGFzIG5vcm1hbCBz cGFyZVxuIiwNCisJ
CQkJCWJkZXZuYW1lKHJkZXYtPmJkZXYsYikpOw0KKwkJCSAgICAvKiBtYXli ZSBzaG91bGRuJ3Qg
c3RvcCBoZXJlLCBidXQgd2UgY2FuJ3QgY2FsbCB0aGlzIGRpc2sgYXMNCisJ CQkJJ2FjdGl2ZSBz
cGFyZScgYW55bW9yZSwgY2F1c2UgaXQncyBhIHNpbXBsZSByZWJ1aWxkIGZy b20NCisJCQkJYSBk
ZWdyYWRlZCBhcnJheSwgZmVhciBvZiBiYWQgYmxvY2tzISAqLw0KKwkJCSAg ICBjb25mLT5taXJy
b3JpdCA9IC0xOw0KKwkJCSAgICBnb3RvIGxldGl0Z287DQorCQkJfSBlbHNl IHsNCisJCQkgICAg
aW50IHJldDsNCisNCisJCQkgICAgLyogaG90IHJlcGxhY2UgdGhlIG1pcnJv cmVkIGRyaXZlIHdp
dGggdGhlICdhY3RpdmUgc3BhcmUnDQorCQkJCXRoaXMgaXMgcmVhbGx5ICJo b3QiLCBJIGNhbid0
IHNlZSBjbGVhcmx5IHRoZSB0aGluZ3MNCisJCQkJd2hhdCBJIGhhdmUgdG8g ZG8gaGVyZS4gOn0N
CisJCQkJcHJheS4gKi8NCisNCisJCQkgICAgcHJpbnRrKEtFUk5fQUxFUlQg InJlcGxhY2UgJXMg
d2l0aCBpbl9zeW5jIGFjdGl2ZSBzcGFyZSAlc1xuIiwNCisJCQkJICAgIGJk ZXZuYW1lKHJkZXYt
PmJkZXYsYiksDQorCQkJCSAgICBiZGV2bmFtZShyZGV2cy0+YmRldixiMikp Ow0KKwkJCSAgICBy
ZGV2LT5pbl9zeW5jID0gMDsNCisJCQkgICAgcmRldi0+ZmF1bHR5ID0gMTsN CisNCisJCQkgICAg
Y29uZi0+bWlycm9yaXQgPSAtMTsNCisNCisJCQkgICAgLyogbXkgR29kLCBh bSBJIHNhbmU/ICov
DQorCQkJICAgIHdoaWxlICgoaSA9IGF0b21pY19yZWFkKCZyZGV2LT5ucl9w ZW5kaW5nKSkpIHsN
CisJCQkJcHJpbnRrKCJ3YWl0aW5nIGZvciBkaXNrICVkIC4uICVkXG4iLA0K KwkJCQkJcmRldi0+
cmFpZF9kaXNrLCBpKTsNCisJCQkgICAgfQ0KKwkJCSAgICByZXQgPSByYWlk NV9yZW1vdmVfZGlz
ayhtZGRldiwgcmRldi0+cmFpZF9kaXNrKTsNCisJCQkgICAgaWYgKHJldCkg ew0KKwkJCQlwcmlu
dGsoS0VSTl9XQVJOSU5HICJyYWlkNV9yZW1vdmVfZGlzazE6IGJ1c3k/IVxu Iik7DQorCQkJCXJl
dHVybjsJLy8gc2hvdWxkIG5vdGhpbmcgdG8gZG8NCisJCQkgICAgfQ0KKw0K KwkJCSAgICByZCA9
IGNvbmYtPmRpc2tzW2NvbmYtPnJhaWRfZGlza3NdLnJkZXY7DQorCQkJICAg IHdoaWxlICgoaSA9
IGF0b21pY19yZWFkKCZyZC0+bnJfcGVuZGluZykpKSB7DQorCQkJCXByaW50 aygid2FpdGluZyBm
b3IgZGlzayAlZCAuLiAlZFxuIiwNCisJCQkJCWNvbmYtPnJhaWRfZGlza3Ms IGkpOw0KKwkJCSAg
ICB9DQorCQkJICAgIHJkLT5pbl9zeW5jID0gMDsNCisJCQkgICAgcmV0ID0g cmFpZDVfcmVtb3Zl
X2Rpc2sobWRkZXYsIGNvbmYtPnJhaWRfZGlza3MpOw0KKwkJCSAgICBpZiAo cmV0KSB7DQorCQkJ
CXByaW50ayhLRVJOX1dBUk5JTkcgInJhaWQ1X3JlbW92ZV9kaXNrMjogYnVz eT8hXG4iKTsNCisJ
CQkJcmV0dXJuOwkvLyAuLg0KKwkJCSAgICB9DQorDQorCQkJICAgIHJldCA9 IHJhaWQ1X2FkZF9k
aXNrKG1kZGV2LCByZCk7DQorCQkJICAgIGlmICghcmV0KSB7DQorCQkJCXBy aW50ayhLRVJOX1dB
Uk5JTkcgInJhaWQ1X2FkZF9kaXNrOiBubyBmcmVlIHNsb3Q/IVxuIik7DQor CQkJCXJldHVybjsJ
Ly8gLi4NCisJCQkgICAgfQ0KKwkJCSAgICByZC0+aW5fc3luYyA9IDE7DQor DQorCQkJICAgIC8q
IGJvcnJvd2VkIGZyb20gaG90X3JlbW92ZV9kaXNrKCkgKi8NCisJCQkgICAg a2lja19yZGV2X2Zy
b21fYXJyYXkocmRldik7DQorCQkJICAgIC8vbWRfdXBkYXRlX3NiKG1kZGV2 KTsNCisJCQl9DQor
CQkgICAgfSBlbHNlIHsNCisJCQkvKiBpbl9zeW5jIGRpc2sgZmFpbGVkICgh ZGVncmFkZWQpLCB0
cnlpbmcgdG8gbWFrZSBhIGNvcHkNCisJCQkgICAgdG8gYSBzcGFyZSB7YW5k IHdlIGNhbiBjYWxs
IGl0ICdhY3RpdmUgc3BhcmUnIGZyb20gbm93On0gKi8NCisJCQlwcmludGso S0VSTl9BTEVSVCAi
cmVzeW5jIGZyb20gJXMgdG8gc3BhcmUgJXMgKCVkKVxuIiwNCisJCQkJYmRl dm5hbWUocmRldi0+
YmRldixiKSwNCisJCQkgICAgICAgIGJkZXZuYW1lKHJkZXZzLT5iZGV2LGIy KSwNCisJCQkJY29u
Zi0+cmFpZF9kaXNrcyk7DQorCQkJY29uZi0+bWlycm9yaXQgPSByZGV2LT5y YWlkX2Rpc2s7DQor
DQorCQkJbWRkZXYtPmRlZ3JhZGVkKys7CS8qIGZvciBjYWxsIHJhaWQ1X2hv dF9hZGRfZGlzaygp
LCByZXNldCB0aGVyZSAqLw0KKwkJICAgIH0NCisJCX0gZWxzZSB7DQorbGV0 aXRnbzoNCisJCSAg
ICBtZGRldi0+c2JfZGlydHkgPSAxOw0KKwkJICAgIGlmIChyZGV2LT5pbl9z eW5jKSB7DQorCQkJ
ICAgIGNvbmYtPndvcmtpbmdfZGlza3MtLTsNCisJCQkgICAgbWRkZXYtPmRl Z3JhZGVkKys7DQor
CQkJICAgIGNvbmYtPmZhaWxlZF9kaXNrcysrOw0KKwkJCSAgICByZGV2LT5p bl9zeW5jID0gMDsN
CisJCQkgICAgLyoNCisJCQkgICAgICogaWYgcmVjb3Zlcnkgd2FzIHJ1bm5p bmcsIG1ha2Ugc3Vy
ZSBpdCBhYm9ydHMuDQorCQkJICAgICAqLw0KKwkJCSAgICBzZXRfYml0KE1E X1JFQ09WRVJZX0VS
UiwgJm1kZGV2LT5yZWNvdmVyeSk7DQorCQkgICAgfQ0KKwkJICAgIHJkZXYt PmZhdWx0eSA9IDE7
DQorCQkgICAgcHJpbnRrIChLRVJOX0FMRVJUDQorCQkJICAgICJyYWlkNTog RGlzayBmYWlsdXJl
IG9uICVzLCBkaXNhYmxpbmcgZGV2aWNlLiINCisJCQkgICAgIiBPcGVyYXRp b24gY29udGludWlu
ZyBvbiAlZCBkZXZpY2VzXG4iLA0KKwkJCSAgICBiZGV2bmFtZShyZGV2LT5i ZGV2LGIpLCBjb25m
LT53b3JraW5nX2Rpc2tzKTsNCisJCX0NCiAJfQ0KIH0JDQogDQpAQCAtODg4 LDYgKzExODksOCBA
QA0KIAlpbnQgbG9ja2VkPTAsIHVwdG9kYXRlPTAsIHRvX3JlYWQ9MCwgdG9f d3JpdGU9MCwgZmFp
bGVkPTAsIHdyaXR0ZW49MDsNCiAJaW50IG5vbl9vdmVyd3JpdGUgPSAwOw0K IAlpbnQgZmFpbGVk
X251bT0wOw0KKwlpbnQgYXNwYXJlPTAsIGFzcGFyZW51bT0tMTsNCisJc3Ry dWN0IGRpc2tfaW5m
byAqYXNwYXJlZGV2Ow0KIAlzdHJ1Y3QgcjVkZXYgKmRldjsNCiANCiAJUFJJ TlRLKCJoYW5kbGlu
ZyBzdHJpcGUgJWxsdSwgY250PSVkLCBwZF9pZHg9JWRcbiIsDQpAQCAtODk5 LDEwICsxMjAyLDE4
IEBADQogCWNsZWFyX2JpdChTVFJJUEVfREVMQVlFRCwgJnNoLT5zdGF0ZSk7 DQogDQogCXN5bmNp
bmcgPSB0ZXN0X2JpdChTVFJJUEVfU1lOQ0lORywgJnNoLT5zdGF0ZSk7DQor CWFzcGFyZWRldiA9
ICZjb25mLT5kaXNrc1tjb25mLT5yYWlkX2Rpc2tzXTsNCisJaWYgKCFjb25m LT5tZGRldi0+ZGVn
cmFkZWQgJiYgYXNwYXJlZGV2LT5yZGV2ICYmICFhc3BhcmVkZXYtPnJkZXYt PmZhdWx0eSAmJg0K
KwkJY29uZi0+bWlycm9yaXQgIT0gLTEpIHsNCisJICAgIGFzcGFyZSsrOw0K KwkgICAgYXNwYXJl
bnVtID0gc2gtPnJhaWRfY29uZi0+bWlycm9yaXQ7DQorCSAgICBQUklOVEso ImhhcyBhc3BhcmUg
KCVkKVxuIiwgYXNwYXJlbnVtKTsNCisJfQ0KIAkvKiBOb3cgdG8gbG9vayBh cm91bmQgYW5kIHNl
ZSB3aGF0IGNhbiBiZSBkb25lICovDQogDQotCWZvciAoaT1kaXNrczsgaS0t OyApIHsNCisJZm9y
IChpPWRpc2tzK2FzcGFyZTsgaS0tOyApIHsNCiAJCW1ka19yZGV2X3QgKnJk ZXY7DQorCQlzdHJ1
Y3QgYmFkYmxvY2sgKmJiID0gTlVMTDsNCiAJCWRldiA9ICZzaC0+ZGV2W2ld Ow0KIAkJY2xlYXJf
Yml0KFI1X0luc3luYywgJmRldi0+ZmxhZ3MpOw0KIAkJY2xlYXJfYml0KFI1 X1N5bmNpbywgJmRl
di0+ZmxhZ3MpOw0KQEAgLTk0NSwxMiArMTI1Niw0MyBAQA0KIAkJfQ0KIAkJ aWYgKGRldi0+d3Jp
dHRlbikgd3JpdHRlbisrOw0KIAkJcmRldiA9IGNvbmYtPmRpc2tzW2ldLnJk ZXY7IC8qIEZJWE1F
LCBzaG91bGQgSSBiZSBsb29raW5nIHJkZXYgKi8NCi0JCWlmICghcmRldiB8 fCAhcmRldi0+aW5f
c3luYykgew0KKwkJaWYgKHJkZXYgJiYgcmRldi0+aW5fc3luYyAmJg0KKwkJ ICAgICF0ZXN0X2Jp
dChSNV9VUFRPREFURSwgJmRldi0+ZmxhZ3MpICYmDQorCQkgICAgIXRlc3Rf Yml0KFI1X0xPQ0tF
RCwgJmRldi0+ZmxhZ3MpKSB7DQorCQkJLyogLi5wb3RlbnRpYWxseSBkZXNl cnZlZCB0byByZWFk
LCB3ZSBtdXN0IGNoZWNrIGl0DQorCQkJICAgIGNoZWNrbWUsIGl0IGNvdWxk IGJlIGEgYmlnIHBl
cmZvcm1hbmNlIHBlbmFsdHkgaWYgY2FsbGVkDQorCQkJCXdpdGhvdXQgYSBn b29kIHJlYXNvbiEg
aXQncyBzZWVtcyBvayBmb3Igbm93DQorCQkJKi8NCisJCQlQUklOVEsoImZp bmRfYmFkYmxvY2sg
JWQ6ICVsbHVcbiIsIGksIHNoLT5zZWN0b3IpOw0KKwkJCWJiID0gZmluZF9i YWRibG9jaygmY29u
Zi0+ZGlza3NbaV0sIHNoLT5zZWN0b3IpOw0KKwkJfQ0KKwkJaWYgKCFyZGV2 IHx8ICFyZGV2LT5p
bl9zeW5jDQorCQkgICAgfHwgKHRlc3RfYml0KFI1X0ZBSUxFRCwgJmRldi0+ ZmxhZ3MpICYmICF0
ZXN0X2JpdChSNV9VUFRPREFURSwgJmRldi0+ZmxhZ3MpKQ0KKwkJICAgIHx8 IGJiKSB7DQorCQkJ
aWYgKHJkZXYgJiYgcmRldi0+aW5fc3luYyAmJiB0ZXN0X2JpdChSNV9GQUlM RUQsICZkZXYtPmZs
YWdzKSAmJiAhYmIpIHsNCisJCQkJaWYgKC8qKCFhc3BhcmUgfHwgKGFzcGFy ZSAmJiBhc3BhcmVk
ZXYtPnJkZXYtPmluX3N5bmMpKSAmJg0KKwkJCQkgICAgaXQgd291bGQgYmUg Y2xlYXIsIGJ1dCB0
b28gZWFybHksIHRoZSB0aHJlYWQgaGFzbid0IHdva2VuLCB5ZXQgKi8NCisJ CQkJICAgIGNvbmYt
Pm1pcnJvcml0ID09IC0xICYmDQorCQkJCSAgICBjb3VudF9iYWRibG9ja3Mo JmNvbmYtPmRpc2tz
W2ldKSA+PSBzeXNjdGxfYmFkYmxvY2tfdG9sZXJhbmNlKSB7DQorCQkJCQlj aGFyIGJbQkRFVk5B
TUVfU0laRV07DQorDQorCQkJCQlwcmludGsoS0VSTl9BTEVSVCAidG9vIG1h bnkgYmFkYmxvY2tz
ICglbHUpIG9uIGRldmljZSAlcywgbWFya2luZyBhcyBmYWlsZWRcbiIsDQor CQkJCQkJICAgIGNv
dW50X2JhZGJsb2NrcygmY29uZi0+ZGlza3NbaV0pICsgMSwgYmRldm5hbWUo Y29uZi0+ZGlza3Nb
aV0ucmRldi0+YmRldiwgYikpOw0KKwkJCQkJbWRfZXJyb3IoY29uZi0+bWRk ZXYsIGNvbmYtPmRp
c2tzW2ldLnJkZXYpOw0KKwkJCQl9DQorCQkJCVBSSU5USygic3RvcmVfYmFk YmxvY2sgJWQ6ICVs
bHVcbiIsIGksIHNoLT5zZWN0b3IpOw0KKwkJCQlzdG9yZV9iYWRibG9jaygm Y29uZi0+ZGlza3Nb
aV0sIHNoLT5zZWN0b3IpOw0KKwkJCX0NCiAJCQlmYWlsZWQrKzsNCiAJCQlm YWlsZWRfbnVtID0g
aTsNCi0JCX0gZWxzZQ0KKwkJCVBSSU5USygiZGV2aWNlICVkIGZhaWxlZCBm b3IgdGhpcyBzdHJp
cGUgciVwIHclcFxuIiwgaSwgZGV2LT50b3JlYWQsIGRldi0+dG93cml0ZSk7 DQorCQl9IGVsc2Ug
ew0KIAkJCXNldF9iaXQoUjVfSW5zeW5jLCAmZGV2LT5mbGFncyk7DQorCQl9 DQogCX0NCisJaWYg
KGFzcGFyZSAmJiBmYWlsZWQgPiAxKQ0KKwkgICAgZmFpbGVkLS07CS8qIGZh aWxlZCA9IDEgbWVh
bnMgImFsbCBvayIgaWYgd2UndmUgYXNwYXJlLCB0aGlzIGlzIHNpbXBsZXN0 DQorCQkJICAgIG1l
dGhvZCB0byBkbyBvdXIgd29yayAqLw0KIAlQUklOVEsoImxvY2tlZD0lZCB1 cHRvZGF0ZT0lZCB0
b19yZWFkPSVkIg0KIAkJIiB0b193cml0ZT0lZCBmYWlsZWQ9JWQgZmFpbGVk X251bT0lZFxuIiwN
CiAJCWxvY2tlZCwgdXB0b2RhdGUsIHRvX3JlYWQsIHRvX3dyaXRlLCBmYWls ZWQsIGZhaWxlZF9u
dW0pOw0KQEAgLTEwMTMsNiArMTM1NSw3IEBADQogCQlzcGluX3VubG9ja19p cnEoJmNvbmYtPmRl
dmljZV9sb2NrKTsNCiAJfQ0KIAlpZiAoZmFpbGVkID4gMSAmJiBzeW5jaW5n KSB7DQorCQlwcmlu
dGsoS0VSTl9BTEVSVCAic3luYyBzdG9wcGVkIGJ5IElPIGVycm9yXG4iKTsN CiAJCW1kX2RvbmVf
c3luYyhjb25mLT5tZGRldiwgU1RSSVBFX1NFQ1RPUlMsMCk7DQogCQljbGVh cl9iaXQoU1RSSVBF
X1NZTkNJTkcsICZzaC0+c3RhdGUpOw0KIAkJc3luY2luZyA9IDA7DQpAQCAt MTE4NCw2ICsxNTI3
LDI2IEBADQogCQkJCQlQUklOVEsoIldyaXRpbmcgYmxvY2sgJWRcbiIsIGkp Ow0KIAkJCQkJbG9j
a2VkKys7DQogCQkJCQlzZXRfYml0KFI1X1dhbnR3cml0ZSwgJnNoLT5kZXZb aV0uZmxhZ3MpOw0K
KwkJCQkJaWYgKGFzcGFyZSAmJiBpID09IGFzcGFyZW51bSkgew0KKwkJCQkJ ICAgIGNoYXIgKnBz
LCAqcGQ7DQorDQorCQkJCQkgICAgLyogbWlycm9yaW5nIHRoaXMgbmV3IGJs b2NrICovDQorCQkJ
CQkgICAgUFJJTlRLKCJXcml0aW5nIHRvIGFzcGFyZSB0b28gJWQtPiVkXG4i LA0KKwkJCQkJCQlp
LCBjb25mLT5yYWlkX2Rpc2tzKTsNCisJCQkJCSAgICAvKmlmICh0ZXN0X2Jp dChSNV9MT0NLRUQs
ICZzaC0+ZGV2W2NvbmYtPnJhaWRfZGlza3NdLmZsYWdzKSkgew0KKwkJCQkJ CXByaW50aygiYmF6
bWVnLCBleiBsb2trb2x0MSEhIVxuIik7DQorCQkJCQkgICAgfSovDQorCQkJ CQkgICAgcHMgPSBw
YWdlX2FkZHJlc3Moc2gtPmRldltpXS5wYWdlKTsNCisJCQkJCSAgICBwZCA9 IHBhZ2VfYWRkcmVz
cyhzaC0+ZGV2W2NvbmYtPnJhaWRfZGlza3NdLnBhZ2UpOw0KKwkJCQkJICAg IC8qIGJldHRlciBp
ZGVhPyAqLw0KKwkJCQkJICAgIG1lbWNweShwZCwgcHMsIFNUUklQRV9TSVpF KTsNCisJCQkJCSAg
ICBzZXRfYml0KFI1X0xPQ0tFRCwgJnNoLT5kZXZbY29uZi0+cmFpZF9kaXNr c10uZmxhZ3MpOw0K
KwkJCQkJICAgIHNldF9iaXQoUjVfV2FudHdyaXRlLCAmc2gtPmRldltjb25m LT5yYWlkX2Rpc2tz
XS5mbGFncyk7DQorCQkJCQl9DQorCQkJCQlpZiAoY29uZi0+ZGlza3NbaV0u cmRldiAmJiBjb25m
LT5kaXNrc1tpXS5yZGV2LT5pbl9zeW5jKSB7DQorCQkJCQkgICAgUFJJTlRL KCJyZXNldCBiYWRi
bG9jayBvbiAlZDogJWxsdVxuIiwgaSwgc2gtPnNlY3Rvcik7DQorCQkJCQkg ICAgZGVsZXRlX2Jh
ZGJsb2NrKCZjb25mLT5kaXNrc1tpXSwgc2gtPnNlY3Rvcik7DQorCQkJCQl9 DQogCQkJCQlpZiAo
IXRlc3RfYml0KFI1X0luc3luYywgJnNoLT5kZXZbaV0uZmxhZ3MpDQogCQkJ CQkgICAgfHwgKGk9
PXNoLT5wZF9pZHggJiYgZmFpbGVkID09IDApKQ0KIAkJCQkJCXNldF9iaXQo U1RSSVBFX0lOU1lO
QywgJnNoLT5zdGF0ZSk7DQpAQCAtMTIyMCwyMCArMTU4MywzOSBAQA0KIAkJ CWlmIChmYWlsZWQ9
PTApDQogCQkJCWZhaWxlZF9udW0gPSBzaC0+cGRfaWR4Ow0KIAkJCS8qIHNo b3VsZCBiZSBhYmxl
IHRvIGNvbXB1dGUgdGhlIG1pc3NpbmcgYmxvY2sgYW5kIHdyaXRlIGl0IHRv IHNwYXJlICovDQor
CQkJaWYgKGFzcGFyZSkNCisJCQkgICAgZmFpbGVkX251bSA9IGFzcGFyZW51 bTsNCiAJCQlpZiAo
IXRlc3RfYml0KFI1X1VQVE9EQVRFLCAmc2gtPmRldltmYWlsZWRfbnVtXS5m bGFncykpIHsNCiAJ
CQkJaWYgKHVwdG9kYXRlKzEgIT0gZGlza3MpDQogCQkJCQlCVUcoKTsNCiAJ CQkJY29tcHV0ZV9i
bG9jayhzaCwgZmFpbGVkX251bSk7DQogCQkJCXVwdG9kYXRlKys7DQogCQkJ fQ0KKwkJCWlmIChh
c3BhcmUpIHsNCisJCQkgICAgY2hhciAqcHMsICpwZDsNCisNCisJCQkgICAg cHMgPSBwYWdlX2Fk
ZHJlc3Moc2gtPmRldltmYWlsZWRfbnVtXS5wYWdlKTsNCisJCQkgICAgcGQg PSBwYWdlX2FkZHJl
c3Moc2gtPmRldltjb25mLT5yYWlkX2Rpc2tzXS5wYWdlKTsNCisJCQkgICAg bWVtY3B5KHBkLCBw
cywgU1RSSVBFX1NJWkUpOw0KKwkJCSAgICBQUklOVEsoIlI1X1dhbnR3cml0 ZSB0byBhc3BhcmUs
IHVwdG9kYXRlOiAlZCAlcC0+JXBcbiIsDQorCQkJCQl1cHRvZGF0ZSwgcHMs IHBkKTsNCisJCQkg
ICAgLyppZiAodGVzdF9iaXQoUjVfTE9DS0VELCAmc2gtPmRldltjb25mLT5y YWlkX2Rpc2tzXS5m
bGFncykpIHsNCisJCQkJcHJpbnRrKCJiYXptZWcsIGV6IGxva2tvbHQyISEh XG4iKTsNCisJCQkg
ICAgfSovDQorCQkJfQ0KIAkJCWlmICh1cHRvZGF0ZSAhPSBkaXNrcykNCiAJ CQkJQlVHKCk7DQor
CQkJaWYgKGFzcGFyZSkNCisJCQkgICAgZmFpbGVkX251bSA9IGNvbmYtPnJh aWRfZGlza3M7DQog
CQkJZGV2ID0gJnNoLT5kZXZbZmFpbGVkX251bV07DQogCQkJc2V0X2JpdChS NV9MT0NLRUQsICZk
ZXYtPmZsYWdzKTsNCiAJCQlzZXRfYml0KFI1X1dhbnR3cml0ZSwgJmRldi0+ ZmxhZ3MpOw0KIAkJ
CWxvY2tlZCsrOw0KIAkJCXNldF9iaXQoU1RSSVBFX0lOU1lOQywgJnNoLT5z dGF0ZSk7DQogCQkJ
c2V0X2JpdChSNV9TeW5jaW8sICZkZXYtPmZsYWdzKTsNCisJCQkvKiAhaW5f c3luYy4uDQorCQkJ
cHJpbnRrKCJyZXNldCBiYWRibG9jayBvbiAlZDogJWxsdVxuIiwgZmFpbGVk X251bSwgc2gtPnNl
Y3Rvcik7DQorCQkJZGVsZXRlX2JhZGJsb2NrKCZjb25mLT5kaXNrc1tmYWls ZWRfbnVtXSwgc2gt
PnNlY3Rvcik7Ki8NCiAJCX0NCiAJfQ0KIAlpZiAoc3luY2luZyAmJiBsb2Nr ZWQgPT0gMCAmJiB0
ZXN0X2JpdChTVFJJUEVfSU5TWU5DLCAmc2gtPnN0YXRlKSkgew0KQEAgLTEy NTEsNyArMTYzMyw3
IEBADQogCQliaS0+Ymlfc2l6ZSA9IDA7DQogCQliaS0+YmlfZW5kX2lvKGJp LCBieXRlcywgMCk7
DQogCX0NCi0JZm9yIChpPWRpc2tzOyBpLS0gOykgew0KKwlmb3IgKGk9ZGlz a3MrYXNwYXJlOyBp
LS0gOykgew0KIAkJaW50IHJ3Ow0KIAkJc3RydWN0IGJpbyAqYmk7DQogCQlt ZGtfcmRldl90ICpy
ZGV2Ow0KQEAgLTE0OTMsNiArMTg3NSwxNSBAQA0KIAkJdW5wbHVnX3NsYXZl cyhtZGRldik7DQog
CQlyZXR1cm4gMDsNCiAJfQ0KKwkvKiBpZiB0aGVyZSBpcyAxIG9yIG1vcmUg ZmFpbGVkIGRyaXZl
cyBhbmQgd2UgYXJlIHRyeWluZw0KKwkgKiB0byByZXN5bmMsIHRoZW4gYXNz ZXJ0IHRoYXQgd2Ug
YXJlIGZpbmlzaGVkLCBiZWNhdXNlIHRoZXJlIGlzDQorCSAqIG5vdGhpbmcg d2UgY2FuIGRvLg0K
KwkgKi8NCisJaWYgKG1kZGV2LT5kZWdyYWRlZCA+PSAxICYmIHRlc3RfYml0 KE1EX1JFQ09WRVJZ
X1NZTkMsICZtZGRldi0+cmVjb3ZlcnkpKSB7DQorCQlpbnQgcnYgPSAobWRk ZXYtPnNpemUgPDwg
MSkgLSBzZWN0b3JfbnI7DQorCQltZF9kb25lX3N5bmMobWRkZXYsIHJ2LCAx KTsNCisJCXJldHVy
biBydjsNCisJfQ0KIA0KIAl4ID0gc2VjdG9yX25yOw0KIAljaHVua19vZmZz ZXQgPSBzZWN0b3Jf
ZGl2KHgsIHNlY3RvcnNfcGVyX2NodW5rKTsNCkBAIC0xNTkxLDExICsxOTgy LDExIEBADQogCX0N
CiANCiAJbWRkZXYtPnByaXZhdGUgPSBrbWFsbG9jIChzaXplb2YgKHJhaWQ1 X2NvbmZfdCkNCi0J
CQkJICArIG1kZGV2LT5yYWlkX2Rpc2tzICogc2l6ZW9mKHN0cnVjdCBkaXNr X2luZm8pLA0KKwkJ
CQkgICsgKG1kZGV2LT5yYWlkX2Rpc2tzICsgMSkgKiBzaXplb2Yoc3RydWN0 IGRpc2tfaW5mbyks
DQogCQkJCSAgR0ZQX0tFUk5FTCk7DQogCWlmICgoY29uZiA9IG1kZGV2LT5w cml2YXRlKSA9PSBO
VUxMKQ0KIAkJZ290byBhYm9ydDsNCi0JbWVtc2V0IChjb25mLCAwLCBzaXpl b2YgKCpjb25mKSAr
IG1kZGV2LT5yYWlkX2Rpc2tzICogc2l6ZW9mKHN0cnVjdCBkaXNrX2luZm8p ICk7DQorCW1lbXNl
dCAoY29uZiwgMCwgc2l6ZW9mICgqY29uZikgKyAobWRkZXYtPnJhaWRfZGlz a3MgKyAxKSAqIHNp
emVvZihzdHJ1Y3QgZGlza19pbmZvKSApOw0KIAljb25mLT5tZGRldiA9IG1k ZGV2Ow0KIA0KIAlp
ZiAoKGNvbmYtPnN0cmlwZV9oYXNodGJsID0gKHN0cnVjdCBzdHJpcGVfaGVh ZCAqKikgX19nZXRf
ZnJlZV9wYWdlcyhHRlBfQVRPTUlDLCBIQVNIX1BBR0VTX09SREVSKSkgPT0g TlVMTCkNCkBAIC0x
NjI1LDYgKzIwMTYsOCBAQA0KIA0KIAkJZGlzay0+cmRldiA9IHJkZXY7DQog DQorCQlncm93X2Jh
ZGJsb2NrcyhkaXNrKTsNCisNCiAJCWlmIChyZGV2LT5pbl9zeW5jKSB7DQog CQkJY2hhciBiW0JE
RVZOQU1FX1NJWkVdOw0KIAkJCXByaW50ayhLRVJOX0lORk8gInJhaWQ1OiBk ZXZpY2UgJXMgb3Bl
cmF0aW9uYWwgYXMgcmFpZCINCkBAIC0xNjM1LDYgKzIwMjgsNyBAQA0KIAl9 DQogDQogCWNvbmYt
PnJhaWRfZGlza3MgPSBtZGRldi0+cmFpZF9kaXNrczsNCisJY29uZi0+bWly cm9yaXQgPSAtMTsN
CiAJLyoNCiAJICogMCBmb3IgYSBmdWxseSBmdW5jdGlvbmFsIGFycmF5LCAx IGZvciBhIGRlZ3Jh
ZGVkIGFycmF5Lg0KIAkgKi8NCkBAIC0xNjg0LDcgKzIwNzgsNyBAQA0KIAkJ fQ0KIAl9DQogbWVt
b3J5ID0gY29uZi0+bWF4X25yX3N0cmlwZXMgKiAoc2l6ZW9mKHN0cnVjdCBz dHJpcGVfaGVhZCkg
Kw0KLQkJIGNvbmYtPnJhaWRfZGlza3MgKiAoKHNpemVvZihzdHJ1Y3QgYmlv KSArIFBBR0VfU0la
RSkpKSAvIDEwMjQ7DQorCQkgKGNvbmYtPnJhaWRfZGlza3MrMSkgKiAoKHNp emVvZihzdHJ1Y3Qg
YmlvKSArIFBBR0VfU0laRSkpKSAvIDEwMjQ7DQogCWlmIChncm93X3N0cmlw ZXMoY29uZiwgY29u
Zi0+bWF4X25yX3N0cmlwZXMpKSB7DQogCQlwcmludGsoS0VSTl9FUlIgDQog CQkJInJhaWQ1OiBj
b3VsZG4ndCBhbGxvY2F0ZSAlZGtCIGZvciBidWZmZXJzXG4iLCBtZW1vcnkp Ow0KQEAgLTE3Mzks
MTAgKzIxMzMsMTQgQEANCiBzdGF0aWMgaW50IHN0b3AgKG1kZGV2X3QgKm1k ZGV2KQ0KIHsNCiAJ
cmFpZDVfY29uZl90ICpjb25mID0gKHJhaWQ1X2NvbmZfdCAqKSBtZGRldi0+ cHJpdmF0ZTsNCisJ
aW50IGk7DQogDQogCW1kX3VucmVnaXN0ZXJfdGhyZWFkKG1kZGV2LT50aHJl YWQpOw0KIAltZGRl
di0+dGhyZWFkID0gTlVMTDsNCiAJc2hyaW5rX3N0cmlwZXMoY29uZik7DQor CWZvciAoaSA9IGNv
bmYtPnJhaWRfZGlza3M7IGktLTsgKQ0KKwkJaWYgKGNvbmYtPmRpc2tzW2ld LnJkZXYgJiYgY29u
Zi0+ZGlza3NbaV0ucmRldi0+aW5fc3luYykNCisJCQlzaHJpbmtfYmFkYmxv Y2tzKCZjb25mLT5k
aXNrc1tpXSk7DQogCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpIGNvbmYt PnN0cmlwZV9oYXNo
dGJsLCBIQVNIX1BBR0VTX09SREVSKTsNCiAJYmxrX3N5bmNfcXVldWUobWRk ZXYtPnF1ZXVlKTsg
LyogdGhlIHVucGx1ZyBmbiByZWZlcmVuY2VzICdjb25mJyovDQogCWtmcmVl KGNvbmYpOw0KQEAg
LTE3ODgsNyArMjE4Niw5IEBADQogc3RhdGljIHZvaWQgc3RhdHVzIChzdHJ1 Y3Qgc2VxX2ZpbGUg
KnNlcSwgbWRkZXZfdCAqbWRkZXYpDQogew0KIAlyYWlkNV9jb25mX3QgKmNv bmYgPSAocmFpZDVf
Y29uZl90ICopIG1kZGV2LT5wcml2YXRlOw0KLQlpbnQgaTsNCisJaW50IGks IGo7DQorCWNoYXIg
YltCREVWTkFNRV9TSVpFXTsNCisJc3RydWN0IGJhZGJsb2NrICpiYjsNCiAN CiAJc2VxX3ByaW50
ZiAoc2VxLCAiIGxldmVsICVkLCAlZGsgY2h1bmssIGFsZ29yaXRobSAlZCIs IG1kZGV2LT5sZXZl
bCwgbWRkZXYtPmNodW5rX3NpemUgPj4gMTAsIG1kZGV2LT5sYXlvdXQpOw0K IAlzZXFfcHJpbnRm
IChzZXEsICIgWyVkLyVkXSBbIiwgY29uZi0+cmFpZF9kaXNrcywgY29uZi0+ d29ya2luZ19kaXNr
cyk7DQpAQCAtMTgwMSw2ICsyMjAxLDIwIEBADQogI2RlZmluZSBEKHgpIFwN CiAJc2VxX3ByaW50
ZiAoc2VxLCAiPCIjeCI6JWQ+IiwgYXRvbWljX3JlYWQoJmNvbmYtPngpKQ0K IAlwcmludGFsbChj
b25mKTsNCisNCisJc3Bpbl9sb2NrX2lycSgmY29uZi0+ZGV2aWNlX2xvY2sp OwkvKiBpdCdzIG9r
IG5vdyBmb3IgZGVidWcgKi8NCisJc2VxX3ByaW50ZiAoc2VxLCAiXG4gICAg ICBrbm93biBiYWQg
c2VjdG9ycyBvbiBhY3RpdmUgZGV2aWNlczoiKTsNCisJZm9yIChpID0gY29u Zi0+cmFpZF9kaXNr
czsgaS0tOyApIHsNCisJICAgIGlmIChjb25mLT5kaXNrc1tpXS5yZGV2KSB7 DQorCQlzZXFfcHJp
bnRmIChzZXEsICJcbiAgICAgICVzIiwgYmRldm5hbWUoY29uZi0+ZGlza3Nb aV0ucmRldi0+YmRl
diwgYikpOw0KKwkJZm9yIChqID0gMDsgaiA8IEJCX05SX0hBU0g7IGorKykg ew0KKwkJICAgIGJi
ID0gY29uZi0+ZGlza3NbaV0uYmFkYmxvY2tfaGFzaHRibFtqXTsNCisJCSAg ICBmb3IgKDsgYmI7
IGJiID0gYmItPmhhc2hfbmV4dCkNCisJCQlzZXFfcHJpbnRmIChzZXEsICIg JWxsdS0lbGx1Iiwg
YmItPnNlY3RvciwgYmItPnNlY3RvciArICh1bnNpZ25lZCBsb25nIGxvbmcp KFNUUklQRV9TSVpF
IC8gNTEyKSAtIDEpOw0KKwkJfQ0KKwkgICAgfQ0KKwl9DQorCXNwaW5fdW5s b2NrX2lycSgmY29u
Zi0+ZGV2aWNlX2xvY2spOw0KICNlbmRpZg0KIH0NCiANCkBAIC0xODQ0LDYg KzIyNTgsMTcgQEAN
CiAJCQl0bXAtPnJkZXYtPmluX3N5bmMgPSAxOw0KIAkJfQ0KIAl9DQorCXRt cCA9IGNvbmYtPmRp
c2tzICsgaTsNCisJaWYgKHRtcC0+cmRldiAmJiAhdG1wLT5yZGV2LT5mYXVs dHkgJiYgIXRtcC0+
cmRldi0+aW5fc3luYykgew0KKwkgICAgLyogc3luYyBkb25lIHRvIHRoZSAn YWN0aXZlIHNwYXJl
JyAqLw0KKwkgICAgdG1wLT5yZGV2LT5pbl9zeW5jID0gMTsNCisNCisJICAg IHByaW50ayhLRVJO
X05PVElDRSAicmFpZDVfc3BhcmVfYWN0aXZlOiAlZCBpbl9zeW5jICVkLT4l ZFxuIiwNCisJCQlp
LCB0bXAtPnJkZXYtPnJhaWRfZGlzaywgY29uZi0+bWlycm9yaXQpOw0KKw0K KwkgICAgLyogc2Nh
cnkuLj8gOn0gKi8NCisJICAgIHRtcC0+cmRldi0+cmFpZF9kaXNrID0gY29u Zi0+bWlycm9yaXQ7
DQorCX0NCiAJcHJpbnRfcmFpZDVfY29uZihjb25mKTsNCiAJcmV0dXJuIDA7 DQogfQ0KQEAgLTE4
NTcsNiArMjI4Miw3IEBADQogDQogCXByaW50X3JhaWQ1X2NvbmYoY29uZik7 DQogCXJkZXYgPSBw
LT5yZGV2Ow0KK3ByaW50aygicmFpZDVfcmVtb3ZlX2Rpc2sgJWRcbiIsIG51 bWJlcik7DQogCWlm
IChyZGV2KSB7DQogCQlpZiAocmRldi0+aW5fc3luYyB8fA0KIAkJICAgIGF0 b21pY19yZWFkKCZy
ZGV2LT5ucl9wZW5kaW5nKSkgew0KQEAgLTE4NzAsNiArMjI5Niw4IEBADQog CQkJZXJyID0gLUVC
VVNZOw0KIAkJCXAtPnJkZXYgPSByZGV2Ow0KIAkJfQ0KKwkJaWYgKCFlcnIp DQorCQkJc2hyaW5r
X2JhZGJsb2NrcyhwKTsNCiAJfQ0KIGFib3J0Og0KIA0KQEAgLTE4ODQsNiAr MjMxMiwxMCBAQA0K
IAlpbnQgZGlzazsNCiAJc3RydWN0IGRpc2tfaW5mbyAqcDsNCiANCisJaWYg KG1kZGV2LT5kZWdy
YWRlZCA+IDEpDQorCQkvKiBubyBwb2ludCBhZGRpbmcgYSBkZXZpY2UgKi8N CisJCXJldHVybiAw
Ow0KKw0KIAkvKg0KIAkgKiBmaW5kIHRoZSBkaXNrIC4uLg0KIAkgKi8NCkBA IC0xODk1LDYgKzIz
MjcsMjIgQEANCiAJCQlwLT5yZGV2ID0gcmRldjsNCiAJCQlicmVhazsNCiAJ CX0NCisNCisJaWYg
KCFmb3VuZCkgew0KKwkgICAgLyogYXJyYXkgb3B0aW1hbCwgdGhpcyBzaG91 bGQgYmUgdGhlICdh
Y3RpdmUgc3BhcmUnICovDQorCSAgICBjb25mLT5kaXNrc1tkaXNrXS5yZGV2 ID0gcmRldjsNCisJ
ICAgIHJkZXYtPmluX3N5bmMgPSAwOw0KKwkgICAgcmRldi0+cmFpZF9kaXNr ID0gY29uZi0+cmFp
ZF9kaXNrczsNCisNCisJICAgIG1kZGV2LT5kZWdyYWRlZC0tOw0KKwkgICAg Zm91bmQrKzsJLyog
Y2FsbCByZXN5bmMgKi8NCisNCisJICAgIHByaW50ayhLRVJOX0lORk8gImFk ZGVkIHNwYXJlIGZv
ciBhY3RpdmUgcmVzeW5jXG4iKTsNCisJfQ0KKwlpZiAoZm91bmQpDQorCQln cm93X2JhZGJsb2Nr
cygmY29uZi0+ZGlza3NbZGlza10pOw0KKwlwcmludGsoS0VSTl9JTkZPICJy YWlkNV9hZGRfZGlz
azogJWQgKCVkKVxuIiwgZGlzaywgZm91bmQpOw0KKw0KIAlwcmludF9yYWlk NV9jb25mKGNvbmYp
Ow0KIAlyZXR1cm4gZm91bmQ7DQogfQ0K


--=-qUfi0mPUCbSVjUIavgzS--
-
To unsubscribe from this list: send the line "unsubscribe linux-raid" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html

Re: [PATCH] proactive raid5 disk replacement for 2.6.11, updated

am 18.08.2005 03:55:53 von Tyler

I think some of these features are great :) When you get into 15+
device raids, this becomes a very active issue.

Tyler.

Pallai Roland wrote:

> per-device bad block cache has been implemented to speed up arrays with
>partially failed drives (replies are often slow from those). also
>helps to determine badly damaged drives based on number of bad blocks,
>and can take an action if steps over an user defined threshold
>(see /proc/sys/dev/raid/badblock_tolerance).
>rewrite of a bad stripe will delete the entry from the cache, so it
>honors the auto sector reallocation feature of ATA drives
>
> performance is affected just a little bit if there's no or some
>registered bad blocks, but over a million that could be a problem
>currently, I'll examine it later..
>
> if we've a spare and a drive had kicked, that spare becomes to 'active
>spare', sync begins, but the original (failed) drive won't be kicked
>until the sync will not have finished. if the original drive still drops
>errors after had been synced, the in_sync spare replaces that online
>otherwise you can do it manually (mdadm -f)
>
> you can check the list of registered bad sectors in /proc/mdstat (in
>debug mode), and the size of the cache with: grep _bbc /proc/slabinfo
>
>
> please let me know if you're interested in, otherwise I'll not flood
>the list with this topic..
>
>
>my /proc/mdstat now:
>
>md0 : active raid5 ram4[2] md2[1] md1[0]
> 8064 blocks level 5, 64k chunk, algorithm 2 [3/3] [UUU]
> known bad sectors on active devices:
> ram4
> md2
> md1 56 136 232 472 600 872 1176 1248 1336 1568 1688 1952 2104
>
>md2 : active faulty ram1[0]
> 4096 blocks nfaults=0
>
>md1 : active faulty ram0[0]
> 4096 blocks ReadPersistent=92(100) nfaults=13
>
>
>--
> dap
>
>
>
>
>----------------------------------------------------------- -------------
>
>
> 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: I noticed a bad block on a drive, replace it,
>and the resync fails cause another 2-3 disks has 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 to 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 don't 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 has 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]
>
>
>update:
>
> per-device bad block cache has been implemented to speed up arrays with
>partially failed drives (replies are often slow from those). also
>helps to determine badly damaged drives based on number of bad blocks,
>and can take an action if steps over an user defined threshold
>(see /proc/sys/dev/raid/badblock_tolerance).
>rewrite of a bad stripe will delete the entry from the cache, so it honors
>the auto sector reallocation feature of ATA drives
>
> performance is affected just a little bit if there's no or some registered
>bad blocks, but over a million that could be a problem currently, I'll examine
>it later..
>
> if we've a spare and a drive had kicked, that spare becomes to
>'active spare', sync begins, but the original (failed) drive won't be
>kicked until the sync will not have finished. if the original drive still
>drops errors after had been synced, the in_sync spare replaces that online
>
> you can check the list of registered bad sectors in /proc/mdstat (in debug mode),
>and the size of the cache with: grep _bbc /proc/slabinfo
>
>
>my /proc/mdstat:
>
>md0 : active raid5 ram4[2] md2[1] md1[0]
> 8064 blocks level 5, 64k chunk, algorithm 2 [3/3] [UUU]
> known bad sectors on active devices:
> ram4
> md2
> md1 56 136 232 472 600 872 1176 1248 1336 1568 1688 1952 2104
>
>md2 : active faulty ram1[0]
> 4096 blocks nfaults=0
>
>md1 : active faulty ram0[0]
> 4096 blocks ReadPersistent=92(100) nfaults=13
>
>
>
>--- linux/include/linux/raid/raid5.h.orig 2005-03-03 23:51:29.000000000 +0100
>+++ linux/include/linux/raid/raid5.h 2005-08-14 03:02:11.000000000 +0200
>@@ -147,6 +147,7 @@
> #define R5_UPTODATE 0 /* page contains current data */
> #define R5_LOCKED 1 /* IO has been submitted on "req" */
> #define R5_OVERWRITE 2 /* towrite covers whole page */
>+#define R5_FAILED 8 /* failed to read this stripe */
> /* and some that are internal to handle_stripe */
> #define R5_Insync 3 /* rdev && rdev->in_sync at start */
> #define R5_Wantread 4 /* want to schedule a read */
>@@ -196,8 +197,16 @@
> */
>
>
>+struct badblock {
>+ struct badblock *hash_next, **hash_pprev; /* hash pointers */
>+ sector_t sector; /* stripe # */
>+};
>+
> struct disk_info {
> mdk_rdev_t *rdev;
>+ struct badblock **badblock_hashtbl; /* list of known badblocks */
>+ char cache_name[20];
>+ kmem_cache_t *slab_cache; /* badblock db */
> };
>
> struct raid5_private_data {
>@@ -224,6 +233,8 @@
> int inactive_blocked; /* release of inactive stripes blocked,
> * waiting for 25% to be free
> */
>+ int mirrorit; /* source for active spare resync */
>+
> spinlock_t device_lock;
> struct disk_info disks[0];
> };
>--- linux/include/linux/sysctl.h.orig 2005-07-06 20:19:10.000000000 +0200
>+++ linux/include/linux/sysctl.h 2005-08-17 22:01:28.000000000 +0200
>@@ -778,7 +778,8 @@
> /* /proc/sys/dev/raid */
> enum {
> DEV_RAID_SPEED_LIMIT_MIN=1,
>- DEV_RAID_SPEED_LIMIT_MAX=2
>+ DEV_RAID_SPEED_LIMIT_MAX=2,
>+ DEV_RAID_BADBLOCK_TOLERANCE=3
> };
>
> /* /proc/sys/dev/parport/default */
>--- linux/drivers/md/md.c.orig 2005-08-14 21:22:08.000000000 +0200
>+++ linux/drivers/md/md.c 2005-08-14 17:20:15.000000000 +0200
>@@ -78,6 +78,10 @@
> static int sysctl_speed_limit_min = 1000;
> static int sysctl_speed_limit_max = 200000;
>
>+/* over this limit the drive'll be marked as failed. measure is block. */
>+int sysctl_badblock_tolerance = 10000;
>+
>+
> static struct ctl_table_header *raid_table_header;
>
> static ctl_table raid_table[] = {
>@@ -97,6 +101,14 @@
> .mode = 0644,
> .proc_handler = &proc_dointvec,
> },
>+ {
>+ .ctl_name = DEV_RAID_BADBLOCK_TOLERANCE,
>+ .procname = "badblock_tolerance",
>+ .data = &sysctl_badblock_tolerance,
>+ .maxlen = sizeof(int),
>+ .mode = 0644,
>+ .proc_handler = &proc_dointvec,
>+ },
> { .ctl_name = 0 }
> };
>
>@@ -3525,10 +3537,12 @@
> }
> if (mddev->sync_thread) {
> /* resync has finished, collect result */
>+printk("md_check_recovery: resync has finished\n");
> md_unregister_thread(mddev->sync_thread);
> mddev->sync_thread = NULL;
> if (!test_bit(MD_RECOVERY_ERR, &mddev->recovery) &&
> !test_bit(MD_RECOVERY_INTR, &mddev->recovery)) {
>+printk("md_check_recovery: activate any spares\n");
> /* success...*/
> /* activate any spares */
> mddev->pers->spare_active(mddev);
>@@ -3545,18 +3559,19 @@
>
> /* no recovery is running.
> * remove any failed drives, then
>- * add spares if possible
>+ * add spares if possible.
>+ * Spare are also removed and re-added, to allow
>+ * the personality to fail the re-add.
> */
>- ITERATE_RDEV(mddev,rdev,rtmp) {
>+ ITERATE_RDEV(mddev,rdev,rtmp)
> if (rdev->raid_disk >= 0 &&
>- rdev->faulty &&
>+ (rdev->faulty || ! rdev->in_sync) &&
> atomic_read(&rdev->nr_pending)==0) {
>+printk("md_check_recovery: hot_remove_disk\n");
> if (mddev->pers->hot_remove_disk(mddev, rdev->raid_disk)==0)
> rdev->raid_disk = -1;
> }
>- if (!rdev->faulty && rdev->raid_disk >= 0 && !rdev->in_sync)
>- spares++;
>- }
>+
> if (mddev->degraded) {
> ITERATE_RDEV(mddev,rdev,rtmp)
> if (rdev->raid_disk < 0
>@@ -3764,4 +3783,6 @@
> EXPORT_SYMBOL(md_wakeup_thread);
> EXPORT_SYMBOL(md_print_devices);
> EXPORT_SYMBOL(md_check_recovery);
>+EXPORT_SYMBOL(kick_rdev_from_array); // fixme
>+EXPORT_SYMBOL(sysctl_badblock_tolerance);
> MODULE_LICENSE("GPL");
>--- linux/drivers/md/raid5.c.orig 2005-08-14 21:22:08.000000000 +0200
>+++ linux/drivers/md/raid5.c 2005-08-14 20:49:49.000000000 +0200
>@@ -40,6 +40,18 @@
>
> #define stripe_hash(conf, sect) ((conf)->stripe_hashtbl[((sect) >> STRIPE_SHIFT) & HASH_MASK])
>
>+ /*
>+ * per-device badblock cache
>+ */
>+
>+#define BB_SHIFT (PAGE_SHIFT/*12*/ - 9)
>+#define BB_HASH_PAGES 1
>+#define BB_NR_HASH (HASH_PAGES * PAGE_SIZE / sizeof(struct badblock *))
>+#define BB_HASH_MASK (BB_NR_HASH - 1)
>+
>+#define bb_hash(disk, sect) ((disk)->badblock_hashtbl[((sect) >> BB_SHIFT) & BB_HASH_MASK])
>+#define bb_hashnr(sect) (((sect) >> BB_SHIFT) & BB_HASH_MASK)
>+
> /* bio's attached to a stripe+device for I/O are linked together in bi_sector
> * order without overlap. There may be several bio's per stripe+device, and
> * a bio could span several devices.
>@@ -53,7 +65,7 @@
> /*
> * The following can be used to debug the driver
> */
>-#define RAID5_DEBUG 0
>+#define RAID5_DEBUG 1
> #define RAID5_PARANOIA 1
> #if RAID5_PARANOIA && defined(CONFIG_SMP)
> # define CHECK_DEVLOCK() assert_spin_locked(&conf->device_lock)
>@@ -61,13 +73,159 @@
> # define CHECK_DEVLOCK()
> #endif
>
>-#define PRINTK(x...) ((void)(RAID5_DEBUG && printk(x)))
>+#define PRINTK(x...) ((void)(RAID5_DEBUG && printk(KERN_DEBUG x)))
> #if RAID5_DEBUG
> #define inline
> #define __inline__
> #endif
>
> static void print_raid5_conf (raid5_conf_t *conf);
>+extern int sysctl_badblock_tolerance;
>+
>+
>+static void bb_insert_hash(struct disk_info *disk, struct badblock *bb)
>+{
>+ struct badblock **bbp = &bb_hash(disk, bb->sector);
>+
>+ /*printk("bb_insert_hash(), sector %llu hashnr %lu\n", (unsigned long long)bb->sector,
>+ bb_hashnr(bb->sector));*/
>+
>+ if ((bb->hash_next = *bbp) != NULL)
>+ (*bbp)->hash_pprev = &bb->hash_next;
>+ *bbp = bb;
>+ bb->hash_pprev = bbp;
>+}
>+
>+static void bb_remove_hash(struct badblock *bb)
>+{
>+ /*printk("remove_hash(), sector %llu hashnr %lu\n", (unsigned long long)bb->sector,
>+ bb_hashnr(bb->sector));*/
>+
>+ if (bb->hash_pprev) {
>+ if (bb->hash_next)
>+ bb->hash_next->hash_pprev = bb->hash_pprev;
>+ *bb->hash_pprev = bb->hash_next;
>+ bb->hash_pprev = NULL;
>+ }
>+}
>+
>+static struct badblock *__find_badblock(struct disk_info *disk, sector_t sector)
>+{
>+ struct badblock *bb;
>+
>+ for (bb = bb_hash(disk, sector); bb; bb = bb->hash_next)
>+ if (bb->sector == sector)
>+ return bb;
>+ return NULL;
>+}
>+
>+static struct badblock *find_badblock(struct disk_info *disk, sector_t sector)
>+{
>+ raid5_conf_t *conf = (raid5_conf_t *) disk->rdev->mddev->private;
>+ struct badblock *bb;
>+
>+ spin_lock_irq(&conf->device_lock);
>+ bb = __find_badblock(disk, sector);
>+ spin_unlock_irq(&conf->device_lock);
>+ return bb;
>+}
>+
>+static unsigned long count_badblocks (struct disk_info *disk)
>+{
>+ raid5_conf_t *conf = (raid5_conf_t *) disk->rdev->mddev->private;
>+ struct badblock *bb;
>+ int j;
>+ int n = 0;
>+
>+ spin_lock_irq(&conf->device_lock);
>+ for (j = 0; j < BB_NR_HASH; j++) {
>+ bb = disk->badblock_hashtbl[j];
>+ for (; bb; bb = bb->hash_next)
>+ n++;
>+ }
>+ spin_unlock_irq(&conf->device_lock);
>+
>+ return n;
>+}
>+
>+static int grow_badblocks(struct disk_info *disk)
>+{
>+ char b[BDEVNAME_SIZE];
>+ kmem_cache_t *sc;
>+
>+ /* hash table */
>+ if ((disk->badblock_hashtbl = (struct badblock **) __get_free_pages(GFP_ATOMIC, HASH_PAGES_ORDER)) == NULL) {
>+ printk("grow_badblocks: __get_free_pages failed\n");
>+ return 0;
>+ }
>+ memset(disk->badblock_hashtbl, 0, BB_HASH_PAGES * PAGE_SIZE);
>+
>+ /* badblocks db */
>+ sprintf(disk->cache_name, "raid5/%s_%s_bbc", mdname(disk->rdev->mddev),
>+ bdevname(disk->rdev->bdev, b));
>+ sc = kmem_cache_create(disk->cache_name,
>+ sizeof(struct badblock),
>+ 0, 0, NULL, NULL);
>+ if (!sc) {
>+ printk("grow_badblocks: kmem_cache_create failed\n");
>+ return 1;
>+ }
>+ disk->slab_cache = sc;
>+
>+ return 0;
>+}
>+
>+static void shrink_badblocks(struct disk_info *disk)
>+{
>+ struct badblock *bb;
>+ int j;
>+
>+ /* badblocks db */
>+ for (j = 0; j < BB_NR_HASH; j++) {
>+ bb = disk->badblock_hashtbl[j];
>+ for (; bb; bb = bb->hash_next)
>+ kmem_cache_free(disk->slab_cache, bb);
>+ }
>+ kmem_cache_destroy(disk->slab_cache);
>+ disk->slab_cache = NULL;
>+
>+ /* hash table */
>+ free_pages((unsigned long) disk->badblock_hashtbl, HASH_PAGES_ORDER);
>+}
>+
>+static void store_badblock(struct disk_info *disk, sector_t sector)
>+{
>+ struct badblock *bb;
>+ raid5_conf_t *conf = (raid5_conf_t *) disk->rdev->mddev->private;
>+
>+ bb = kmem_cache_alloc(disk->slab_cache, GFP_KERNEL);
>+ if (!bb) {
>+ printk("store_badblock: kmem_cache_alloc failed\n");
>+ return;
>+ }
>+ memset(bb, 0, sizeof(*bb));
>+ bb->sector = sector;
>+
>+ spin_lock_irq(&conf->device_lock);
>+ bb_insert_hash(disk, bb);
>+ spin_unlock_irq(&conf->device_lock);
>+}
>+
>+static void delete_badblock(struct disk_info *disk, sector_t sector)
>+{
>+ struct badblock *bb;
>+ raid5_conf_t *conf = (raid5_conf_t *) disk->rdev->mddev->private;
>+
>+ bb = find_badblock(disk, sector);
>+ if (!bb)
>+ /* reset on write'll call us like an idiot :} */
>+ return;
>+ spin_lock_irq(&conf->device_lock);
>+ bb_remove_hash(bb);
>+ kmem_cache_free(disk->slab_cache, bb);
>+ spin_unlock_irq(&conf->device_lock);
>+}
>+
>
> static inline void __release_stripe(raid5_conf_t *conf, struct stripe_head *sh)
> {
>@@ -201,7 +359,7 @@
> sh->pd_idx = pd_idx;
> sh->state = 0;
>
>- for (i=disks; i--; ) {
>+ for (i=disks+1; i--; ) {
> struct r5dev *dev = &sh->dev[i];
>
> if (dev->toread || dev->towrite || dev->written ||
>@@ -291,8 +449,10 @@
>
> sprintf(conf->cache_name, "raid5/%s", mdname(conf->mddev));
>
>+ /* +1: we need extra space in the *sh->devs for the 'active spare' to keep
>+ handle_stripe() simple */
> sc = kmem_cache_create(conf->cache_name,
>- sizeof(struct stripe_head)+(devs-1)*sizeof(struct r5dev),
>+ sizeof(struct stripe_head)+(devs-1+1)*sizeof(struct r5dev),
> 0, 0, NULL, NULL);
> if (!sc)
> return 1;
>@@ -301,12 +461,12 @@
> sh = kmem_cache_alloc(sc, GFP_KERNEL);
> if (!sh)
> return 1;
>- memset(sh, 0, sizeof(*sh) + (devs-1)*sizeof(struct r5dev));
>+ memset(sh, 0, sizeof(*sh) + (devs-1+1)*sizeof(struct r5dev));
> sh->raid_conf = conf;
> spin_lock_init(&sh->lock);
>
>- if (grow_buffers(sh, conf->raid_disks)) {
>- shrink_buffers(sh, conf->raid_disks);
>+ if (grow_buffers(sh, conf->raid_disks+1)) {
>+ shrink_buffers(sh, conf->raid_disks+1);
> kmem_cache_free(sc, sh);
> return 1;
> }
>@@ -391,10 +551,39 @@
> }
> #else
> set_bit(R5_UPTODATE, &sh->dev[i].flags);
>+ clear_bit(R5_FAILED, &sh->dev[i].flags);
> #endif
> } else {
>+ char b[BDEVNAME_SIZE];
>+
>+ /*
>+ rule 1.,: try to keep all disk in_sync even if we've got read errors,
>+ cause the 'active spare' may can rebuild a complete column from
>+ partially failed drives
>+ */
>+ if (conf->disks[i].rdev->in_sync && conf->working_disks < conf->raid_disks) {
>+ /* bad news, but keep it, cause md_error() would do a complete
>+ array shutdown, even if 99.99% is useable */
>+ printk(KERN_ALERT
>+ "raid5_end_read_request: Read failure %s on sector %llu (%d) in degraded mode\n"
>+ ,bdevname(conf->disks[i].rdev->bdev, b),
>+ (unsigned long long)sh->sector, atomic_read(&sh->count));
>+ if (conf->mddev->curr_resync)
>+ /* raid5_add_disk() will no accept the spare again,
>+ and will not loop forever */
>+ conf->mddev->degraded = 2;
>+ } else if (conf->disks[i].rdev->in_sync && conf->working_disks >= conf->raid_disks) {
>+ /* will be computed */
>+ printk(KERN_ALERT
>+ "raid5_end_read_request: Read failure %s on sector %llu (%d) in optimal mode\n"
>+ ,bdevname(conf->disks[i].rdev->bdev, b),
>+ (unsigned long long)sh->sector, atomic_read(&sh->count));
>+ /* conf->disks[i].rerr++ */
>+ } else
>+ /* practically it never happens */
> md_error(conf->mddev, conf->disks[i].rdev);
>- clear_bit(R5_UPTODATE, &sh->dev[i].flags);
>+ clear_bit(R5_UPTODATE, &sh->dev[i].flags);
>+ set_bit(R5_FAILED, &sh->dev[i].flags);
> }
> rdev_dec_pending(conf->disks[i].rdev, conf->mddev);
> #if 0
>@@ -430,10 +619,11 @@
> PRINTK("end_write_request %llu/%d, count %d, uptodate: %d.\n",
> (unsigned long long)sh->sector, i, atomic_read(&sh->count),
> uptodate);
>+ /* sorry
> if (i == disks) {
> BUG();
> return 0;
>- }
>+ }*/
>
> spin_lock_irqsave(&conf->device_lock, flags);
> if (!uptodate)
>@@ -467,33 +657,144 @@
> dev->req.bi_private = sh;
>
> dev->flags = 0;
>- if (i != sh->pd_idx)
>+ if (i != sh->pd_idx && i < sh->raid_conf->raid_disks) /* active spare? */
> dev->sector = compute_blocknr(sh, i);
> }
>
>+static int raid5_remove_disk(mddev_t *mddev, int number);
>+static int raid5_add_disk(mddev_t *mddev, mdk_rdev_t *rdev);
>+/*static*/ void kick_rdev_from_array(mdk_rdev_t * rdev);
>+//static void md_update_sb(mddev_t * mddev);
> static void error(mddev_t *mddev, mdk_rdev_t *rdev)
> {
> char b[BDEVNAME_SIZE];
>+ char b2[BDEVNAME_SIZE];
> raid5_conf_t *conf = (raid5_conf_t *) mddev->private;
> PRINTK("raid5: error called\n");
>
> if (!rdev->faulty) {
>- mddev->sb_dirty = 1;
>- if (rdev->in_sync) {
>- conf->working_disks--;
>- mddev->degraded++;
>- conf->failed_disks++;
>- rdev->in_sync = 0;
>- /*
>- * if recovery was running, make sure it aborts.
>- */
>- set_bit(MD_RECOVERY_ERR, &mddev->recovery);
>- }
>- rdev->faulty = 1;
>- printk (KERN_ALERT
>- "raid5: Disk failure on %s, disabling device."
>- " Operation continuing on %d devices\n",
>- bdevname(rdev->bdev,b), conf->working_disks);
>+ int mddisks = 0;
>+ mdk_rdev_t *rd;
>+ mdk_rdev_t *rdevs = NULL;
>+ struct list_head *rtmp;
>+ int i;
>+
>+ ITERATE_RDEV(mddev,rd,rtmp)
>+ {
>+ printk(KERN_INFO "mddev%d: %s\n", mddisks, bdevname(rd->bdev,b));
>+ mddisks++;
>+ }
>+ for (i = 0; (rd = conf->disks[i].rdev); i++) {
>+ printk(KERN_INFO "r5dev%d: %s\n", i, bdevname(rd->bdev,b));
>+ }
>+ ITERATE_RDEV(mddev,rd,rtmp)
>+ {
>+ rdevs = rd;
>+ break;
>+ }
>+printk("%d %d > %d %d ins:%d %p\n",
>+ mddev->raid_disks, mddisks, conf->raid_disks, mddev->degraded, rdev->in_sync, rdevs);
>+ if (conf->disks[conf->raid_disks].rdev == rdev && rdev->in_sync) {
>+ /* in_sync, but must be handled specially, don't let 'degraded++' */
>+ printk ("active spare failed %s (in_sync)\n",
>+ bdevname(rdev->bdev,b));
>+ mddev->sb_dirty = 1;
>+ rdev->in_sync = 0;
>+ rdev->faulty = 1;
>+ rdev->raid_disk = conf->raid_disks; /* me as myself, again ;) */
>+ conf->mirrorit = -1;
>+ } else if (mddisks > conf->raid_disks && !mddev->degraded && rdev->in_sync) {
>+ /* have active spare, array is optimal, removed disk member
>+ of it (but not the active spare) */
>+ if (rdev->raid_disk == conf->mirrorit && conf->disks[conf->raid_disks].rdev) {
>+ if (!conf->disks[conf->raid_disks].rdev->in_sync) {
>+ printk(KERN_ALERT "disk %s failed and active spare isn't in_sync yet, readd as normal spare\n",
>+ bdevname(rdev->bdev,b));
>+ /* maybe shouldn't stop here, but we can't call this disk as
>+ 'active spare' anymore, cause it's a simple rebuild from
>+ a degraded array, fear of bad blocks! */
>+ conf->mirrorit = -1;
>+ goto letitgo;
>+ } else {
>+ int ret;
>+
>+ /* hot replace the mirrored drive with the 'active spare'
>+ this is really "hot", I can't see clearly the things
>+ what I have to do here. :}
>+ pray. */
>+
>+ printk(KERN_ALERT "replace %s with in_sync active spare %s\n",
>+ bdevname(rdev->bdev,b),
>+ bdevname(rdevs->bdev,b2));
>+ rdev->in_sync = 0;
>+ rdev->faulty = 1;
>+
>+ conf->mirrorit = -1;
>+
>+ /* my God, am I sane? */
>+ while ((i = atomic_read(&rdev->nr_pending))) {
>+ printk("waiting for disk %d .. %d\n",
>+ rdev->raid_disk, i);
>+ }
>+ ret = raid5_remove_disk(mddev, rdev->raid_disk);
>+ if (ret) {
>+ printk(KERN_WARNING "raid5_remove_disk1: busy?!\n");
>+ return; // should nothing to do
>+ }
>+
>+ rd = conf->disks[conf->raid_disks].rdev;
>+ while ((i = atomic_read(&rd->nr_pending))) {
>+ printk("waiting for disk %d .. %d\n",
>+ conf->raid_disks, i);
>+ }
>+ rd->in_sync = 0;
>+ ret = raid5_remove_disk(mddev, conf->raid_disks);
>+ if (ret) {
>+ printk(KERN_WARNING "raid5_remove_disk2: busy?!\n");
>+ return; // ..
>+ }
>+
>+ ret = raid5_add_disk(mddev, rd);
>+ if (!ret) {
>+ printk(KERN_WARNING "raid5_add_disk: no free slot?!\n");
>+ return; // ..
>+ }
>+ rd->in_sync = 1;
>+
>+ /* borrowed from hot_remove_disk() */
>+ kick_rdev_from_array(rdev);
>+ //md_update_sb(mddev);
>+ }
>+ } else {
>+ /* in_sync disk failed (!degraded), trying to make a copy
>+ to a spare {and we can call it 'active spare' from now:} */
>+ printk(KERN_ALERT "resync from %s to spare %s (%d)\n",
>+ bdevname(rdev->bdev,b),
>+ bdevname(rdevs->bdev,b2),
>+ conf->raid_disks);
>+ conf->mirrorit = rdev->raid_disk;
>+
>+ mddev->degraded++; /* for call raid5_hot_add_disk(), reset there */
>+ }
>+ } else {
>+letitgo:
>+ mddev->sb_dirty = 1;
>+ if (rdev->in_sync) {
>+ conf->working_disks--;
>+ mddev->degraded++;
>+ conf->failed_disks++;
>+ rdev->in_sync = 0;
>+ /*
>+ * if recovery was running, make sure it aborts.
>+ */
>+ set_bit(MD_RECOVERY_ERR, &mddev->recovery);
>+ }
>+ rdev->faulty = 1;
>+ printk (KERN_ALERT
>+ "raid5: Disk failure on %s, disabling device."
>+ " Operation continuing on %d devices\n",
>+ bdevname(rdev->bdev,b), conf->working_disks);
>+ }
> }
> }
>
>@@ -888,6 +1189,8 @@
> int locked=0, uptodate=0, to_read=0, to_write=0, failed=0, written=0;
> int non_overwrite = 0;
> int failed_num=0;
>+ int aspare=0, asparenum=-1;
>+ struct disk_info *asparedev;
> struct r5dev *dev;
>
> PRINTK("handling stripe %llu, cnt=%d, pd_idx=%d\n",
>@@ -899,10 +1202,18 @@
> clear_bit(STRIPE_DELAYED, &sh->state);
>
> syncing = test_bit(STRIPE_SYNCING, &sh->state);
>+ asparedev = &conf->disks[conf->raid_disks];
>+ if (!conf->mddev->degraded && asparedev->rdev && !asparedev->rdev->faulty &&
>+ conf->mirrorit != -1) {
>+ aspare++;
>+ asparenum = sh->raid_conf->mirrorit;
>+ PRINTK("has aspare (%d)\n", asparenum);
>+ }
> /* Now to look around and see what can be done */
>
>- for (i=disks; i--; ) {
>+ for (i=disks+aspare; i--; ) {
> mdk_rdev_t *rdev;
>+ struct badblock *bb = NULL;
> dev = &sh->dev[i];
> clear_bit(R5_Insync, &dev->flags);
> clear_bit(R5_Syncio, &dev->flags);
>@@ -945,12 +1256,43 @@
> }
> if (dev->written) written++;
> rdev = conf->disks[i].rdev; /* FIXME, should I be looking rdev */
>- if (!rdev || !rdev->in_sync) {
>+ if (rdev && rdev->in_sync &&
>+ !test_bit(R5_UPTODATE, &dev->flags) &&
>+ !test_bit(R5_LOCKED, &dev->flags)) {
>+ /* ..potentially deserved to read, we must check it
>+ checkme, it could be a big performance penalty if called
>+ without a good reason! it's seems ok for now
>+ */
>+ PRINTK("find_badblock %d: %llu\n", i, sh->sector);
>+ bb = find_badblock(&conf->disks[i], sh->sector);
>+ }
>+ if (!rdev || !rdev->in_sync
>+ || (test_bit(R5_FAILED, &dev->flags) && !test_bit(R5_UPTODATE, &dev->flags))
>+ || bb) {
>+ if (rdev && rdev->in_sync && test_bit(R5_FAILED, &dev->flags) && !bb) {
>+ if (/*(!aspare || (aspare && asparedev->rdev->in_sync)) &&
>+ it would be clear, but too early, the thread hasn't woken, yet */
>+ conf->mirrorit == -1 &&
>+ count_badblocks(&conf->disks[i]) >= sysctl_badblock_tolerance) {
>+ char b[BDEVNAME_SIZE];
>+
>+ printk(KERN_ALERT "too many badblocks (%lu) on device %s, marking as failed\n",
>+ count_badblocks(&conf->disks[i]) + 1, bdevname(conf->disks[i].rdev->bdev, b));
>+ md_error(conf->mddev, conf->disks[i].rdev);
>+ }
>+ PRINTK("store_badblock %d: %llu\n", i, sh->sector);
>+ store_badblock(&conf->disks[i], sh->sector);
>+ }
> failed++;
> failed_num = i;
>- } else
>+ PRINTK("device %d failed for this stripe r%p w%p\n", i, dev->toread, dev->towrite);
>+ } else {
> set_bit(R5_Insync, &dev->flags);
>+ }
> }
>+ if (aspare && failed > 1)
>+ failed--; /* failed = 1 means "all ok" if we've aspare, this is simplest
>+ method to do our work */
> PRINTK("locked=%d uptodate=%d to_read=%d"
> " to_write=%d failed=%d failed_num=%d\n",
> locked, uptodate, to_read, to_write, failed, failed_num);
>@@ -1013,6 +1355,7 @@
> spin_unlock_irq(&conf->device_lock);
> }
> if (failed > 1 && syncing) {
>+ printk(KERN_ALERT "sync stopped by IO error\n");
> md_done_sync(conf->mddev, STRIPE_SECTORS,0);
> clear_bit(STRIPE_SYNCING, &sh->state);
> syncing = 0;
>@@ -1184,6 +1527,26 @@
> PRINTK("Writing block %d\n", i);
> locked++;
> set_bit(R5_Wantwrite, &sh->dev[i].flags);
>+ if (aspare && i == asparenum) {
>+ char *ps, *pd;
>+
>+ /* mirroring this new block */
>+ PRINTK("Writing to aspare too %d->%d\n",
>+ i, conf->raid_disks);
>+ /*if (test_bit(R5_LOCKED, &sh->dev[conf->raid_disks].flags)) {
>+ printk("bazmeg, ez lokkolt1!!!\n");
>+ }*/
>+ ps = page_address(sh->dev[i].page);
>+ pd = page_address(sh->dev[conf->raid_disks].page);
>+ /* better idea? */
>+ memcpy(pd, ps, STRIPE_SIZE);
>+ set_bit(R5_LOCKED, &sh->dev[conf->raid_disks].flags);
>+ set_bit(R5_Wantwrite, &sh->dev[conf->raid_disks].flags);
>+ }
>+ if (conf->disks[i].rdev && conf->disks[i].rdev->in_sync) {
>+ PRINTK("reset badblock on %d: %llu\n", i, sh->sector);
>+ delete_badblock(&conf->disks[i], sh->sector);
>+ }
> if (!test_bit(R5_Insync, &sh->dev[i].flags)
> || (i==sh->pd_idx && failed == 0))
> set_bit(STRIPE_INSYNC, &sh->state);
>@@ -1220,20 +1583,39 @@
> if (failed==0)
> failed_num = sh->pd_idx;
> /* should be able to compute the missing block and write it to spare */
>+ if (aspare)
>+ failed_num = asparenum;
> if (!test_bit(R5_UPTODATE, &sh->dev[failed_num].flags)) {
> if (uptodate+1 != disks)
> BUG();
> compute_block(sh, failed_num);
> uptodate++;
> }
>+ if (aspare) {
>+ char *ps, *pd;
>+
>+ ps = page_address(sh->dev[failed_num].page);
>+ pd = page_address(sh->dev[conf->raid_disks].page);
>+ memcpy(pd, ps, STRIPE_SIZE);
>+ PRINTK("R5_Wantwrite to aspare, uptodate: %d %p->%p\n",
>+ uptodate, ps, pd);
>+ /*if (test_bit(R5_LOCKED, &sh->dev[conf->raid_disks].flags)) {
>+ printk("bazmeg, ez lokkolt2!!!\n");
>+ }*/
>+ }
> if (uptodate != disks)
> BUG();
>+ if (aspare)
>+ failed_num = conf->raid_disks;
> dev = &sh->dev[failed_num];
> set_bit(R5_LOCKED, &dev->flags);
> set_bit(R5_Wantwrite, &dev->flags);
> locked++;
> set_bit(STRIPE_INSYNC, &sh->state);
> set_bit(R5_Syncio, &dev->flags);
>+ /* !in_sync..
>+ printk("reset badblock on %d: %llu\n", failed_num, sh->sector);
>+ delete_badblock(&conf->disks[failed_num], sh->sector);*/
> }
> }
> if (syncing && locked == 0 && test_bit(STRIPE_INSYNC, &sh->state)) {
>@@ -1251,7 +1633,7 @@
> bi->bi_size = 0;
> bi->bi_end_io(bi, bytes, 0);
> }
>- for (i=disks; i-- ;) {
>+ for (i=disks+aspare; i-- ;) {
> int rw;
> struct bio *bi;
> mdk_rdev_t *rdev;
>@@ -1493,6 +1875,15 @@
> unplug_slaves(mddev);
> return 0;
> }
>+ /* if there is 1 or more failed drives and we are trying
>+ * to resync, then assert that we are finished, because there is
>+ * nothing we can do.
>+ */
>+ if (mddev->degraded >= 1 && test_bit(MD_RECOVERY_SYNC, &mddev->recovery)) {
>+ int rv = (mddev->size << 1) - sector_nr;
>+ md_done_sync(mddev, rv, 1);
>+ return rv;
>+ }
>
> x = sector_nr;
> chunk_offset = sector_div(x, sectors_per_chunk);
>@@ -1591,11 +1982,11 @@
> }
>
> mddev->private = kmalloc (sizeof (raid5_conf_t)
>- + mddev->raid_disks * sizeof(struct disk_info),
>+ + (mddev->raid_disks + 1) * sizeof(struct disk_info),
> GFP_KERNEL);
> if ((conf = mddev->private) == NULL)
> goto abort;
>- memset (conf, 0, sizeof (*conf) + mddev->raid_disks * sizeof(struct disk_info) );
>+ memset (conf, 0, sizeof (*conf) + (mddev->raid_disks + 1) * sizeof(struct disk_info) );
> conf->mddev = mddev;
>
> if ((conf->stripe_hashtbl = (struct stripe_head **) __get_free_pages(GFP_ATOMIC, HASH_PAGES_ORDER)) == NULL)
>@@ -1625,6 +2016,8 @@
>
> disk->rdev = rdev;
>
>+ grow_badblocks(disk);
>+
> if (rdev->in_sync) {
> char b[BDEVNAME_SIZE];
> printk(KERN_INFO "raid5: device %s operational as raid"
>@@ -1635,6 +2028,7 @@
> }
>
> conf->raid_disks = mddev->raid_disks;
>+ conf->mirrorit = -1;
> /*
> * 0 for a fully functional array, 1 for a degraded array.
> */
>@@ -1684,7 +2078,7 @@
> }
> }
> memory = conf->max_nr_stripes * (sizeof(struct stripe_head) +
>- conf->raid_disks * ((sizeof(struct bio) + PAGE_SIZE))) / 1024;
>+ (conf->raid_disks+1) * ((sizeof(struct bio) + PAGE_SIZE))) / 1024;
> if (grow_stripes(conf, conf->max_nr_stripes)) {
> printk(KERN_ERR
> "raid5: couldn't allocate %dkB for buffers\n", memory);
>@@ -1739,10 +2133,14 @@
> static int stop (mddev_t *mddev)
> {
> raid5_conf_t *conf = (raid5_conf_t *) mddev->private;
>+ int i;
>
> md_unregister_thread(mddev->thread);
> mddev->thread = NULL;
> shrink_stripes(conf);
>+ for (i = conf->raid_disks; i--; )
>+ if (conf->disks[i].rdev && conf->disks[i].rdev->in_sync)
>+ shrink_badblocks(&conf->disks[i]);
> free_pages((unsigned long) conf->stripe_hashtbl, HASH_PAGES_ORDER);
> blk_sync_queue(mddev->queue); /* the unplug fn references 'conf'*/
> kfree(conf);
>@@ -1788,7 +2186,9 @@
> static void status (struct seq_file *seq, mddev_t *mddev)
> {
> raid5_conf_t *conf = (raid5_conf_t *) mddev->private;
>- int i;
>+ int i, j;
>+ char b[BDEVNAME_SIZE];
>+ struct badblock *bb;
>
> seq_printf (seq, " level %d, %dk chunk, algorithm %d", mddev->level, mddev->chunk_size >> 10, mddev->layout);
> seq_printf (seq, " [%d/%d] [", conf->raid_disks, conf->working_disks);
>@@ -1801,6 +2201,20 @@
> #define D(x) \
> seq_printf (seq, "<"#x":%d>", atomic_read(&conf->x))
> printall(conf);
>+
>+ spin_lock_irq(&conf->device_lock); /* it's ok now for debug */
>+ seq_printf (seq, "\n known bad sectors on active devices:");
>+ for (i = conf->raid_disks; i--; ) {
>+ if (conf->disks[i].rdev) {
>+ seq_printf (seq, "\n %s", bdevname(conf->disks[i].rdev->bdev, b));
>+ for (j = 0; j < BB_NR_HASH; j++) {
>+ bb = conf->disks[i].badblock_hashtbl[j];
>+ for (; bb; bb = bb->hash_next)
>+ seq_printf (seq, " %llu-%llu", bb->sector, bb->sector + (unsigned long long)(STRIPE_SIZE / 512) - 1);
>+ }
>+ }
>+ }
>+ spin_unlock_irq(&conf->device_lock);
> #endif
> }
>
>@@ -1844,6 +2258,17 @@
> tmp->rdev->in_sync = 1;
> }
> }
>+ tmp = conf->disks + i;
>+ if (tmp->rdev && !tmp->rdev->faulty && !tmp->rdev->in_sync) {
>+ /* sync done to the 'active spare' */
>+ tmp->rdev->in_sync = 1;
>+
>+ printk(KERN_NOTICE "raid5_spare_active: %d in_sync %d->%d\n",
>+ i, tmp->rdev->raid_disk, conf->mirrorit);
>+
>+ /* scary..? :} */
>+ tmp->rdev->raid_disk = conf->mirrorit;
>+ }
> print_raid5_conf(conf);
> return 0;
> }
>@@ -1857,6 +2282,7 @@
>
> print_raid5_conf(conf);
> rdev = p->rdev;
>+printk("raid5_remove_disk %d\n", number);
> if (rdev) {
> if (rdev->in_sync ||
> atomic_read(&rdev->nr_pending)) {
>@@ -1870,6 +2296,8 @@
> err = -EBUSY;
> p->rdev = rdev;
> }
>+ if (!err)
>+ shrink_badblocks(p);
> }
> abort:
>
>@@ -1884,6 +2312,10 @@
> int disk;
> struct disk_info *p;
>
>+ if (mddev->degraded > 1)
>+ /* no point adding a device */
>+ return 0;
>+
> /*
> * find the disk ...
> */
>@@ -1895,6 +2327,22 @@
> p->rdev = rdev;
> break;
> }
>+
>+ if (!found) {
>+ /* array optimal, this should be the 'active spare' */
>+ conf->disks[disk].rdev = rdev;
>+ rdev->in_sync = 0;
>+ rdev->raid_disk = conf->raid_disks;
>+
>+ mddev->degraded--;
>+ found++; /* call resync */
>+
>+ printk(KERN_INFO "added spare for active resync\n");
>+ }
>+ if (found)
>+ grow_badblocks(&conf->disks[disk]);
>+ printk(KERN_INFO "raid5_add_disk: %d (%d)\n", disk, found);
>+
> print_raid5_conf(conf);
> return found;
> }
>
>
>----------------------------------------------------------- -------------
>
>No virus found in this incoming message.
>Checked by AVG Anti-Virus.
>Version: 7.0.338 / Virus Database: 267.10.12/75 - Release Date: 8/17/2005
>
>


--
No virus found in this outgoing message.
Checked by AVG Anti-Virus.
Version: 7.0.338 / Virus Database: 267.10.12/75 - Release Date: 8/17/2005

-
To unsubscribe from this list: send the line "unsubscribe linux-raid" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html

Re: [PATCH] proactive raid5 disk replacement for 2.6.11, updated

am 18.08.2005 07:28:41 von Neil Brown

Thanks for this. There are definitely some good ideas here.
However I think I would like to do it a little bit differently.

If we want to mirror a single drive in a raid5 array, I would really
like to do that using the raid1 personality.
e.g.
suspend io
remove the drive
build a raid1 (with no superblock) using the drive.
add that back into the array
resume io.

Then another drive can be added to the raid1 and synced.

This allows shuffling of drives even when they haven't actually
failed.

To handle read failures, I would like the first step to be to re-write
the failed block. I believe most (all?) drives will relocate the
block if a write cannot succeed at the normal location, so this will
often fix the problem.

A userspace process can then notice an unacceptable failure rate and
start a miror/swap process as above.

This possible doesn't handle the possibility of a write failing very
well, but I'm not sure what your approach does in that case. Could
you explain that?

It also means that if the raid1 rebuild hits a read-error it cannot
cope whereas your code would just reconstruct the block from the rest
of the raid5.

I'll think through this some more and try to work out how I really
want it to work.

Thanks again for the ideas and code,

NeilBrown

-
To unsubscribe from this list: send the line "unsubscribe linux-raid" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html

Re: [PATCH] proactive raid5 disk replacement for 2.6.11, updated

am 18.08.2005 12:24:58 von Lars Marowsky-Bree

On 2005-08-18T15:28:41, Neil Brown wrote:

> If we want to mirror a single drive in a raid5 array, I would really
> like to do that using the raid1 personality.
> e.g.
> suspend io
> remove the drive
> build a raid1 (with no superblock) using the drive.
> add that back into the array
> resume io.

I hate to say this, but this is something where the Device Mapper
framework, with it's suspend/resume options and the ability to change
the mapping atomically.

Maybe copying some of the ideas would be useful.

=46reeze, reconfigure one disk to be RAID1, resume - all IO goes on whi=
le
at the same time said RAID1 re-mirrors to the new disk. Repeat with a
removal later.

> To handle read failures, I would like the first step to be to re-writ=
e
> the failed block. I believe most (all?) drives will relocate the
> block if a write cannot succeed at the normal location, so this will
> often fix the problem. =20

Yes. This would be highly useful.

> A userspace process can then notice an unacceptable failure rate and
> start a miror/swap process as above.

Agreed. Combined with SMART monitoring, this could provide highly usefu=
l
features.

> This possible doesn't handle the possibility of a write failing very
> well, but I'm not sure what your approach does in that case. Could
> you explain that?

I think a failed write can't really be handled - it might be retried
once or twice, but then the way to proceed is to kick the drive and
rebuild the array.

> It also means that if the raid1 rebuild hits a read-error it cannot
> cope whereas your code would just reconstruct the block from the rest
> of the raid5.

Good point. One way to fix this would be to have a callback to one leve=
l
up "Hi, I can't read this section, can you reconstruct and give it to
me?". (Which is a pretty ugly hack.)

However, that would also assume that the data on the disk which _can_ b=
e
read still can be trusted. I'm not sure I'd buy that myself, untrusted.
But a periodic background consistency check for RAID might help convinc=
e
users that this is indeed the case ;-)

If you can no longer pro-actively reconstruct the disk because it has
indeed failed, maybe treating it like a failed disk and rebuilding the
array in the "classic" fashion isn't the worst idea, though.


Sincerely,
Lars Marowsky-Br=E9e

--=20
High Availability & Clustering
SUSE Labs, Research and Development
SUSE LINUX Products GmbH - A Novell Business -- Charles Darwin
"Ignorance more frequently begets confidence than does knowledge"

-
To unsubscribe from this list: send the line "unsubscribe linux-raid" i=
n
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html

Re: [PATCH] proactive raid5 disk replacement for 2.6.11, updated

am 18.08.2005 12:56:22 von Michael Tokarev

Neil Brown wrote:
> Thanks for this. There are definitely some good ideas here.
> However I think I would like to do it a little bit differently.
>
> If we want to mirror a single drive in a raid5 array, I would really
> like to do that using the raid1 personality.
> e.g.
> suspend io
> remove the drive
> build a raid1 (with no superblock) using the drive.
> add that back into the array
> resume io.
>
> Then another drive can be added to the raid1 and synced.

This approach does not work if the drive has one or more unreadable
blocks. An 'initial raid1 resync' can't be completed because it's
impossible to read+copy that sector, but it's pretty much possible
to reconstruct it from other components of raid5.

/mjt
-
To unsubscribe from this list: send the line "unsubscribe linux-raid" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html

Re: [PATCH] proactive raid5 disk replacement for 2.6.11, updated

am 18.08.2005 15:46:44 von Pallai Roland

On Thu, 2005-08-18 at 15:28 +1000, Neil Brown wrote:
> However I think I would like to do it a little bit differently.
thanks for your reply, interesting ideas!

> If we want to mirror a single drive in a raid5 array, I would really
> like to do that using the raid1 personality.
> e.g.
> suspend io
> remove the drive
> build a raid1 (with no superblock) using the drive.
> add that back into the array
> resume io.
>
> Then another drive can be added to the raid1 and synced.
>
> This allows shuffling of drives even when they haven't actually
> failed.
the current hack allows too, but using the raid1 personality would be a
clear solution, I agree. although, I have some doubt.. very simple task
to mirror a drive (some lines of code in raid5.c in this master-slave
method), but if we call raid1 into the game, the situation goes more
difficult:
- we should transfer the badblock cache at the building of raid1
- the raid1.c should be hacked to make requests for data if the sync
has stopped due to read error and the parent is a raid5 array
- many steps needed to make the change, error handling become more complex

anyway, I try to change my patch to use raid1 personality on this
weekend

> To handle read failures, I would like the first step to be to re-write
> the failed block. I believe most (all?) drives will relocate the
> block if a write cannot succeed at the normal location, so this will
> often fix the problem.
I think it's an easy task, the question is, how can we check if
we have a point to do that. I mean, if we rewrote a bad stripe but
there's no auto reallocation or the drive is already using all of the spare
sectors our write will success due to drives cache but every time when
we reread it we will got back a bad sector and the rewrite over and
over is become pointless..
currently, with my hack, a userspace program can issue a read-write
cycle based on bad sector list in /proc/mdstat and we can hope that
solves the problem. may be an another solution a table with recently
rewritten blocks, if something has appear too often, we put it on a
'total failed' list and never be touched again.. but I'm not sure that
the latest is better.. with badblock tolerance the 'timed rewrite from
userspace' sounds like a good solution, IMHO

> This possible doesn't handle the possibility of a write failing very
> well, but I'm not sure what your approach does in that case. Could
> you explain that?
I also can't do anything with that, if a write fails, the drive'll be
marked failed, immediately



--
dap

-
To unsubscribe from this list: send the line "unsubscribe linux-raid" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html

Re: [PATCH] proactive raid5 disk replacement for 2.6.11, updated

am 18.08.2005 16:13:03 von Pallai Roland

On Thu, 2005-08-18 at 12:24 +0200, Lars Marowsky-Bree wrote:
> On 2005-08-18T15:28:41, Neil Brown wrote:
> > To handle read failures, I would like the first step to be to re-write
> > the failed block. I believe most (all?) drives will relocate the
> > block if a write cannot succeed at the normal location, so this will
> > often fix the problem.
>
> Yes. This would be highly useful.
yes, but I'm not sure that should be handled immediately, see my
previous mail

> > This possible doesn't handle the possibility of a write failing very
> > well, but I'm not sure what your approach does in that case. Could
> > you explain that?
>
> I think a failed write can't really be handled - it might be retried
> once or twice, but then the way to proceed is to kick the drive and
> rebuild the array.
I'm not sure that's a fatal error if that sector isn't readable too.
badblock tolerance comes to play there..

> > It also means that if the raid1 rebuild hits a read-error it cannot
> > cope whereas your code would just reconstruct the block from the rest
> > of the raid5.
>
> Good point. One way to fix this would be to have a callback to one level
> up "Hi, I can't read this section, can you reconstruct and give it to
> me?". (Which is a pretty ugly hack.)
I think it's simpler, just issue a generic read request to the parent,
special callback isn't needed

> However, that would also assume that the data on the disk which _can_ be
> read still can be trusted. I'm not sure I'd buy that myself, untrusted.
> But a periodic background consistency check for RAID might help convince
> users that this is indeed the case ;-)
> If you can no longer pro-actively reconstruct the disk because it has
> indeed failed, maybe treating it like a failed disk and rebuilding the
> array in the "classic" fashion isn't the worst idea, though.
yes, the chance for that will have been forever of course


--
dap

-
To unsubscribe from this list: send the line "unsubscribe linux-raid" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html

Re: [PATCH] proactive raid5 disk replacement for 2.6.11, updated

am 19.08.2005 16:58:31 von Pallai Roland

On Thu, 2005-08-18 at 15:46 +0200, Pallai Roland wrote:
> On Thu, 2005-08-18 at 15:28 +1000, Neil Brown wrote:
> > If we want to mirror a single drive in a raid5 array, I would really
> > like to do that using the raid1 personality.
> > [...]
> the current hack allows too, but using the raid1 personality would be a
> clear solution, I agree. although, I have some doubt.. very simple task
> to mirror a drive (some lines of code in raid5.c in this master-slave
> method), but if we call raid1 into the game, the situation goes more
> difficult:
> - we should transfer the badblock cache at the building of raid1
> - the raid1.c should be hacked to make requests for data if the sync
> has stopped due to read error and the parent is a raid5 array

It's harder than I though first, we must know a lot about the raid5
array (parity algorithm, position of the parity disk in that chunk, etc)
to rebuild an arbitary block of a disk if we have only the full stripe
data by make_request. a very ugly hack if I put it all into the raid1.c,
but if I don't, then a special callback is needed from raid1 to raid5
what asks the rebuilding of n-th chunk of a disk, and I don't know how
could I do it nicely.. maybe should I make a generic ioctl for this?
(what's less ugly, but ugly, too)

in this minute, I can't believe that raid1 should be used for proactive
rebuilding.. it's too complex and no real advantage exclusive of
theory.. Neil, give me a hint please if you've see a good solution


otherwise, I've done with a userspace error handler what's called when
a disk seems like failed (steps over badblock threshold) and that
handles the situation instead of error(). using a userspace error
handler was a good idea, thanks for this. that can make a decision (by
calling mdadm) based on SMART values or whatever:
a., fail the drive and do nothing, the array becomes degraded
b., fail the drive, add a spare, rebuild on the classic way
c., don't fail the drive, add a spare and start proactive rebuilding
d., don't fail the drive, schelude userspace badblock rewriting, raise
the badblock tolerance and everything goes on
e., anything what you want..

I'll release the patch with some new features (eg. userspace badblock
rewriter) after I cleaning up the code a little


--
dap

-
To unsubscribe from this list: send the line "unsubscribe linux-raid" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html

Re: [PATCH] proactive raid5 disk replacement for 2.6.11, updated

am 20.08.2005 17:35:24 von Pallai Roland

--=-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

LS0tIGxpbnV4L2luY2x1ZGUvbGludXgvcmFpZC9tZF9rLmgub3JpZwkyMDA1 LTA4LTIwIDE2OjA1
OjM1LjAwMDAwMDAwMCArMDIwMA0KKysrIGxpbnV4L2luY2x1ZGUvbGludXgv cmFpZC9tZF9rLmgJ
MjAwNS0wOC0xOSAwMzoyNDo1OC4wMDAwMDAwMDAgKzAyMDANCkBAIC0yMTgs NiArMjE4LDExIEBA
DQogCWNoYXIJCQkJdXVpZFsxNl07DQogDQogCXN0cnVjdCBtZGtfdGhyZWFk X3MJCSp0aHJlYWQ7
CS8qIG1hbmFnZW1lbnQgdGhyZWFkICovDQorCXN0cnVjdCBtZGtfdGhyZWFk X3MJCSplZWhfdGhy
ZWFkOwkvKiBleHRlcm5hbCBlcnJvciBoYW5kbGVyICovDQorCXN0cnVjdCBl ZWhfZGF0YSB7DQor
CQlpbnQJCQlmYWlsZWRfbnVtOwkvKiBkcml2ZSAjICovDQorCX0gZWVoX2Rh dGE7DQorDQogCXN0
cnVjdCBtZGtfdGhyZWFkX3MJCSpzeW5jX3RocmVhZDsJLyogZG9pbmcgcmVz eW5jIG9yIHJlY29u
c3RydWN0ICovDQogCXNlY3Rvcl90CQkJY3Vycl9yZXN5bmM7CS8qIGJsb2Nr cyBzY2hlZHVsZWQg
Ki8NCiAJdW5zaWduZWQgbG9uZwkJCXJlc3luY19tYXJrOwkvKiBhIHJlY2Vu dCB0aW1lc3RhbXAg
Ki8NCi0tLSBsaW51eC9pbmNsdWRlL2xpbnV4L3JhaWQvcmFpZDUuaC5vcmln CTIwMDUtMDMtMDMg
MjM6NTE6MjkuMDAwMDAwMDAwICswMTAwDQorKysgbGludXgvaW5jbHVkZS9s aW51eC9yYWlkL3Jh
aWQ1LmgJMjAwNS0wOC0xNCAwMzowMjoxMS4wMDAwMDAwMDAgKzAyMDANCkBA IC0xNDcsNiArMTQ3
LDcgQEANCiAjZGVmaW5lCVI1X1VQVE9EQVRFCTAJLyogcGFnZSBjb250YWlu cyBjdXJyZW50IGRh
dGEgKi8NCiAjZGVmaW5lCVI1X0xPQ0tFRAkxCS8qIElPIGhhcyBiZWVuIHN1 Ym1pdHRlZCBvbiAi
cmVxIiAqLw0KICNkZWZpbmUJUjVfT1ZFUldSSVRFCTIJLyogdG93cml0ZSBj b3ZlcnMgd2hvbGUg
cGFnZSAqLw0KKyNkZWZpbmUJUjVfRkFJTEVECTgJLyogZmFpbGVkIHRvIHJl YWQgdGhpcyBzdHJp
cGUgKi8NCiAvKiBhbmQgc29tZSB0aGF0IGFyZSBpbnRlcm5hbCB0byBoYW5k bGVfc3RyaXBlICov
DQogI2RlZmluZQlSNV9JbnN5bmMJMwkvKiByZGV2ICYmIHJkZXYtPmluX3N5 bmMgYXQgc3RhcnQg
Ki8NCiAjZGVmaW5lCVI1X1dhbnRyZWFkCTQJLyogd2FudCB0byBzY2hlZHVs ZSBhIHJlYWQgKi8N
CkBAIC0xOTYsOCArMTk3LDE2IEBADQogICovDQogIA0KIA0KK3N0cnVjdCBi YWRibG9jayB7DQor
CXN0cnVjdCBiYWRibG9jawkJKmhhc2hfbmV4dCwgKipoYXNoX3BwcmV2OyAv KiBoYXNoIHBvaW50
ZXJzICovDQorCXNlY3Rvcl90CQlzZWN0b3I7IC8qIHN0cmlwZSAjICovDQor fTsNCisNCiBzdHJ1
Y3QgZGlza19pbmZvIHsNCiAJbWRrX3JkZXZfdAkqcmRldjsNCisJc3RydWN0 IGJhZGJsb2NrICoq
YmFkYmxvY2tfaGFzaHRibDsgLyogbGlzdCBvZiBrbm93biBiYWRibG9ja3Mg Ki8NCisJY2hhcgkJ
Y2FjaGVfbmFtZVsyMF07DQorCWttZW1fY2FjaGVfdAkqc2xhYl9jYWNoZTsg LyogYmFkYmxvY2sg
ZGIgKi8NCiB9Ow0KIA0KIHN0cnVjdCByYWlkNV9wcml2YXRlX2RhdGEgew0K QEAgLTIyNCw2ICsy
MzMsOCBAQA0KIAlpbnQJCQlpbmFjdGl2ZV9ibG9ja2VkOwkvKiByZWxlYXNl IG9mIGluYWN0aXZl
IHN0cmlwZXMgYmxvY2tlZCwNCiAJCQkJCQkJICogd2FpdGluZyBmb3IgMjUl IHRvIGJlIGZyZWUN
CiAJCQkJCQkJICovICAgICAgICANCisJaW50CQkJbWlycm9yaXQ7IC8qIHNv dXJjZSBmb3IgYWN0
aXZlIHNwYXJlIHJlc3luYyAqLw0KKw0KIAlzcGlubG9ja190CQlkZXZpY2Vf bG9jazsNCiAJc3Ry
dWN0IGRpc2tfaW5mbwlkaXNrc1swXTsNCiB9Ow0KLS0tIGxpbnV4L2luY2x1 ZGUvbGludXgvc3lz
Y3RsLmgub3JpZwkyMDA1LTA3LTA2IDIwOjE5OjEwLjAwMDAwMDAwMCArMDIw MA0KKysrIGxpbnV4
L2luY2x1ZGUvbGludXgvc3lzY3RsLmgJMjAwNS0wOC0xNyAyMjowMToyOC4w MDAwMDAwMDAgKzAy
MDANCkBAIC03NzgsNyArNzc4LDggQEANCiAvKiAvcHJvYy9zeXMvZGV2L3Jh aWQgKi8NCiBlbnVt
IHsNCiAJREVWX1JBSURfU1BFRURfTElNSVRfTUlOPTEsDQotCURFVl9SQUlE X1NQRUVEX0xJTUlU
X01BWD0yDQorCURFVl9SQUlEX1NQRUVEX0xJTUlUX01BWD0yLA0KKwlERVZf UkFJRF9CQURCTE9D
S19UT0xFUkFOQ0U9Mw0KIH07DQogDQogLyogL3Byb2Mvc3lzL2Rldi9wYXJw b3J0L2RlZmF1bHQg
Ki8NCi0tLSBsaW51eC9kcml2ZXJzL21kL21kLmMub3JpZwkyMDA1LTA4LTE0 IDIxOjIyOjA4LjAw
MDAwMDAwMCArMDIwMA0KKysrIGxpbnV4L2RyaXZlcnMvbWQvbWQuYwkyMDA1 LTA4LTE0IDE3OjIw
OjE1LjAwMDAwMDAwMCArMDIwMA0KQEAgLTc4LDYgKzc4LDEwIEBADQogc3Rh dGljIGludCBzeXNj
dGxfc3BlZWRfbGltaXRfbWluID0gMTAwMDsNCiBzdGF0aWMgaW50IHN5c2N0 bF9zcGVlZF9saW1p
dF9tYXggPSAyMDAwMDA7DQogDQorLyogdGhlIGRyaXZlJ2xsIGJlIG1hcmtl ZCBmYWlsZWQgb3Zl
ciB0aGlzIHRocmVzaG9sZC4gbWVhc3VyZSBpcyBibG9jay4gKi8NCitpbnQg c3lzY3RsX2JhZGJs
b2NrX3RvbGVyYW5jZSA9IDEwMDAwOw0KKw0KKw0KIHN0YXRpYyBzdHJ1Y3Qg Y3RsX3RhYmxlX2hl
YWRlciAqcmFpZF90YWJsZV9oZWFkZXI7DQogDQogc3RhdGljIGN0bF90YWJs ZSByYWlkX3RhYmxl
W10gPSB7DQpAQCAtOTcsNiArMTAxLDE0IEBADQogCQkubW9kZQkJPSAwNjQ0 LA0KIAkJLnByb2Nf
aGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjLA0KIAl9LA0KKwl7DQorCQkuY3Rs X25hbWUJPSBERVZf
UkFJRF9CQURCTE9DS19UT0xFUkFOQ0UsDQorCQkucHJvY25hbWUJPSAiYmFk YmxvY2tfdG9sZXJh
bmNlIiwNCisJCS5kYXRhCQk9ICZzeXNjdGxfYmFkYmxvY2tfdG9sZXJhbmNl LA0KKwkJLm1heGxl
bgkJPSBzaXplb2YoaW50KSwNCisJCS5tb2RlCQk9IDA2NDQsDQorCQkucHJv Y19oYW5kbGVyCT0g
JnByb2NfZG9pbnR2ZWMsDQorCX0sDQogCXsgLmN0bF9uYW1lID0gMCB9DQog fTsNCiANCkBAIC0x
MjU1LDcgKzEyNjcsMTAgQEANCiAJbWRkZXYtPnNiX2RpcnR5ID0gMDsNCiBy ZXBlYXQ6DQogCW1k
ZGV2LT51dGltZSA9IGdldF9zZWNvbmRzKCk7DQotCW1kZGV2LT5ldmVudHMg Kys7DQorCWlmICgh
bWRkZXYtPmVlaF90aHJlYWQpDQorCQkvKiB0aGUgZGF0YSBpc24ndCBtb2Rp ZmllZCBvbiBkaXNr
cyB3aGlsZSB0aGUgZWVoIGlzIHJ1bm5pbmcsDQorCQkgICAgYW5kIHdlIHdh bnQgdG8gbWFrZSBw
b3NzaWJsZSBkaXNrIHJlbW92ZS9hZGQgY3ljbGVzICovDQorCQltZGRldi0+ ZXZlbnRzICsrOw0K
IA0KIAlpZiAoIW1kZGV2LT5ldmVudHMpIHsNCiAJCS8qDQpAQCAtMjE4MSw2 ICsyMTk2LDcgQEAN
CiAJaW50IGVycjsNCiAJdW5zaWduZWQgaW50IHNpemU7DQogCW1ka19yZGV2 X3QgKnJkZXY7DQor
CWludCByZWFkZCA9IDA7DQogDQogCWlmICghbWRkZXYtPnBlcnMpDQogCQly ZXR1cm4gLUVOT0RF
VjsNCkBAIC0yMTk4LDcgKzIyMTQsNDAgQEANCiAJCXJldHVybiAtRUlOVkFM Ow0KIAl9DQogDQot
CXJkZXYgPSBtZF9pbXBvcnRfZGV2aWNlIChkZXYsIC0xLCAwKTsNCisJLyoN CisJICogVHJ5aW5n
IHRvIHJlYWQgc3VwZXJibG9jaywgaWYgaXQgaXMgdXAtdG8tZGF0ZSwgdGhl DQorCSAqICBpbl9z
eW5jIHdpbGwgYmUgc2V0IHRvIGF2b2lkIGZyb20gcG9pbnRsZXNzIHJlYnVp bGQNCisJICovDQor
CXJkZXYgPSBtZF9pbXBvcnRfZGV2aWNlIChkZXYsIDAsIDApOw0KKwlpZiAo SVNfRVJSKHJkZXYp
KQ0KKwkJcmRldiA9IG1kX2ltcG9ydF9kZXZpY2UgKGRldiwgLTEsIDApOw0K KwllbHNlIHsNCisJ
CS8vIHF3ZQ0KKwkJbWRwX3N1cGVyX3QgKnNiID0gKG1kcF9zdXBlcl90ICop cGFnZV9hZGRyZXNz
KHJkZXYtPnNiX3BhZ2UpOw0KKwkJbWRwX3N1cGVyX3QgKnJlZnNiID0gTlVM TDsNCisJCXN0cnVj
dCBsaXN0X2hlYWQgKnRtcDsNCisJCW1ka19yZGV2X3QgKnJkZXZ0Ow0KKwkJ X191NjQgZXYxLCBl
djI7DQorDQorCQlwcmludGsoS0VSTl9JTkZPICJoYXZlIGEgdmFsaWQgc3Vw ZXJibG9ja1xuIik7
DQorCQlldjEgPSBtZF9ldmVudChzYik7DQorCQlJVEVSQVRFX1JERVYobWRk ZXYscmRldnQsdG1w
KSB7DQorCQkJaWYgKHJkZXZ0LT5pbl9zeW5jKSB7DQorCQkJCXJlZnNiID0g KG1kcF9zdXBlcl90
ICopcGFnZV9hZGRyZXNzKHJkZXZ0LT5zYl9wYWdlKTsNCisJCQkJcHJpbnRr KEtFUk5fSU5GTyAi
cmVmZXJlbmNlIGRpc2s6ICVzICglbGx1KSBbJWxsdV1cbiIsIGJkZXZuYW1l KHJkZXZ0LT5iZGV2
LCBiKSwNCisJCQkJCW1kX2V2ZW50KHJlZnNiKSwgZXYxKTsNCisJCQkJLy9i cmVhazsNCisJCQl9
DQorCQl9DQorCQlldjIgPSBtZF9ldmVudChyZWZzYik7DQorDQorCQlpZiAo ZXYxID09IGV2Mikg
ew0KKwkJCXByaW50ayhLRVJOX05PVElDRSAiaG90IGFkZGVkIGRpc2sgaXMg dXB0b2RhdGUgKCVs
bHUpIVxuIiwgZXYyKTsNCisJCQkvKiBjaGVja21lOiB3ZSBtdXN0IGJlIHN1 cmUgaWYgaXQgd2Fz
IHByZXZpb3VzbHkga2lja2VkISAqLw0KKwkJCXJlYWRkKys7DQorCQl9DQor CX0NCisNCiAJaWYg
KElTX0VSUihyZGV2KSkgew0KIAkJcHJpbnRrKEtFUk5fV0FSTklORyANCiAJ CQkibWQ6IGVycm9y
LCBtZF9pbXBvcnRfZGV2aWNlKCkgcmV0dXJuZWQgJWxkXG4iLA0KQEAgLTIy MzEsNyArMjI4MCw3
IEBADQogCQllcnIgPSAtRUlOVkFMOw0KIAkJZ290byBhYm9ydF9leHBvcnQ7 DQogCX0NCi0JcmRl
di0+aW5fc3luYyA9IDA7DQorCXJkZXYtPmluX3N5bmMgPSByZWFkZCA/IDEg OiAwOw0KIAlyZGV2
LT5kZXNjX25yID0gLTE7DQogCWJpbmRfcmRldl90b19hcnJheShyZGV2LCBt ZGRldik7DQogDQpA
QCAtMzUyNSwxMCArMzU3NCwxMiBAQA0KIAkJfQ0KIAkJaWYgKG1kZGV2LT5z eW5jX3RocmVhZCkg
ew0KIAkJCS8qIHJlc3luYyBoYXMgZmluaXNoZWQsIGNvbGxlY3QgcmVzdWx0 ICovDQorcHJpbnRr
KCJtZF9jaGVja19yZWNvdmVyeTogcmVzeW5jIGhhcyBmaW5pc2hlZFxuIik7 DQogCQkJbWRfdW5y
ZWdpc3Rlcl90aHJlYWQobWRkZXYtPnN5bmNfdGhyZWFkKTsNCiAJCQltZGRl di0+c3luY190aHJl
YWQgPSBOVUxMOw0KIAkJCWlmICghdGVzdF9iaXQoTURfUkVDT1ZFUllfRVJS LCAmbWRkZXYtPnJl
Y292ZXJ5KSAmJg0KIAkJCSAgICAhdGVzdF9iaXQoTURfUkVDT1ZFUllfSU5U UiwgJm1kZGV2LT5y
ZWNvdmVyeSkpIHsNCitwcmludGsoIm1kX2NoZWNrX3JlY292ZXJ5OiBhY3Rp dmF0ZSBhbnkgc3Bh
cmVzXG4iKTsNCiAJCQkJLyogc3VjY2Vzcy4uLiovDQogCQkJCS8qIGFjdGl2 YXRlIGFueSBzcGFy
ZXMgKi8NCiAJCQkJbWRkZXYtPnBlcnMtPnNwYXJlX2FjdGl2ZShtZGRldik7 DQpAQCAtMzU0NSwx
OSArMzU5NiwyMCBAQA0KIA0KIAkJLyogbm8gcmVjb3ZlcnkgaXMgcnVubmlu Zy4NCiAJCSAqIHJl
bW92ZSBhbnkgZmFpbGVkIGRyaXZlcywgdGhlbg0KLQkJICogYWRkIHNwYXJl cyBpZiBwb3NzaWJs
ZQ0KKwkJICogYWRkIHNwYXJlcyBpZiBwb3NzaWJsZS4NCisJCSAqIFNwYXJl IGFyZSBhbHNvIHJl
bW92ZWQgYW5kIHJlLWFkZGVkLCB0byBhbGxvdw0KKwkJICogdGhlIHBlcnNv bmFsaXR5IHRvIGZh
aWwgdGhlIHJlLWFkZC4NCiAJCSAqLw0KLQkJSVRFUkFURV9SREVWKG1kZGV2 LHJkZXYscnRtcCkg
ew0KKwkJSVRFUkFURV9SREVWKG1kZGV2LHJkZXYscnRtcCkNCiAJCQlpZiAo cmRldi0+cmFpZF9k
aXNrID49IDAgJiYNCi0JCQkgICAgcmRldi0+ZmF1bHR5ICYmDQorCQkJICAg IChyZGV2LT5mYXVs
dHkgfHwgISByZGV2LT5pbl9zeW5jKSAmJg0KIAkJCSAgICBhdG9taWNfcmVh ZCgmcmRldi0+bnJf
cGVuZGluZyk9PTApIHsNCitwcmludGsoIm1kX2NoZWNrX3JlY292ZXJ5OiBo b3RfcmVtb3ZlX2Rp
c2tcbiIpOw0KIAkJCQlpZiAobWRkZXYtPnBlcnMtPmhvdF9yZW1vdmVfZGlz ayhtZGRldiwgcmRl
di0+cmFpZF9kaXNrKT09MCkNCiAJCQkJCXJkZXYtPnJhaWRfZGlzayA9IC0x Ow0KIAkJCX0NCi0J
CQlpZiAoIXJkZXYtPmZhdWx0eSAmJiByZGV2LT5yYWlkX2Rpc2sgPj0gMCAm JiAhcmRldi0+aW5f
c3luYykNCi0JCQkJc3BhcmVzKys7DQotCQl9DQotCQlpZiAobWRkZXYtPmRl Z3JhZGVkKSB7DQor
DQorCQlpZiAobWRkZXYtPmRlZ3JhZGVkIHx8IG1kZGV2LT5lZWhfdGhyZWFk KSB7DQogCQkJSVRF
UkFURV9SREVWKG1kZGV2LHJkZXYscnRtcCkNCiAJCQkJaWYgKHJkZXYtPnJh aWRfZGlzayA8IDAN
CiAJCQkJICAgICYmICFyZGV2LT5mYXVsdHkpIHsNCkBAIC0zNzY0LDQgKzM4 MTksNiBAQA0KIEVY
UE9SVF9TWU1CT0wobWRfd2FrZXVwX3RocmVhZCk7DQogRVhQT1JUX1NZTUJP TChtZF9wcmludF9k
ZXZpY2VzKTsNCiBFWFBPUlRfU1lNQk9MKG1kX2NoZWNrX3JlY292ZXJ5KTsN CitFWFBPUlRfU1lN
Qk9MKGtpY2tfcmRldl9mcm9tX2FycmF5KTsJLy8gZml4bWUNCitFWFBPUlRf U1lNQk9MKHN5c2N0
bF9iYWRibG9ja190b2xlcmFuY2UpOw0KIE1PRFVMRV9MSUNFTlNFKCJHUEwi KTsNCi0tLSBsaW51
eC9kcml2ZXJzL21kL3JhaWQ1LmMub3JpZwkyMDA1LTA4LTE0IDIxOjIyOjA4 LjAwMDAwMDAwMCAr
MDIwMA0KKysrIGxpbnV4L2RyaXZlcnMvbWQvcmFpZDUuYwkyMDA1LTA4LTE0 IDIwOjQ5OjQ5LjAw
MDAwMDAwMCArMDIwMA0KQEAgLTQwLDYgKzQwLDE4IEBADQogDQogI2RlZmlu ZSBzdHJpcGVfaGFz
aChjb25mLCBzZWN0KQkoKGNvbmYpLT5zdHJpcGVfaGFzaHRibFsoKHNlY3Qp ID4+IFNUUklQRV9T
SElGVCkgJiBIQVNIX01BU0tdKQ0KIA0KKyAvKg0KKyAqIHBlci1kZXZpY2Ug YmFkYmxvY2sgY2Fj
aGUNCisgKi8NCisNCisjZGVmaW5lCUJCX1NISUZUCQkoUEFHRV9TSElGVC8q MTIqLyAtIDkpDQor
I2RlZmluZQlCQl9IQVNIX1BBR0VTCQkxDQorI2RlZmluZQlCQl9OUl9IQVNI CQkoSEFTSF9QQUdF
UyAqIFBBR0VfU0laRSAvIHNpemVvZihzdHJ1Y3QgYmFkYmxvY2sgKikpDQor I2RlZmluZQlCQl9I
QVNIX01BU0sJCShCQl9OUl9IQVNIIC0gMSkNCisNCisjZGVmaW5lCWJiX2hh c2goZGlzaywgc2Vj
dCkJKChkaXNrKS0+YmFkYmxvY2tfaGFzaHRibFsoKHNlY3QpID4+IEJCX1NI SUZUKSAmIEJCX0hB
U0hfTUFTS10pDQorI2RlZmluZQliYl9oYXNobnIoc2VjdCkJCSgoKHNlY3Qp ID4+IEJCX1NISUZU
KSAmIEJCX0hBU0hfTUFTSykNCisNCiAvKiBiaW8ncyBhdHRhY2hlZCB0byBh IHN0cmlwZStkZXZp
Y2UgZm9yIEkvTyBhcmUgbGlua2VkIHRvZ2V0aGVyIGluIGJpX3NlY3Rvcg0K ICAqIG9yZGVyIHdp
dGhvdXQgb3ZlcmxhcC4gIFRoZXJlIG1heSBiZSBzZXZlcmFsIGJpbydzIHBl ciBzdHJpcGUrZGV2
aWNlLCBhbmQNCiAgKiBhIGJpbyBjb3VsZCBzcGFuIHNldmVyYWwgZGV2aWNl cy4NCkBAIC01Myw3
ICs2NSw3IEBADQogLyoNCiAgKiBUaGUgZm9sbG93aW5nIGNhbiBiZSB1c2Vk IHRvIGRlYnVnIHRo
ZSBkcml2ZXINCiAgKi8NCi0jZGVmaW5lIFJBSUQ1X0RFQlVHCTANCisjZGVm aW5lIFJBSUQ1X0RF
QlVHCTENCiAjZGVmaW5lIFJBSUQ1X1BBUkFOT0lBCTENCiAjaWYgUkFJRDVf UEFSQU5PSUEgJiYg
ZGVmaW5lZChDT05GSUdfU01QKQ0KICMgZGVmaW5lIENIRUNLX0RFVkxPQ0so KSBhc3NlcnRfc3Bp
bl9sb2NrZWQoJmNvbmYtPmRldmljZV9sb2NrKQ0KQEAgLTYxLDEzICs3Mywx NjIgQEANCiAjIGRl
ZmluZSBDSEVDS19ERVZMT0NLKCkNCiAjZW5kaWYNCiANCi0jZGVmaW5lIFBS SU5USyh4Li4uKSAo
KHZvaWQpKFJBSUQ1X0RFQlVHICYmIHByaW50ayh4KSkpDQorLyogdXNlIEV4 dGVybmFsIEVycm9y
IEhhbmRsZXI/ICovDQorI2RlZmluZQlVU0VSRUgJCTENCisNCisjZGVmaW5l IFBSSU5USyh4Li4u
KSAoKHZvaWQpKFJBSUQ1X0RFQlVHICYmIHByaW50ayhLRVJOX0RFQlVHIHgp KSkNCiAjaWYgUkFJ
RDVfREVCVUcNCiAjZGVmaW5lIGlubGluZQ0KICNkZWZpbmUgX19pbmxpbmVf Xw0KICNlbmRpZg0K
IA0KIHN0YXRpYyB2b2lkIHByaW50X3JhaWQ1X2NvbmYgKHJhaWQ1X2NvbmZf dCAqY29uZik7DQor
ZXh0ZXJuIGludCBzeXNjdGxfYmFkYmxvY2tfdG9sZXJhbmNlOw0KKw0KKw0K K3N0YXRpYyB2b2lk
IGJiX2luc2VydF9oYXNoKHN0cnVjdCBkaXNrX2luZm8gKmRpc2ssIHN0cnVj dCBiYWRibG9jayAq
YmIpDQorew0KKwlzdHJ1Y3QgYmFkYmxvY2sgKipiYnAgPSAmYmJfaGFzaChk aXNrLCBiYi0+c2Vj
dG9yKTsNCisNCisJLypwcmludGsoImJiX2luc2VydF9oYXNoKCksIHNlY3Rv ciAlbGx1IGhhc2hu
ciAlbHVcbiIsICh1bnNpZ25lZCBsb25nIGxvbmcpYmItPnNlY3RvciwNCisJ CWJiX2hhc2hucihi
Yi0+c2VjdG9yKSk7Ki8NCisNCisJaWYgKChiYi0+aGFzaF9uZXh0ID0gKmJi cCkgIT0gTlVMTCkN
CisJCSgqYmJwKS0+aGFzaF9wcHJldiA9ICZiYi0+aGFzaF9uZXh0Ow0KKwkq YmJwID0gYmI7CQ0K
KwliYi0+aGFzaF9wcHJldiA9IGJicDsNCit9DQorDQorc3RhdGljIHZvaWQg YmJfcmVtb3ZlX2hh
c2goc3RydWN0IGJhZGJsb2NrICpiYikNCit7DQorCS8qcHJpbnRrKCJyZW1v dmVfaGFzaCgpLCBz
ZWN0b3IgJWxsdSBoYXNobnIgJWx1XG4iLCAodW5zaWduZWQgbG9uZyBsb25n KWJiLT5zZWN0b3Is
DQorCQliYl9oYXNobnIoYmItPnNlY3RvcikpOyovDQorDQorCWlmIChiYi0+ aGFzaF9wcHJldikg
ew0KKwkJaWYgKGJiLT5oYXNoX25leHQpDQorCQkJYmItPmhhc2hfbmV4dC0+ aGFzaF9wcHJldiA9
IGJiLT5oYXNoX3BwcmV2Ow0KKwkJKmJiLT5oYXNoX3BwcmV2ID0gYmItPmhh c2hfbmV4dDsNCisJ
CWJiLT5oYXNoX3BwcmV2ID0gTlVMTDsNCisJfQ0KK30NCisNCitzdGF0aWMg c3RydWN0IGJhZGJs
b2NrICpfX2ZpbmRfYmFkYmxvY2soc3RydWN0IGRpc2tfaW5mbyAqZGlzaywg c2VjdG9yX3Qgc2Vj
dG9yKQ0KK3sNCisJc3RydWN0IGJhZGJsb2NrICpiYjsNCisNCisJZm9yIChi YiA9IGJiX2hhc2go
ZGlzaywgc2VjdG9yKTsgYmI7IGJiID0gYmItPmhhc2hfbmV4dCkNCisJCWlm IChiYi0+c2VjdG9y
ID09IHNlY3RvcikNCisJCQlyZXR1cm4gYmI7DQorCXJldHVybiBOVUxMOw0K K30NCisNCitzdGF0
aWMgc3RydWN0IGJhZGJsb2NrICpmaW5kX2JhZGJsb2NrKHN0cnVjdCBkaXNr X2luZm8gKmRpc2ss
IHNlY3Rvcl90IHNlY3RvcikNCit7DQorCXJhaWQ1X2NvbmZfdCAqY29uZiA9 IChyYWlkNV9jb25m
X3QgKikgZGlzay0+cmRldi0+bWRkZXYtPnByaXZhdGU7DQorCXN0cnVjdCBi YWRibG9jayAqYmI7
DQorDQorCXNwaW5fbG9ja19pcnEoJmNvbmYtPmRldmljZV9sb2NrKTsNCisJ YmIgPSBfX2ZpbmRf
YmFkYmxvY2soZGlzaywgc2VjdG9yKTsNCisJc3Bpbl91bmxvY2tfaXJxKCZj b25mLT5kZXZpY2Vf
bG9jayk7DQorCXJldHVybiBiYjsNCit9DQorDQorc3RhdGljIHVuc2lnbmVk IGxvbmcgY291bnRf
YmFkYmxvY2tzIChzdHJ1Y3QgZGlza19pbmZvICpkaXNrKQ0KK3sNCisJcmFp ZDVfY29uZl90ICpj
b25mID0gKHJhaWQ1X2NvbmZfdCAqKSBkaXNrLT5yZGV2LT5tZGRldi0+cHJp dmF0ZTsNCisJc3Ry
dWN0IGJhZGJsb2NrICpiYjsNCisJaW50IGo7DQorCWludCBuID0gMDsNCisN CisJc3Bpbl9sb2Nr
X2lycSgmY29uZi0+ZGV2aWNlX2xvY2spOw0KKwlmb3IgKGogPSAwOyBqIDwg QkJfTlJfSEFTSDsg
aisrKSB7DQorCQliYiA9IGRpc2stPmJhZGJsb2NrX2hhc2h0Ymxbal07DQor CQlmb3IgKDsgYmI7
IGJiID0gYmItPmhhc2hfbmV4dCkNCisJCQluKys7DQorCX0NCisJc3Bpbl91 bmxvY2tfaXJxKCZj
b25mLT5kZXZpY2VfbG9jayk7DQorDQorCXJldHVybiBuOw0KK30NCisNCitz dGF0aWMgaW50IGdy
b3dfYmFkYmxvY2tzKHN0cnVjdCBkaXNrX2luZm8gKmRpc2spDQorew0KKwlj aGFyIGJbQkRFVk5B
TUVfU0laRV07DQorCWttZW1fY2FjaGVfdCAqc2M7DQorDQorCS8qIGhhc2gg dGFibGUgKi8NCisJ
aWYgKChkaXNrLT5iYWRibG9ja19oYXNodGJsID0gKHN0cnVjdCBiYWRibG9j ayAqKikgX19nZXRf
ZnJlZV9wYWdlcyhHRlBfQVRPTUlDLCBIQVNIX1BBR0VTX09SREVSKSkgPT0g TlVMTCkgew0KKwkg
ICAgcHJpbnRrKCJncm93X2JhZGJsb2NrczogX19nZXRfZnJlZV9wYWdlcyBm YWlsZWRcbiIpOw0K
KwkgICAgcmV0dXJuIDA7DQorCX0NCisJbWVtc2V0KGRpc2stPmJhZGJsb2Nr X2hhc2h0YmwsIDAs
IEJCX0hBU0hfUEFHRVMgKiBQQUdFX1NJWkUpOw0KKw0KKwkvKiBiYWRibG9j a3MgZGIgKi8NCisJ
c3ByaW50ZihkaXNrLT5jYWNoZV9uYW1lLCAicmFpZDUvJXNfJXNfYmJjIiwg bWRuYW1lKGRpc2st
PnJkZXYtPm1kZGV2KSwNCisJCQliZGV2bmFtZShkaXNrLT5yZGV2LT5iZGV2 LCBiKSk7DQorCXNj
ID0ga21lbV9jYWNoZV9jcmVhdGUoZGlzay0+Y2FjaGVfbmFtZSwNCisJCQkg ICAgICAgc2l6ZW9m
KHN0cnVjdCBiYWRibG9jayksDQorCQkJICAgICAgIDAsIDAsIE5VTEwsIE5V TEwpOw0KKwlpZiAo
IXNjKSB7DQorCQlwcmludGsoImdyb3dfYmFkYmxvY2tzOiBrbWVtX2NhY2hl X2NyZWF0ZSBmYWls
ZWRcbiIpOw0KKwkJcmV0dXJuIDE7DQorCX0NCisJZGlzay0+c2xhYl9jYWNo ZSA9IHNjOw0KKw0K
KwlyZXR1cm4gMDsNCit9DQorDQorc3RhdGljIHZvaWQgc2hyaW5rX2JhZGJs b2NrcyhzdHJ1Y3Qg
ZGlza19pbmZvICpkaXNrKQ0KK3sNCisJc3RydWN0IGJhZGJsb2NrICpiYjsN CisJaW50IGo7DQor
DQorCS8qIGJhZGJsb2NrcyBkYiAqLw0KKwlmb3IgKGogPSAwOyBqIDwgQkJf TlJfSEFTSDsgaisr
KSB7DQorCQliYiA9IGRpc2stPmJhZGJsb2NrX2hhc2h0Ymxbal07DQorCQlm b3IgKDsgYmI7IGJi
ID0gYmItPmhhc2hfbmV4dCkNCisJCSAgICAgICAga21lbV9jYWNoZV9mcmVl KGRpc2stPnNsYWJf
Y2FjaGUsIGJiKTsNCisJfQ0KKwlrbWVtX2NhY2hlX2Rlc3Ryb3koZGlzay0+ c2xhYl9jYWNoZSk7
DQorCWRpc2stPnNsYWJfY2FjaGUgPSBOVUxMOw0KKw0KKwkvKiBoYXNoIHRh YmxlICovDQorCWZy
ZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpIGRpc2stPmJhZGJsb2NrX2hhc2h0 YmwsIEhBU0hfUEFH
RVNfT1JERVIpOw0KK30NCisNCitzdGF0aWMgdm9pZCBzdG9yZV9iYWRibG9j ayhzdHJ1Y3QgZGlz
a19pbmZvICpkaXNrLCBzZWN0b3JfdCBzZWN0b3IpDQorew0KKwlzdHJ1Y3Qg YmFkYmxvY2sgKmJi
Ow0KKwlyYWlkNV9jb25mX3QgKmNvbmYgPSAocmFpZDVfY29uZl90ICopIGRp c2stPnJkZXYtPm1k
ZGV2LT5wcml2YXRlOw0KKw0KKwliYiA9IGttZW1fY2FjaGVfYWxsb2MoZGlz ay0+c2xhYl9jYWNo
ZSwgR0ZQX0tFUk5FTCk7DQorCWlmICghYmIpIHsNCisJCXByaW50aygic3Rv cmVfYmFkYmxvY2s6
IGttZW1fY2FjaGVfYWxsb2MgZmFpbGVkXG4iKTsNCisJCXJldHVybjsNCisJ fQ0KKwltZW1zZXQo
YmIsIDAsIHNpemVvZigqYmIpKTsNCisJYmItPnNlY3RvciA9IHNlY3RvcjsN CisNCisJc3Bpbl9s
b2NrX2lycSgmY29uZi0+ZGV2aWNlX2xvY2spOw0KKwliYl9pbnNlcnRfaGFz aChkaXNrLCBiYik7
DQorCXNwaW5fdW5sb2NrX2lycSgmY29uZi0+ZGV2aWNlX2xvY2spOw0KK30N CisNCitzdGF0aWMg
dm9pZCBkZWxldGVfYmFkYmxvY2soc3RydWN0IGRpc2tfaW5mbyAqZGlzaywg c2VjdG9yX3Qgc2Vj
dG9yKQ0KK3sNCisJc3RydWN0IGJhZGJsb2NrICpiYjsNCisJcmFpZDVfY29u Zl90ICpjb25mID0g
KHJhaWQ1X2NvbmZfdCAqKSBkaXNrLT5yZGV2LT5tZGRldi0+cHJpdmF0ZTsN CisNCisJYmIgPSBm
aW5kX2JhZGJsb2NrKGRpc2ssIHNlY3Rvcik7DQorCWlmICghYmIpDQorCQkv KiByZXNldCBvbiB3
cml0ZSdsbCBjYWxsIHVzIGxpa2UgYW4gaWRpb3QgOn0gKi8NCisJCXJldHVy bjsNCisJc3Bpbl9s
b2NrX2lycSgmY29uZi0+ZGV2aWNlX2xvY2spOw0KKwliYl9yZW1vdmVfaGFz aChiYik7DQorCWtt
ZW1fY2FjaGVfZnJlZShkaXNrLT5zbGFiX2NhY2hlLCBiYik7DQorCXNwaW5f dW5sb2NrX2lycSgm
Y29uZi0+ZGV2aWNlX2xvY2spOw0KK30NCisNCiANCiBzdGF0aWMgaW5saW5l IHZvaWQgX19yZWxl
YXNlX3N0cmlwZShyYWlkNV9jb25mX3QgKmNvbmYsIHN0cnVjdCBzdHJpcGVf aGVhZCAqc2gpDQog
ew0KQEAgLTIwMSw3ICszNjIsNyBAQA0KIAlzaC0+cGRfaWR4ID0gcGRfaWR4 Ow0KIAlzaC0+c3Rh
dGUgPSAwOw0KIA0KLQlmb3IgKGk9ZGlza3M7IGktLTsgKSB7DQorCWZvciAo aT1kaXNrcysxOyBp
LS07ICkgew0KIAkJc3RydWN0IHI1ZGV2ICpkZXYgPSAmc2gtPmRldltpXTsN CiANCiAJCWlmIChk
ZXYtPnRvcmVhZCB8fCBkZXYtPnRvd3JpdGUgfHwgZGV2LT53cml0dGVuIHx8 DQpAQCAtMjkxLDgg
KzQ1MiwxMCBAQA0KIA0KIAlzcHJpbnRmKGNvbmYtPmNhY2hlX25hbWUsICJy YWlkNS8lcyIsIG1k
bmFtZShjb25mLT5tZGRldikpOw0KIA0KKwkvKiArMTogd2UgbmVlZCBleHRy YSBzcGFjZSBpbiB0
aGUgKnNoLT5kZXZzIGZvciB0aGUgJ2FjdGl2ZSBzcGFyZScgdG8ga2VlcA0K KwkgICAgaGFuZGxl
X3N0cmlwZSgpIHNpbXBsZSAqLw0KIAlzYyA9IGttZW1fY2FjaGVfY3JlYXRl KGNvbmYtPmNhY2hl
X25hbWUsIA0KLQkJCSAgICAgICBzaXplb2Yoc3RydWN0IHN0cmlwZV9oZWFk KSsoZGV2cy0xKSpz
aXplb2Yoc3RydWN0IHI1ZGV2KSwNCisJCQkgICAgICAgc2l6ZW9mKHN0cnVj dCBzdHJpcGVfaGVh
ZCkrKGRldnMtMSsxKSpzaXplb2Yoc3RydWN0IHI1ZGV2KSwNCiAJCQkgICAg ICAgMCwgMCwgTlVM
TCwgTlVMTCk7DQogCWlmICghc2MpDQogCQlyZXR1cm4gMTsNCkBAIC0zMDEs MTIgKzQ2NCwxMiBA
QA0KIAkJc2ggPSBrbWVtX2NhY2hlX2FsbG9jKHNjLCBHRlBfS0VSTkVMKTsN CiAJCWlmICghc2gp
DQogCQkJcmV0dXJuIDE7DQotCQltZW1zZXQoc2gsIDAsIHNpemVvZigqc2gp ICsgKGRldnMtMSkq
c2l6ZW9mKHN0cnVjdCByNWRldikpOw0KKwkJbWVtc2V0KHNoLCAwLCBzaXpl b2YoKnNoKSArIChk
ZXZzLTErMSkqc2l6ZW9mKHN0cnVjdCByNWRldikpOw0KIAkJc2gtPnJhaWRf Y29uZiA9IGNvbmY7
DQogCQlzcGluX2xvY2tfaW5pdCgmc2gtPmxvY2spOw0KIA0KLQkJaWYgKGdy b3dfYnVmZmVycyhz
aCwgY29uZi0+cmFpZF9kaXNrcykpIHsNCi0JCQlzaHJpbmtfYnVmZmVycyhz aCwgY29uZi0+cmFp
ZF9kaXNrcyk7DQorCQlpZiAoZ3Jvd19idWZmZXJzKHNoLCBjb25mLT5yYWlk X2Rpc2tzKzEpKSB7
DQorCQkJc2hyaW5rX2J1ZmZlcnMoc2gsIGNvbmYtPnJhaWRfZGlza3MrMSk7 DQogCQkJa21lbV9j
YWNoZV9mcmVlKHNjLCBzaCk7DQogCQkJcmV0dXJuIDE7DQogCQl9DQpAQCAt MzkxLDEwICs1NTQs
MzcgQEANCiAJCX0NCiAjZWxzZQ0KIAkJc2V0X2JpdChSNV9VUFRPREFURSwg JnNoLT5kZXZbaV0u
ZmxhZ3MpOw0KKwkJY2xlYXJfYml0KFI1X0ZBSUxFRCwgJnNoLT5kZXZbaV0u ZmxhZ3MpOw0KICNl
bmRpZgkJDQogCX0gZWxzZSB7DQorCSAgICBjaGFyIGJbQkRFVk5BTUVfU0la RV07DQorDQorCSAg
ICAvKg0KKwkJcnVsZSAxLiw6IHRyeSB0byBrZWVwIGFsbCBkaXNrIGluX3N5 bmMgZXZlbiBpZiB3
ZSd2ZSBnb3QgcmVhZCBlcnJvcnMsDQorCQljYXVzZSB0aGUgJ2FjdGl2ZSBz cGFyZScgbWF5IGNh
biByZWJ1aWxkIGEgY29tcGxldGUgY29sdW1uIGZyb20NCisJCXBhcnRpYWxs eSBmYWlsZWQgZHJp
dmVzDQorCSAgICAqLw0KKwkgICAgaWYgKGNvbmYtPmRpc2tzW2ldLnJkZXYt PmluX3N5bmMgJiYg
Y29uZi0+d29ya2luZ19kaXNrcyA8IGNvbmYtPnJhaWRfZGlza3MpIHsNCisJ CS8qIGJhZCBuZXdz
LCBidXQga2VlcCBpdCwgY2F1c2UgbWRfZXJyb3IoKSB3b3VsZCBkbyBhIGNv bXBsZXRlDQorCQkg
ICAgYXJyYXkgc2h1dGRvd24sIGV2ZW4gaWYgOTkuOTklIGlzIHVzZWFibGUg Ki8NCisJCXByaW50
ayhLRVJOX0FMRVJUDQorCQkJInJhaWQ1X2VuZF9yZWFkX3JlcXVlc3Q6IFJl YWQgZmFpbHVyZSAl
cyBvbiBzZWN0b3IgJWxsdSAoJWQpIGluIGRlZ3JhZGVkIG1vZGVcbiINCisJ CQksYmRldm5hbWUo
Y29uZi0+ZGlza3NbaV0ucmRldi0+YmRldiwgYiksDQorCQkJKHVuc2lnbmVk IGxvbmcgbG9uZylz
aC0+c2VjdG9yLCBhdG9taWNfcmVhZCgmc2gtPmNvdW50KSk7DQorCQlpZiAo Y29uZi0+bWRkZXYt
PmN1cnJfcmVzeW5jKQ0KKwkJICAgIC8qIHJhaWQ1X2FkZF9kaXNrKCkgd29u J3QgYWNjZXB0IHRo
ZSBzcGFyZSBhZ2FpbiwgYW5kIHdvbid0IGxvb3AgKi8NCisJCSAgICBjb25m LT5tZGRldi0+ZGVn
cmFkZWQgPSAyOw0KKwkgICAgfSBlbHNlIGlmIChjb25mLT5kaXNrc1tpXS5y ZGV2LT5pbl9zeW5j
ICYmIGNvbmYtPndvcmtpbmdfZGlza3MgPj0gY29uZi0+cmFpZF9kaXNrcykg ew0KKwkJLyogd2ls
bCBiZSBjb21wdXRlZCAqLw0KKwkJcHJpbnRrKEtFUk5fQUxFUlQNCisJCQki cmFpZDVfZW5kX3Jl
YWRfcmVxdWVzdDogUmVhZCBmYWlsdXJlICVzIG9uIHNlY3RvciAlbGx1ICgl ZCkgaW4gb3B0aW1h
bCBtb2RlXG4iDQorCQkJLGJkZXZuYW1lKGNvbmYtPmRpc2tzW2ldLnJkZXYt PmJkZXYsIGIpLA0K
KwkJCSh1bnNpZ25lZCBsb25nIGxvbmcpc2gtPnNlY3RvciwgYXRvbWljX3Jl YWQoJnNoLT5jb3Vu
dCkpOw0KKwkgICAgfSBlbHNlDQorCQkvKiBuZXZlciBoYXBwZW5zICovDQog CQltZF9lcnJvcihj
b25mLT5tZGRldiwgY29uZi0+ZGlza3NbaV0ucmRldik7DQotCQljbGVhcl9i aXQoUjVfVVBUT0RB
VEUsICZzaC0+ZGV2W2ldLmZsYWdzKTsNCisJICAgIGNsZWFyX2JpdChSNV9V UFRPREFURSwgJnNo
LT5kZXZbaV0uZmxhZ3MpOw0KKwkgICAgc2V0X2JpdChSNV9GQUlMRUQsICZz aC0+ZGV2W2ldLmZs
YWdzKTsNCiAJfQ0KIAlyZGV2X2RlY19wZW5kaW5nKGNvbmYtPmRpc2tzW2ld LnJkZXYsIGNvbmYt
Pm1kZGV2KTsNCiAjaWYgMA0KQEAgLTQzMCwxMyArNjIwLDE4IEBADQogCVBS SU5USygiZW5kX3dy
aXRlX3JlcXVlc3QgJWxsdS8lZCwgY291bnQgJWQsIHVwdG9kYXRlOiAlZC5c biIsIA0KIAkJKHVu
c2lnbmVkIGxvbmcgbG9uZylzaC0+c2VjdG9yLCBpLCBhdG9taWNfcmVhZCgm c2gtPmNvdW50KSwN
CiAJCXVwdG9kYXRlKTsNCisJLyogc29ycnkNCiAJaWYgKGkgPT0gZGlza3Mp IHsNCiAJCUJVRygp
Ow0KIAkJcmV0dXJuIDA7DQotCX0NCisJfSovDQogDQogCXNwaW5fbG9ja19p cnFzYXZlKCZjb25m
LT5kZXZpY2VfbG9jaywgZmxhZ3MpOw0KIAlpZiAoIXVwdG9kYXRlKQ0KKwkJ LyogIHdlIG11c3Qg
ZmFpbCB0aGlzIGRyaXZlLCBjYXVzZSByaXNrcyB0aGUgaW50ZWdyaXR5IG9m IGRhdGENCisJCSAg
ICBpZiB0aGlzIHNlY3RvciBpcyByZWFkYWJsZS4gbGF0ZXIsIHdlIGNvdWxk IGNoZWNrDQorCQkg
ICAgaXMgaXQgdGhpcyByZWFkYWJsZSwgaWYgbm90LCB0aGVuIHdlIGNhbiBo YW5kbGUgaXQgYXMg
YQ0KKwkJICAgIGNvbW1vbiBiYWRibG9jay4gKi8NCiAJCW1kX2Vycm9yKGNv bmYtPm1kZGV2LCBj
b25mLT5kaXNrc1tpXS5yZGV2KTsNCiANCiAJcmRldl9kZWNfcGVuZGluZyhj b25mLT5kaXNrc1tp
XS5yZGV2LCBjb25mLT5tZGRldik7DQpAQCAtNDY3LDMzICs2NjIsMTUwIEBA DQogCWRldi0+cmVx
LmJpX3ByaXZhdGUgPSBzaDsNCiANCiAJZGV2LT5mbGFncyA9IDA7DQotCWlm IChpICE9IHNoLT5w
ZF9pZHgpDQorCWlmIChpICE9IHNoLT5wZF9pZHggJiYgaSA8IHNoLT5yYWlk X2NvbmYtPnJhaWRf
ZGlza3MpCS8qIGFjdGl2ZSBzcGFyZT8gKi8NCiAJCWRldi0+c2VjdG9yID0g Y29tcHV0ZV9ibG9j
a25yKHNoLCBpKTsNCiB9DQogDQorc3RhdGljIGludCByYWlkNV9yZW1vdmVf ZGlzayhtZGRldl90
ICptZGRldiwgaW50IG51bWJlcik7DQorc3RhdGljIGludCByYWlkNV9hZGRf ZGlzayhtZGRldl90
ICptZGRldiwgbWRrX3JkZXZfdCAqcmRldik7DQorLypzdGF0aWMqLyB2b2lk IGtpY2tfcmRldl9m
cm9tX2FycmF5KG1ka19yZGV2X3QgKiByZGV2KTsNCiBzdGF0aWMgdm9pZCBl cnJvcihtZGRldl90
ICptZGRldiwgbWRrX3JkZXZfdCAqcmRldikNCiB7DQogCWNoYXIgYltCREVW TkFNRV9TSVpFXTsN
CisJY2hhciBiMltCREVWTkFNRV9TSVpFXTsNCiAJcmFpZDVfY29uZl90ICpj b25mID0gKHJhaWQ1
X2NvbmZfdCAqKSBtZGRldi0+cHJpdmF0ZTsNCiAJUFJJTlRLKCJyYWlkNTog ZXJyb3IgY2FsbGVk
XG4iKTsNCiANCiAJaWYgKCFyZGV2LT5mYXVsdHkpIHsNCi0JCW1kZGV2LT5z Yl9kaXJ0eSA9IDE7
DQotCQlpZiAocmRldi0+aW5fc3luYykgew0KLQkJCWNvbmYtPndvcmtpbmdf ZGlza3MtLTsNCi0J
CQltZGRldi0+ZGVncmFkZWQrKzsNCi0JCQljb25mLT5mYWlsZWRfZGlza3Mr KzsNCi0JCQlyZGV2
LT5pbl9zeW5jID0gMDsNCi0JCQkvKg0KLQkJCSAqIGlmIHJlY292ZXJ5IHdh cyBydW5uaW5nLCBt
YWtlIHN1cmUgaXQgYWJvcnRzLg0KLQkJCSAqLw0KLQkJCXNldF9iaXQoTURf UkVDT1ZFUllfRVJS
LCAmbWRkZXYtPnJlY292ZXJ5KTsNCi0JCX0NCi0JCXJkZXYtPmZhdWx0eSA9 IDE7DQotCQlwcmlu
dGsgKEtFUk5fQUxFUlQNCi0JCQkicmFpZDU6IERpc2sgZmFpbHVyZSBvbiAl cywgZGlzYWJsaW5n
IGRldmljZS4iDQotCQkJIiBPcGVyYXRpb24gY29udGludWluZyBvbiAlZCBk ZXZpY2VzXG4iLA0K
LQkJCWJkZXZuYW1lKHJkZXYtPmJkZXYsYiksIGNvbmYtPndvcmtpbmdfZGlz a3MpOw0KKwkJaW50
IG1kZGlza3MgPSAwOw0KKwkJbWRrX3JkZXZfdCAqcmQ7DQorCQltZGtfcmRl dl90ICpyZGV2cyA9
IE5VTEw7DQorCQlzdHJ1Y3QgbGlzdF9oZWFkICpydG1wOw0KKwkJaW50IGk7 DQorDQorCQlJVEVS
QVRFX1JERVYobWRkZXYscmQscnRtcCkNCisJCSAgICB7DQorCQkJcHJpbnRr KEtFUk5fSU5GTyAi
bWRkZXYlZDogJXNcbiIsIG1kZGlza3MsIGJkZXZuYW1lKHJkLT5iZGV2LGIp KTsNCisJCQltZGRp
c2tzKys7DQorCQkgICAgfQ0KKwkJZm9yIChpID0gMDsgKHJkID0gY29uZi0+ ZGlza3NbaV0ucmRl
dik7IGkrKykgew0KKwkJCXByaW50ayhLRVJOX0lORk8gInI1ZGV2JWQ6ICVz XG4iLCBpLCBiZGV2
bmFtZShyZC0+YmRldixiKSk7DQorCQl9DQorCQlJVEVSQVRFX1JERVYobWRk ZXYscmQscnRtcCkN
CisJCSAgICB7DQorCQkJcmRldnMgPSByZDsNCisJCQlicmVhazsNCisJCSAg ICB9DQorcHJpbnRr
KCIlZCAlZCA+ICVkICVkIGluczolZCAlcFxuIiwNCisJbWRkZXYtPnJhaWRf ZGlza3MsIG1kZGlz
a3MsIGNvbmYtPnJhaWRfZGlza3MsIG1kZGV2LT5kZWdyYWRlZCwgcmRldi0+ aW5fc3luYywgcmRl
dnMpOw0KKwkJaWYgKGNvbmYtPmRpc2tzW2NvbmYtPnJhaWRfZGlza3NdLnJk ZXYgPT0gcmRldiAm
JiByZGV2LT5pbl9zeW5jKSB7DQorCQkgICAgLyogaW5fc3luYywgYnV0IG11 c3QgYmUgaGFuZGxl
ZCBzcGVjaWFsbHksIGRvbid0IGxldCAnZGVncmFkZWQrKycgKi8NCisJCSAg ICBwcmludGsgKEtF
Uk5fQUxFUlQgImFjdGl2ZSBzcGFyZSBoYXMgZmFpbGVkICVzIChpbl9zeW5j KVxuIiwNCisJCQkJ
YmRldm5hbWUocmRldi0+YmRldixiKSk7DQorCQkgICAgbWRkZXYtPnNiX2Rp cnR5ID0gMTsNCisJ
CSAgICByZGV2LT5pbl9zeW5jID0gMDsNCisJCSAgICByZGV2LT5mYXVsdHkg PSAxOw0KKwkJICAg
IHJkZXYtPnJhaWRfZGlzayA9IGNvbmYtPnJhaWRfZGlza3M7CQkvKiBtZSBh cyBteXNlbGYsIGFn
YWluIDspICovDQorCQkgICAgY29uZi0+bWlycm9yaXQgPSAtMTsNCisJCX0g ZWxzZSBpZiAobWRk
aXNrcyA+IGNvbmYtPnJhaWRfZGlza3MgJiYgIW1kZGV2LT5kZWdyYWRlZCAm JiByZGV2LT5pbl9z
eW5jKSB7DQorCQkgICAgLyogaGF2ZSBhY3RpdmUgc3BhcmUsIGFycmF5IGlz IG9wdGltYWwsIHJl
bW92ZWQgZGlzayBtZW1iZXINCisJCQkgICAgb2YgaXQgKGJ1dCBub3QgdGhl IGFjdGl2ZSBzcGFy
ZSkgKi8NCisJCSAgICBpZiAocmRldi0+cmFpZF9kaXNrID09IGNvbmYtPm1p cnJvcml0ICYmIGNv
bmYtPmRpc2tzW2NvbmYtPnJhaWRfZGlza3NdLnJkZXYpIHsNCisJCQlpZiAo IWNvbmYtPmRpc2tz
W2NvbmYtPnJhaWRfZGlza3NdLnJkZXYtPmluX3N5bmMpIHsNCisJCQkgICAg cHJpbnRrKEtFUk5f
QUxFUlQgImRpc2sgJXMgZmFpbGVkIGFuZCBhY3RpdmUgc3BhcmUgaXNuJ3Qg aW5fc3luYyB5ZXQs
IHJlYWRkIGFzIG5vcm1hbCBzcGFyZVxuIiwNCisJCQkJCWJkZXZuYW1lKHJk ZXYtPmJkZXYsYikp
Ow0KKwkJCSAgICBjb25mLT5taXJyb3JpdCA9IC0xOw0KKwkJCSAgICBnb3Rv IGxldGl0Z287DQor
CQkJfSBlbHNlIHsNCisJCQkgICAgaW50IHJldDsNCisNCisJCQkgICAgLyog aG90IHJlcGxhY2Ug
dGhlIG1pcnJvcmVkIGRyaXZlIHdpdGggdGhlICdhY3RpdmUgc3BhcmUnDQor CQkJCXRoaXMgaXMg
cmVhbGx5ICJob3QiLCBJIGNhbid0IHNlZSBjbGVhcmx5IHRoZSB0aGluZ3MN CisJCQkJd2hhdCBJ
IGhhdmUgdG8gZG8gaGVyZS4gOn0NCisJCQkJcHJheS4gKi8NCisNCisJCQkg ICAgcHJpbnRrKEtF
Uk5fQUxFUlQgInJlcGxhY2UgJXMgd2l0aCBpbl9zeW5jIGFjdGl2ZSBzcGFy ZSAlc1xuIiwNCisJ
CQkJICAgIGJkZXZuYW1lKHJkZXYtPmJkZXYsYiksDQorCQkJCSAgICBiZGV2 bmFtZShyZGV2cy0+
YmRldixiMikpOw0KKwkJCSAgICByZGV2LT5pbl9zeW5jID0gMDsNCisJCQkg ICAgcmRldi0+ZmF1
bHR5ID0gMTsNCisNCisJCQkgICAgY29uZi0+bWlycm9yaXQgPSAtMTsNCisN CisJCQkgICAgLyog
bXkgR29kLCBhbSBJIHNhbmU/ICovDQorCQkJICAgIHdoaWxlICgoaSA9IGF0 b21pY19yZWFkKCZy
ZGV2LT5ucl9wZW5kaW5nKSkpIHsNCisJCQkJcHJpbnRrKCJ3YWl0aW5nIGZv ciBkaXNrICVkIC4u
ICVkXG4iLA0KKwkJCQkJcmRldi0+cmFpZF9kaXNrLCBpKTsNCisJCQkgICAg fQ0KKwkJCSAgICBy
ZXQgPSByYWlkNV9yZW1vdmVfZGlzayhtZGRldiwgcmRldi0+cmFpZF9kaXNr KTsNCisJCQkgICAg
aWYgKHJldCkgew0KKwkJCQlwcmludGsoS0VSTl9FUlIgInJhaWQ1X3JlbW92 ZV9kaXNrMTogYnVz
eT8hXG4iKTsNCisJCQkJcmV0dXJuOwkvLyBzaG91bGQgbm90aGluZyB0byBk bw0KKwkJCSAgICB9
DQorDQorCQkJICAgIHJkID0gY29uZi0+ZGlza3NbY29uZi0+cmFpZF9kaXNr c10ucmRldjsNCisJ
CQkgICAgd2hpbGUgKChpID0gYXRvbWljX3JlYWQoJnJkLT5ucl9wZW5kaW5n KSkpIHsNCisJCQkJ
cHJpbnRrKCJ3YWl0aW5nIGZvciBkaXNrICVkIC4uICVkXG4iLA0KKwkJCQkJ Y29uZi0+cmFpZF9k
aXNrcywgaSk7DQorCQkJICAgIH0NCisJCQkgICAgcmQtPmluX3N5bmMgPSAw Ow0KKwkJCSAgICBy
ZXQgPSByYWlkNV9yZW1vdmVfZGlzayhtZGRldiwgY29uZi0+cmFpZF9kaXNr cyk7DQorCQkJICAg
IGlmIChyZXQpIHsNCisJCQkJcHJpbnRrKEtFUk5fRVJSICJyYWlkNV9yZW1v dmVfZGlzazI6IGJ1
c3k/IVxuIik7DQorCQkJCXJldHVybjsJLy8gLi4NCisJCQkgICAgfQ0KKw0K KwkJCSAgICByZXQg
PSByYWlkNV9hZGRfZGlzayhtZGRldiwgcmQpOw0KKwkJCSAgICBpZiAoIXJl dCkgew0KKwkJCQlw
cmludGsoS0VSTl9FUlIgInJhaWQ1X2FkZF9kaXNrOiBubyBmcmVlIHNsb3Q/ IVxuIik7DQorCQkJ
CXJldHVybjsJLy8gLi4NCisJCQkgICAgfQ0KKwkJCSAgICByZC0+aW5fc3lu YyA9IDE7DQorDQor
CQkJICAgIC8qIGJvcnJvd2VkIGZyb20gaG90X3JlbW92ZV9kaXNrKCkgKi8N CisJCQkgICAga2lj
a19yZGV2X2Zyb21fYXJyYXkocmRldik7DQorCQkJICAgIG1kZGV2LT5zYl9k aXJ0eSA9IDE7DQor
CQkJfQ0KKwkJICAgIH0gZWxzZSB7DQorCQkJLyogaW5fc3luYyBkaXNrIGZh aWxlZCAoIWRlZ3Jh
ZGVkKSwgaGF2ZSBhIHNwYXJlLCBzdGFydGluZw0KKwkJCSAgICBwcm9hY3Rp dmUgbWlycm9yaW5n
ICovDQorCQkJcHJpbnRrKEtFUk5fQUxFUlQgInJlc3luYyBmcm9tICVzIHRv IHNwYXJlICVzICgl
ZClcbiIsDQorCQkJCWJkZXZuYW1lKHJkZXYtPmJkZXYsYiksDQorCQkJICAg ICAgICBiZGV2bmFt
ZShyZGV2cy0+YmRldixiMiksDQorCQkJCWNvbmYtPnJhaWRfZGlza3MpOw0K KwkJCWlmIChjb25m
LT5taXJyb3JpdCA9PSAtMSkgew0KKwkJCQljb25mLT5taXJyb3JpdCA9IHJk ZXYtPnJhaWRfZGlz
azsNCisNCisJCQkJbWRkZXYtPmRlZ3JhZGVkKys7CS8qIHRvIGNhbGwgcmFp ZDVfaG90X2FkZF9k
aXNrKCksIHJlc2V0IHRoZXJlICovDQorCQkJfSBlbHNlIHsNCisJCQkJcHJp bnRrKEtFUk5fQUxF
UlQgInByb2FjdGl2ZSBtaXJyb3JpbmcgYWxyZWFkeSBydW5uaW5nLCBsZXQg aXQgZ28uLlxuIik7
DQorCQkJCWdvdG8gbGV0aXRnbzsNCisJCQl9DQorCQkgICAgfQ0KKwkJfSBl bHNlDQorCQl7DQor
bGV0aXRnbzoNCisJCSAgICBtZGRldi0+c2JfZGlydHkgPSAxOw0KKwkJICAg IGlmIChyZGV2LT5p
bl9zeW5jKSB7DQorCQkJICAgIGNvbmYtPndvcmtpbmdfZGlza3MtLTsNCisJ CQkgICAgbWRkZXYt
PmRlZ3JhZGVkKys7DQorCQkJICAgIGNvbmYtPmZhaWxlZF9kaXNrcysrOw0K KwkJCSAgICByZGV2
LT5pbl9zeW5jID0gMDsNCisJCQkgICAgaWYgKGNvbmYtPm1pcnJvcml0ICE9 IC0xKSB7DQorCQkJ
CSAgICBwcmludGsoInN0b3AgcHJvYWN0aXZlIG1pcnJvcmluZ1xuIik7DQor CQkJCSAgICBjb25m
LT5taXJyb3JpdCA9IC0xOw0KKwkJCSAgICB9DQorCQkJICAgIC8qDQorCQkJ ICAgICAqIGlmIHJl
Y292ZXJ5IHdhcyBydW5uaW5nLCBtYWtlIHN1cmUgaXQgYWJvcnRzLg0KKwkJ CSAgICAgKi8NCisJ
CQkgICAgc2V0X2JpdChNRF9SRUNPVkVSWV9FUlIsICZtZGRldi0+cmVjb3Zl cnkpOw0KKwkJICAg
IH0NCisJCSAgICByZGV2LT5mYXVsdHkgPSAxOw0KKwkJICAgIHByaW50ayAo S0VSTl9BTEVSVA0K
KwkJCSAgICAicmFpZDU6IERpc2sgZmFpbHVyZSBvbiAlcywgZGlzYWJsaW5n IGRldmljZS4iDQor
CQkJICAgICIgT3BlcmF0aW9uIGNvbnRpbnVpbmcgb24gJWQgZGV2aWNlc1xu IiwNCisJCQkgICAg
YmRldm5hbWUocmRldi0+YmRldixiKSwgY29uZi0+d29ya2luZ19kaXNrcyk7 DQorCQl9DQogCX0N
CiB9CQ0KIA0KQEAgLTg1OSw2ICsxMTcxLDYyIEBADQogfQ0KIA0KIA0KK3N0 YXRpYyBpbnQgcmFp
ZDVfc3BhcmVfYWN0aXZlKG1kZGV2X3QgKm1kZGV2KTsNCisNCitzdGF0aWMg dm9pZCByYWlkNV9l
ZWggKG1kZGV2X3QgKm1kZGV2KQ0KK3sNCisJcmFpZDVfY29uZl90ICpjb25m ID0gbWRkZXZfdG9f
Y29uZihtZGRldik7DQorCWludCBpID0gY29uZi0+bWRkZXYtPmVlaF9kYXRh LmZhaWxlZF9udW07
DQorCXN0cnVjdCBkaXNrX2luZm8gKmRpc2sgPSAmY29uZi0+ZGlza3NbaV07 DQorCWludCBqOw0K
Kw0KKwkvKiBzdXNwZW5kIElPOyB0b2RvOiB3ZWxsLCB3ZSBzaG91bGQgd2Fs ayBvdmVyIG9uIGRp
c2tzIGFuZCB3YWl0aW5nIHRpbGwNCisJICAgIChucl9wZW5kaW5nID4gMCkg Ki8NCisJcHJpbnRr
KCJyYWlkNV91c2VyZWggYWN0aXZlXG4iKTsNCisJew0KKwkgICAgY2hhciBi W0JERVZOQU1FX1NJ
WkVdOw0KKwkgICAgY2hhciAqYXJndltdID0geyAiL3NiaW4vbWRldmVudCIs IG1kbmFtZShtZGRl
diksICJkcml2ZWZhaWwiLA0KKwkJCQliZGV2bmFtZShkaXNrLT5yZGV2LT5i ZGV2LCBiKSwgTlVM
TCB9Ow0KKwkgICAgc3RhdGljIGNoYXIgKmVudnBbXSA9IHsgIkhPTUU9LyIs DQorCQkJICAgICJU
RVJNPWxpbnV4IiwNCisJCQkgICAgIlBBVEg9L3NiaW46L3Vzci9zYmluOi9i aW46L3Vzci9iaW4i
LA0KKwkJCSAgICBOVUxMIH07DQorCSAgICBpbnQgcmV0Ow0KKw0KKwkgICAg cmV0ID0gY2FsbF91
c2VybW9kZWhlbHBlcigiL3NiaW4vbWRldmVudCIsIGFyZ3YsIGVudnAsIDEv KndhaXQqLyk7DQor
CSAgICByZXQgPSByZXQgPj4gODsNCisJICAgIGlmIChyZXQgPCAwIHx8IHJl dCA+IDEpIHsNCisJ
CSAgICBwcmludGsoS0VSTl9BTEVSVCAiL3NiaW4vbWRldmVudCBmYWlsZWQ6 ICVkXG4iLCByZXQp
Ow0KKwkJICAgIG1kX2Vycm9yKG1kZGV2LCBkaXNrLT5yZGV2KTsNCisJCSAg ICAvKiAodGhlIHJh
aWQ1X3JlbW92ZV9kaXNrIGFuZCByYWlkNV9hZGRfZGlzayB3YXNuJ3QgY2Fs bGVkIHlldCkgKi8N
CisJICAgIH0NCisNCisJICAgIHN3aXRjaCAocmV0KSB7DQorCQljYXNlIDE6 CQkvKiByZXNldCBi
YWRibG9jayBjYWNoZSAobGF0ZXI6IHJld3JpdGUgYmFkIGJsb2Nrcz8pICov DQorCQkgICAgcHJp
bnRrKEtFUk5fSU5GTyAicmVzZXR0aW5nIGJhZGJsb2NrcyBjYWNoZVxuIik7 DQorCQkgICAgZm9y
IChqID0gMDsgaiA8IEJCX05SX0hBU0g7IGorKykgew0KKwkJCSAgICBzdHJ1 Y3QgYmFkYmxvY2sg
KmJiLCAqYmJwcmV2ID0gTlVMTDsNCisJCQkgICAgYmIgPSBkaXNrLT5iYWRi bG9ja19oYXNodGJs
W2pdOw0KKwkJCSAgICBmb3IgKDsgYmI7IGJiID0gYmItPmhhc2hfbmV4dCkg ew0KKwkJCQkgICAg
aWYgKGJicHJldikNCisJCQkJCSAgICBrbWVtX2NhY2hlX2ZyZWUoZGlzay0+ c2xhYl9jYWNoZSwg
YmJwcmV2KTsNCisJCQkJICAgIGJiX3JlbW92ZV9oYXNoKGJiKTsNCisJCQkJ ICAgIGJicHJldiA9
IGJiOw0KKwkJCSAgICB9DQorCQkJICAgIGlmIChiYnByZXYpDQorCQkJCSAg ICBrbWVtX2NhY2hl
X2ZyZWUoZGlzay0+c2xhYl9jYWNoZSwgYmJwcmV2KTsNCisJCSAgICB9DQor CQkgICAgYnJlYWs7
DQorCQlkZWZhdWx0Og0KKwkJICAgIGJyZWFrOw0KKwkgICAgfQ0KKw0KKwkg ICAgbWRkZXYtPmVl
aF9kYXRhLmZhaWxlZF9udW0gPSAtMTsJLyogdW5yZWdpc3RlciBtZSAqLw0K KwkgICAgbWRfd2Fr
ZXVwX3RocmVhZChtZGRldi0+dGhyZWFkKTsNCisJfQ0KKwlwcmludGsoInJh aWQ1X3VzZXJlaCBl
eGl0ZWRcbiIpOw0KK30NCisNCiAvKg0KICAqIGhhbmRsZV9zdHJpcGUgLSBk byB0aGluZ3MgdG8g
YSBzdHJpcGUuDQogICoNCkBAIC04ODgsMjEgKzEyNTYsMzcgQEANCiAJaW50 IGxvY2tlZD0wLCB1
cHRvZGF0ZT0wLCB0b19yZWFkPTAsIHRvX3dyaXRlPTAsIGZhaWxlZD0wLCB3 cml0dGVuPTA7DQog
CWludCBub25fb3ZlcndyaXRlID0gMDsNCiAJaW50IGZhaWxlZF9udW09MDsN CisJaW50IGFzcGFy
ZT0wLCBhc3BhcmVudW09LTE7DQorCXN0cnVjdCBkaXNrX2luZm8gKmFzcGFy ZWRldjsNCiAJc3Ry
dWN0IHI1ZGV2ICpkZXY7DQogDQogCVBSSU5USygiaGFuZGxpbmcgc3RyaXBl ICVsbHUsIGNudD0l
ZCwgcGRfaWR4PSVkXG4iLA0KIAkJKHVuc2lnbmVkIGxvbmcgbG9uZylzaC0+ c2VjdG9yLCBhdG9t
aWNfcmVhZCgmc2gtPmNvdW50KSwNCiAJCXNoLT5wZF9pZHgpOw0KIA0KKwlp ZiAoY29uZi0+bWRk
ZXYtPmVlaF90aHJlYWQpIHsNCisJCVBSSU5USygicGFzcyB0aGUgc3RyaXBl LCBlZWggaXMgYWN0
aXZlXG4iKTsNCisJCXNldF9iaXQoU1RSSVBFX0hBTkRMRSwgJnNoLT5zdGF0 ZSk7DQorCSAgICAg
ICAgcmV0dXJuOw0KKwl9DQorDQogCXNwaW5fbG9jaygmc2gtPmxvY2spOw0K IAljbGVhcl9iaXQo
U1RSSVBFX0hBTkRMRSwgJnNoLT5zdGF0ZSk7DQogCWNsZWFyX2JpdChTVFJJ UEVfREVMQVlFRCwg
JnNoLT5zdGF0ZSk7DQogDQogCXN5bmNpbmcgPSB0ZXN0X2JpdChTVFJJUEVf U1lOQ0lORywgJnNo
LT5zdGF0ZSk7DQorCWFzcGFyZWRldiA9ICZjb25mLT5kaXNrc1tjb25mLT5y YWlkX2Rpc2tzXTsN
CisJaWYgKCFjb25mLT5tZGRldi0+ZGVncmFkZWQgJiYgYXNwYXJlZGV2LT5y ZGV2ICYmICFhc3Bh
cmVkZXYtPnJkZXYtPmZhdWx0eSAmJg0KKwkJY29uZi0+bWlycm9yaXQgIT0g LTEpIHsNCisJICAg
IGFzcGFyZSsrOw0KKwkgICAgYXNwYXJlbnVtID0gc2gtPnJhaWRfY29uZi0+ bWlycm9yaXQ7DQor
CSAgICBQUklOVEsoImhhcyBhc3BhcmUgKCVkKVxuIiwgYXNwYXJlbnVtKTsN CisJfQ0KIAkvKiBO
b3cgdG8gbG9vayBhcm91bmQgYW5kIHNlZSB3aGF0IGNhbiBiZSBkb25lICov DQogDQotCWZvciAo
aT1kaXNrczsgaS0tOyApIHsNCisJZm9yIChpPWRpc2tzK2FzcGFyZTsgaS0t OyApIHsNCiAJCW1k
a19yZGV2X3QgKnJkZXY7DQorCQlzdHJ1Y3QgYmFkYmxvY2sgKmJiID0gTlVM TDsNCiAJCWRldiA9
ICZzaC0+ZGV2W2ldOw0KIAkJY2xlYXJfYml0KFI1X0luc3luYywgJmRldi0+ ZmxhZ3MpOw0KIAkJ
Y2xlYXJfYml0KFI1X1N5bmNpbywgJmRldi0+ZmxhZ3MpOw0KQEAgLTk0NSwx MiArMTMyOSw2MiBA
QA0KIAkJfQ0KIAkJaWYgKGRldi0+d3JpdHRlbikgd3JpdHRlbisrOw0KIAkJ cmRldiA9IGNvbmYt
PmRpc2tzW2ldLnJkZXY7IC8qIEZJWE1FLCBzaG91bGQgSSBiZSBsb29raW5n IHJkZXYgKi8NCi0J
CWlmICghcmRldiB8fCAhcmRldi0+aW5fc3luYykgew0KKwkJaWYgKHJkZXYg JiYgcmRldi0+aW5f
c3luYyAmJg0KKwkJICAgICF0ZXN0X2JpdChSNV9VUFRPREFURSwgJmRldi0+ ZmxhZ3MpICYmDQor
CQkgICAgIXRlc3RfYml0KFI1X0xPQ0tFRCwgJmRldi0+ZmxhZ3MpKSB7DQor CQkJLyogLi5wb3Rl
bnRpYWxseSBkZXNlcnZlZCB0byByZWFkLCB3ZSBtdXN0IGNoZWNrIGl0DQor CQkJICAgIGNoZWNr
bWUsIGl0IGNvdWxkIGJlIGEgYmlnIHBlcmZvcm1hbmNlIHBlbmFsdHkgaWYg Y2FsbGVkDQorCQkJ
CXdpdGhvdXQgYSBnb29kIHJlYXNvbiEgaXQncyBzZWVtcyBvayBmb3Igbm93 DQorCQkJKi8NCisJ
CQlQUklOVEsoImZpbmRfYmFkYmxvY2sgJWQ6ICVsbHVcbiIsIGksIHNoLT5z ZWN0b3IpOw0KKwkJ
CWJiID0gZmluZF9iYWRibG9jaygmY29uZi0+ZGlza3NbaV0sIHNoLT5zZWN0 b3IpOw0KKwkJfQ0K
KwkJaWYgKCFyZGV2IHx8ICFyZGV2LT5pbl9zeW5jDQorCQkgICAgfHwgKHRl c3RfYml0KFI1X0ZB
SUxFRCwgJmRldi0+ZmxhZ3MpICYmICF0ZXN0X2JpdChSNV9VUFRPREFURSwg JmRldi0+ZmxhZ3Mp
KQ0KKwkJICAgIHx8IGJiKSB7DQorCQkJaWYgKHJkZXYgJiYgcmRldi0+aW5f c3luYw0KKwkJCSAg
ICAmJiAhYmIgJiYgdGVzdF9iaXQoUjVfRkFJTEVELCAmZGV2LT5mbGFncykp IHsNCisJCQkJLyog
dGFrZSBhbiBhY3Rpb24gb25seSBpZiBpdCdzIGEgX25ld18gYmFkIGJsb2Nr DQorCQkJCSAgICBh
bmQgbm90IHdoaWxlIHByb2FjdGl2ZSBtaXJyb3JpbmcgaXMgcnVubmluZyAq Lw0KKwkJCQlpZiAo
KCFhc3BhcmUgfHwgKGFzcGFyZSAmJiBhc3BhcmVkZXYtPnJkZXYtPmluX3N5 bmMvKmFzcGFyZW51
bSAhPSBpKi8pKQ0KKwkJCQkgICAgJiYgY291bnRfYmFkYmxvY2tzKCZjb25m LT5kaXNrc1tpXSkg
Pj0gc3lzY3RsX2JhZGJsb2NrX3RvbGVyYW5jZSkgew0KKwkJCQkJY2hhciBi W0JERVZOQU1FX1NJ
WkVdOw0KKw0KKwkJCQkJcHJpbnRrKEtFUk5fQUxFUlQgInRvbyBtYW55IGJh ZGJsb2NrcyAoJWx1
KSBvbiBkZXZpY2UgJXMsIG1hcmtpbmcgYXMgZmFpbGVkIFslZF1cbiIsDQor CQkJCQkJICAgIGNv
dW50X2JhZGJsb2NrcygmY29uZi0+ZGlza3NbaV0pICsgMSwgYmRldm5hbWUo Y29uZi0+ZGlza3Nb
aV0ucmRldi0+YmRldiwgYiksDQorCQkJCQkJICAgIGF0b21pY19yZWFkKCZy ZGV2LT5ucl9wZW5k
aW5nKSk7DQorI2lmbmRlZiBVU0VSRUgNCisJCQkJCW1kX2Vycm9yKGNvbmYt Pm1kZGV2LCBjb25m
LT5kaXNrc1tpXS5yZGV2KTsNCisjZWxzZQ0KKwkJCQkJaWYgKCFjb25mLT5t ZGRldi0+ZWVoX3Ro
cmVhZCkgew0KKwkJCQkJICAgIGNvbmYtPm1kZGV2LT5lZWhfdGhyZWFkID0g bWRfcmVnaXN0ZXJf
dGhyZWFkKHJhaWQ1X2VlaCwgY29uZi0+bWRkZXYsICIlc19lZWgiKTsNCisJ CQkJCSAgICBpZiAo
IWNvbmYtPm1kZGV2LT5lZWhfdGhyZWFkKSB7DQorCQkJCQkJcHJpbnRrKEtF Uk5fRVJSIA0KKwkJ
CQkJCSAgICAicmFpZDU6IGNvdWxkbid0IGFsbG9jYXRlIGV4dGVybmFsIGVy cm9yIGhhbmRsZXIg
dGhyZWFkIGZvciAlc1xuIiwNCisJCQkJCQkgICAgbWRuYW1lKGNvbmYtPm1k ZGV2KSk7DQorCQkJ
CQkJbWRfZXJyb3IoY29uZi0+bWRkZXYsIGNvbmYtPmRpc2tzW2ldLnJkZXYp Ow0KKwkJCQkJICAg
IH0gZWxzZSAgew0KKwkJCQkJCWNvbmYtPm1kZGV2LT5lZWhfZGF0YS5mYWls ZWRfbnVtID0gaTsN
CisJCQkJCQltZF93YWtldXBfdGhyZWFkKGNvbmYtPm1kZGV2LT5lZWhfdGhy ZWFkKTsNCisJCQkJ
CSAgICB9DQorCQkJCQl9DQorI2VuZGlmDQorCQkJCX0NCisJCQkJaWYgKHRl c3RfYml0KFI1X0ZB
SUxFRCwgJmRldi0+ZmxhZ3MpKSB7DQorCQkJCQlQUklOVEsoInN0b3JlX2Jh ZGJsb2NrICVkOiAl
bGx1XG4iLCBpLCBzaC0+c2VjdG9yKTsNCisJCQkJCXN0b3JlX2JhZGJsb2Nr KCZjb25mLT5kaXNr
c1tpXSwgc2gtPnNlY3Rvcik7DQorCQkJCX0NCisJCQl9DQogCQkJZmFpbGVk Kys7DQogCQkJZmFp
bGVkX251bSA9IGk7DQotCQl9IGVsc2UNCisJCQlQUklOVEsoImRldmljZSAl ZCBmYWlsZWQgZm9y
IHRoaXMgc3RyaXBlIHIlcCB3JXBcbiIsIGksIGRldi0+dG9yZWFkLCBkZXYt PnRvd3JpdGUpOw0K
KwkJfSBlbHNlIHsNCiAJCQlzZXRfYml0KFI1X0luc3luYywgJmRldi0+Zmxh Z3MpOw0KKwkJfQ0K
IAl9DQorCWlmIChhc3BhcmUgJiYgZmFpbGVkID4gMSkNCisJICAgIGZhaWxl ZC0tOwkvKiBmYWls
ZWQgPSAxIG1lYW5zICJhbGwgb2siIGlmIHdlJ3ZlIGFzcGFyZSwgdGhpcyBp cyBzaW1wbGVzdA0K
KwkJCSAgICBtZXRob2QgdG8gZG8gb3VyIHdvcmsgKi8NCiAJUFJJTlRLKCJs b2NrZWQ9JWQgdXB0
b2RhdGU9JWQgdG9fcmVhZD0lZCINCiAJCSIgdG9fd3JpdGU9JWQgZmFpbGVk PSVkIGZhaWxlZF9u
dW09JWRcbiIsDQogCQlsb2NrZWQsIHVwdG9kYXRlLCB0b19yZWFkLCB0b193 cml0ZSwgZmFpbGVk
LCBmYWlsZWRfbnVtKTsNCkBAIC0xMDEzLDYgKzE0NDcsNyBAQA0KIAkJc3Bp bl91bmxvY2tfaXJx
KCZjb25mLT5kZXZpY2VfbG9jayk7DQogCX0NCiAJaWYgKGZhaWxlZCA+IDEg JiYgc3luY2luZykg
ew0KKwkJcHJpbnRrKEtFUk5fQUxFUlQgInN5bmMgc3RvcHBlZCBieSBJTyBl cnJvclxuIik7DQog
CQltZF9kb25lX3N5bmMoY29uZi0+bWRkZXYsIFNUUklQRV9TRUNUT1JTLDAp Ow0KIAkJY2xlYXJf
Yml0KFNUUklQRV9TWU5DSU5HLCAmc2gtPnN0YXRlKTsNCiAJCXN5bmNpbmcg PSAwOw0KQEAgLTEx
ODQsNiArMTYxOSwyNiBAQA0KIAkJCQkJUFJJTlRLKCJXcml0aW5nIGJsb2Nr ICVkXG4iLCBpKTsN
CiAJCQkJCWxvY2tlZCsrOw0KIAkJCQkJc2V0X2JpdChSNV9XYW50d3JpdGUs ICZzaC0+ZGV2W2ld
LmZsYWdzKTsNCisJCQkJCWlmIChhc3BhcmUgJiYgaSA9PSBhc3BhcmVudW0p IHsNCisJCQkJCSAg
ICBjaGFyICpwcywgKnBkOw0KKw0KKwkJCQkJICAgIC8qIG1pcnJvcmluZyB0 aGlzIG5ldyBibG9j
ayAqLw0KKwkJCQkJICAgIFBSSU5USygiV3JpdGluZyB0byBhc3BhcmUgdG9v ICVkLT4lZFxuIiwN
CisJCQkJCQkJaSwgY29uZi0+cmFpZF9kaXNrcyk7DQorCQkJCQkgICAgLypp ZiAodGVzdF9iaXQo
UjVfTE9DS0VELCAmc2gtPmRldltjb25mLT5yYWlkX2Rpc2tzXS5mbGFncykp IHsNCisJCQkJCQlw
cmludGsoImJhem1lZywgZXogbG9ra29sdDEhISFcbiIpOw0KKwkJCQkJICAg IH0qLw0KKwkJCQkJ
ICAgIHBzID0gcGFnZV9hZGRyZXNzKHNoLT5kZXZbaV0ucGFnZSk7DQorCQkJ CQkgICAgcGQgPSBw
YWdlX2FkZHJlc3Moc2gtPmRldltjb25mLT5yYWlkX2Rpc2tzXS5wYWdlKTsN CisJCQkJCSAgICAv
KiBiZXR0ZXIgaWRlYT8gKi8NCisJCQkJCSAgICBtZW1jcHkocGQsIHBzLCBT VFJJUEVfU0laRSk7
DQorCQkJCQkgICAgc2V0X2JpdChSNV9MT0NLRUQsICZzaC0+ZGV2W2NvbmYt PnJhaWRfZGlza3Nd
LmZsYWdzKTsNCisJCQkJCSAgICBzZXRfYml0KFI1X1dhbnR3cml0ZSwgJnNo LT5kZXZbY29uZi0+
cmFpZF9kaXNrc10uZmxhZ3MpOw0KKwkJCQkJfQ0KKwkJCQkJaWYgKGNvbmYt PmRpc2tzW2ldLnJk
ZXYgJiYgY29uZi0+ZGlza3NbaV0ucmRldi0+aW5fc3luYykgew0KKwkJCQkJ ICAgIFBSSU5USygi
cmVzZXQgYmFkYmxvY2sgb24gJWQ6ICVsbHVcbiIsIGksIHNoLT5zZWN0b3Ip Ow0KKwkJCQkJICAg
IGRlbGV0ZV9iYWRibG9jaygmY29uZi0+ZGlza3NbaV0sIHNoLT5zZWN0b3Ip Ow0KKwkJCQkJfQ0K
IAkJCQkJaWYgKCF0ZXN0X2JpdChSNV9JbnN5bmMsICZzaC0+ZGV2W2ldLmZs YWdzKQ0KIAkJCQkJ
ICAgIHx8IChpPT1zaC0+cGRfaWR4ICYmIGZhaWxlZCA9PSAwKSkNCiAJCQkJ CQlzZXRfYml0KFNU
UklQRV9JTlNZTkMsICZzaC0+c3RhdGUpOw0KQEAgLTEyMjAsMjAgKzE2NzUs MzkgQEANCiAJCQlp
ZiAoZmFpbGVkPT0wKQ0KIAkJCQlmYWlsZWRfbnVtID0gc2gtPnBkX2lkeDsN CiAJCQkvKiBzaG91
bGQgYmUgYWJsZSB0byBjb21wdXRlIHRoZSBtaXNzaW5nIGJsb2NrIGFuZCB3 cml0ZSBpdCB0byBz
cGFyZSAqLw0KKwkJCWlmIChhc3BhcmUpDQorCQkJICAgIGZhaWxlZF9udW0g PSBhc3BhcmVudW07
DQogCQkJaWYgKCF0ZXN0X2JpdChSNV9VUFRPREFURSwgJnNoLT5kZXZbZmFp bGVkX251bV0uZmxh
Z3MpKSB7DQogCQkJCWlmICh1cHRvZGF0ZSsxICE9IGRpc2tzKQ0KIAkJCQkJ QlVHKCk7DQogCQkJ
CWNvbXB1dGVfYmxvY2soc2gsIGZhaWxlZF9udW0pOw0KIAkJCQl1cHRvZGF0 ZSsrOw0KIAkJCX0N
CisJCQlpZiAoYXNwYXJlKSB7DQorCQkJICAgIGNoYXIgKnBzLCAqcGQ7DQor DQorCQkJICAgIHBz
ID0gcGFnZV9hZGRyZXNzKHNoLT5kZXZbZmFpbGVkX251bV0ucGFnZSk7DQor CQkJICAgIHBkID0g
cGFnZV9hZGRyZXNzKHNoLT5kZXZbY29uZi0+cmFpZF9kaXNrc10ucGFnZSk7 DQorCQkJICAgIG1l
bWNweShwZCwgcHMsIFNUUklQRV9TSVpFKTsNCisJCQkgICAgUFJJTlRLKCJS NV9XYW50d3JpdGUg
dG8gYXNwYXJlLCB1cHRvZGF0ZTogJWQgJXAtPiVwXG4iLA0KKwkJCQkJdXB0 b2RhdGUsIHBzLCBw
ZCk7DQorCQkJICAgIC8qaWYgKHRlc3RfYml0KFI1X0xPQ0tFRCwgJnNoLT5k ZXZbY29uZi0+cmFp
ZF9kaXNrc10uZmxhZ3MpKSB7DQorCQkJCXByaW50aygiYmF6bWVnLCBleiBs b2trb2x0MiEhIVxu
Iik7DQorCQkJICAgIH0qLw0KKwkJCX0NCiAJCQlpZiAodXB0b2RhdGUgIT0g ZGlza3MpDQogCQkJ
CUJVRygpOw0KKwkJCWlmIChhc3BhcmUpDQorCQkJICAgIGZhaWxlZF9udW0g PSBjb25mLT5yYWlk
X2Rpc2tzOw0KIAkJCWRldiA9ICZzaC0+ZGV2W2ZhaWxlZF9udW1dOw0KIAkJ CXNldF9iaXQoUjVf
TE9DS0VELCAmZGV2LT5mbGFncyk7DQogCQkJc2V0X2JpdChSNV9XYW50d3Jp dGUsICZkZXYtPmZs
YWdzKTsNCiAJCQlsb2NrZWQrKzsNCiAJCQlzZXRfYml0KFNUUklQRV9JTlNZ TkMsICZzaC0+c3Rh
dGUpOw0KIAkJCXNldF9iaXQoUjVfU3luY2lvLCAmZGV2LT5mbGFncyk7DQor CQkJLyogIWluX3N5
bmMuLg0KKwkJCXByaW50aygicmVzZXQgYmFkYmxvY2sgb24gJWQ6ICVsbHVc biIsIGZhaWxlZF9u
dW0sIHNoLT5zZWN0b3IpOw0KKwkJCWRlbGV0ZV9iYWRibG9jaygmY29uZi0+ ZGlza3NbZmFpbGVk
X251bV0sIHNoLT5zZWN0b3IpOyovDQogCQl9DQogCX0NCiAJaWYgKHN5bmNp bmcgJiYgbG9ja2Vk
ID09IDAgJiYgdGVzdF9iaXQoU1RSSVBFX0lOU1lOQywgJnNoLT5zdGF0ZSkp IHsNCkBAIC0xMjUx
LDcgKzE3MjUsNyBAQA0KIAkJYmktPmJpX3NpemUgPSAwOw0KIAkJYmktPmJp X2VuZF9pbyhiaSwg
Ynl0ZXMsIDApOw0KIAl9DQotCWZvciAoaT1kaXNrczsgaS0tIDspIHsNCisJ Zm9yIChpPWRpc2tz
K2FzcGFyZTsgaS0tIDspIHsNCiAJCWludCBydzsNCiAJCXN0cnVjdCBiaW8g KmJpOw0KIAkJbWRr
X3JkZXZfdCAqcmRldjsNCkBAIC0xNDkzLDYgKzE5NjcsMTUgQEANCiAJCXVu cGx1Z19zbGF2ZXMo
bWRkZXYpOw0KIAkJcmV0dXJuIDA7DQogCX0NCisJLyogaWYgdGhlcmUgaXMg MSBvciBtb3JlIGZh
aWxlZCBkcml2ZXMgYW5kIHdlIGFyZSB0cnlpbmcNCisJICogdG8gcmVzeW5j LCB0aGVuIGFzc2Vy
dCB0aGF0IHdlIGFyZSBmaW5pc2hlZCwgYmVjYXVzZSB0aGVyZSBpcw0KKwkg KiBub3RoaW5nIHdl
IGNhbiBkby4NCisJICovDQorCWlmIChtZGRldi0+ZGVncmFkZWQgPj0gMSAm JiB0ZXN0X2JpdChN
RF9SRUNPVkVSWV9TWU5DLCAmbWRkZXYtPnJlY292ZXJ5KSkgew0KKwkJaW50 IHJ2ID0gKG1kZGV2
LT5zaXplIDw8IDEpIC0gc2VjdG9yX25yOw0KKwkJbWRfZG9uZV9zeW5jKG1k ZGV2LCBydiwgMSk7
DQorCQlyZXR1cm4gcnY7DQorCX0NCiANCiAJeCA9IHNlY3Rvcl9ucjsNCiAJ Y2h1bmtfb2Zmc2V0
ID0gc2VjdG9yX2Rpdih4LCBzZWN0b3JzX3Blcl9jaHVuayk7DQpAQCAtMTUz OSwxMSArMjAyMiwy
MCBAQA0KIAltZF9jaGVja19yZWNvdmVyeShtZGRldik7DQogCW1kX2hhbmRs ZV9zYWZlbW9kZSht
ZGRldik7DQogDQorCWlmIChtZGRldi0+ZWVoX3RocmVhZCAmJiBtZGRldi0+ ZWVoX2RhdGEuZmFp
bGVkX251bSA9PSAtMSkgew0KKwkJcHJpbnRrKEtFUk5fSU5GTyAiZWVoX3Ro cmVhZCBpcyBkb25l
LCB1bnJlZ2lzdGVyaW5nXG4iKTsNCisJCW1kX3VucmVnaXN0ZXJfdGhyZWFk KG1kZGV2LT5lZWhf
dGhyZWFkKTsNCisJCW1kZGV2LT5lZWhfdGhyZWFkID0gTlVMTDsNCisJfQ0K Kw0KIAloYW5kbGVk
ID0gMDsNCiAJc3Bpbl9sb2NrX2lycSgmY29uZi0+ZGV2aWNlX2xvY2spOw0K IAl3aGlsZSAoMSkg
ew0KIAkJc3RydWN0IGxpc3RfaGVhZCAqZmlyc3Q7DQogDQorCQlpZiAobWRk ZXYtPmVlaF90aHJl
YWQpDQorCQkgICAgYnJlYWs7DQorDQogCQlpZiAobGlzdF9lbXB0eSgmY29u Zi0+aGFuZGxlX2xp
c3QpICYmDQogCQkgICAgYXRvbWljX3JlYWQoJmNvbmYtPnByZXJlYWRfYWN0 aXZlX3N0cmlwZXMp
IDwgSU9fVEhSRVNIT0xEICYmDQogCQkgICAgIWJsa19xdWV1ZV9wbHVnZ2Vk KG1kZGV2LT5xdWV1
ZSkgJiYNCkBAIC0xNTkxLDExICsyMDgzLDExIEBADQogCX0NCiANCiAJbWRk ZXYtPnByaXZhdGUg
PSBrbWFsbG9jIChzaXplb2YgKHJhaWQ1X2NvbmZfdCkNCi0JCQkJICArIG1k ZGV2LT5yYWlkX2Rp
c2tzICogc2l6ZW9mKHN0cnVjdCBkaXNrX2luZm8pLA0KKwkJCQkgICsgKG1k ZGV2LT5yYWlkX2Rp
c2tzICsgMSkgKiBzaXplb2Yoc3RydWN0IGRpc2tfaW5mbyksDQogCQkJCSAg R0ZQX0tFUk5FTCk7
DQogCWlmICgoY29uZiA9IG1kZGV2LT5wcml2YXRlKSA9PSBOVUxMKQ0KIAkJ Z290byBhYm9ydDsN
Ci0JbWVtc2V0IChjb25mLCAwLCBzaXplb2YgKCpjb25mKSArIG1kZGV2LT5y YWlkX2Rpc2tzICog
c2l6ZW9mKHN0cnVjdCBkaXNrX2luZm8pICk7DQorCW1lbXNldCAoY29uZiwg MCwgc2l6ZW9mICgq
Y29uZikgKyAobWRkZXYtPnJhaWRfZGlza3MgKyAxKSAqIHNpemVvZihzdHJ1 Y3QgZGlza19pbmZv
KSApOw0KIAljb25mLT5tZGRldiA9IG1kZGV2Ow0KIA0KIAlpZiAoKGNvbmYt PnN0cmlwZV9oYXNo
dGJsID0gKHN0cnVjdCBzdHJpcGVfaGVhZCAqKikgX19nZXRfZnJlZV9wYWdl cyhHRlBfQVRPTUlD
LCBIQVNIX1BBR0VTX09SREVSKSkgPT0gTlVMTCkNCkBAIC0xNjI1LDYgKzIx MTcsOCBAQA0KIA0K
IAkJZGlzay0+cmRldiA9IHJkZXY7DQogDQorCQlncm93X2JhZGJsb2Nrcyhk aXNrKTsNCisNCiAJ
CWlmIChyZGV2LT5pbl9zeW5jKSB7DQogCQkJY2hhciBiW0JERVZOQU1FX1NJ WkVdOw0KIAkJCXBy
aW50ayhLRVJOX0lORk8gInJhaWQ1OiBkZXZpY2UgJXMgb3BlcmF0aW9uYWwg YXMgcmFpZCINCkBA
IC0xNjM1LDYgKzIxMjksOCBAQA0KIAl9DQogDQogCWNvbmYtPnJhaWRfZGlz a3MgPSBtZGRldi0+
cmFpZF9kaXNrczsNCisJY29uZi0+bWlycm9yaXQgPSAtMTsNCisJbWRkZXYt PmVlaF90aHJlYWQg
PSBOVUxMOwkvKiBqdXN0IHRvIGJlIHN1cmUgKi8NCiAJLyoNCiAJICogMCBm b3IgYSBmdWxseSBm
dW5jdGlvbmFsIGFycmF5LCAxIGZvciBhIGRlZ3JhZGVkIGFycmF5Lg0KIAkg Ki8NCkBAIC0xNjg0
LDcgKzIxODAsNyBAQA0KIAkJfQ0KIAl9DQogbWVtb3J5ID0gY29uZi0+bWF4 X25yX3N0cmlwZXMg
KiAoc2l6ZW9mKHN0cnVjdCBzdHJpcGVfaGVhZCkgKw0KLQkJIGNvbmYtPnJh aWRfZGlza3MgKiAo
KHNpemVvZihzdHJ1Y3QgYmlvKSArIFBBR0VfU0laRSkpKSAvIDEwMjQ7DQor CQkgKGNvbmYtPnJh
aWRfZGlza3MrMSkgKiAoKHNpemVvZihzdHJ1Y3QgYmlvKSArIFBBR0VfU0la RSkpKSAvIDEwMjQ7
DQogCWlmIChncm93X3N0cmlwZXMoY29uZiwgY29uZi0+bWF4X25yX3N0cmlw ZXMpKSB7DQogCQlw
cmludGsoS0VSTl9FUlIgDQogCQkJInJhaWQ1OiBjb3VsZG4ndCBhbGxvY2F0 ZSAlZGtCIGZvciBi
dWZmZXJzXG4iLCBtZW1vcnkpOw0KQEAgLTE3MzksMTAgKzIyMzUsMTkgQEAN CiBzdGF0aWMgaW50
IHN0b3AgKG1kZGV2X3QgKm1kZGV2KQ0KIHsNCiAJcmFpZDVfY29uZl90ICpj b25mID0gKHJhaWQ1
X2NvbmZfdCAqKSBtZGRldi0+cHJpdmF0ZTsNCisJaW50IGk7DQogDQorCS8q IG1heSBibG9ja2Vk
IGluIHVzZXItc3BhY2UsIGtpbGwgaXQgKi8NCisJaWYgKG1kZGV2LT5lZWhf dGhyZWFkKSB7DQor
CQltZF91bnJlZ2lzdGVyX3RocmVhZChtZGRldi0+ZWVoX3RocmVhZCk7DQor CQltZGRldi0+ZWVo
X3RocmVhZCA9IE5VTEw7DQorCX0NCiAJbWRfdW5yZWdpc3Rlcl90aHJlYWQo bWRkZXYtPnRocmVh
ZCk7DQogCW1kZGV2LT50aHJlYWQgPSBOVUxMOw0KIAlzaHJpbmtfc3RyaXBl cyhjb25mKTsNCisJ
Zm9yIChpID0gY29uZi0+cmFpZF9kaXNrczsgaS0tOyApDQorCQlpZiAoY29u Zi0+ZGlza3NbaV0u
cmRldiAmJiBjb25mLT5kaXNrc1tpXS5yZGV2LT5pbl9zeW5jKQ0KKwkJCXNo cmlua19iYWRibG9j
a3MoJmNvbmYtPmRpc2tzW2ldKTsNCiAJZnJlZV9wYWdlcygodW5zaWduZWQg bG9uZykgY29uZi0+
c3RyaXBlX2hhc2h0YmwsIEhBU0hfUEFHRVNfT1JERVIpOw0KIAlibGtfc3lu Y19xdWV1ZShtZGRl
di0+cXVldWUpOyAvKiB0aGUgdW5wbHVnIGZuIHJlZmVyZW5jZXMgJ2NvbmYn Ki8NCiAJa2ZyZWUo
Y29uZik7DQpAQCAtMTc4OCw3ICsyMjkzLDkgQEANCiBzdGF0aWMgdm9pZCBz dGF0dXMgKHN0cnVj
dCBzZXFfZmlsZSAqc2VxLCBtZGRldl90ICptZGRldikNCiB7DQogCXJhaWQ1 X2NvbmZfdCAqY29u
ZiA9IChyYWlkNV9jb25mX3QgKikgbWRkZXYtPnByaXZhdGU7DQotCWludCBp Ow0KKwlpbnQgaSwg
ajsNCisJY2hhciBiW0JERVZOQU1FX1NJWkVdOw0KKwlzdHJ1Y3QgYmFkYmxv Y2sgKmJiOw0KIA0K
IAlzZXFfcHJpbnRmIChzZXEsICIgbGV2ZWwgJWQsICVkayBjaHVuaywgYWxn b3JpdGhtICVkIiwg
bWRkZXYtPmxldmVsLCBtZGRldi0+Y2h1bmtfc2l6ZSA+PiAxMCwgbWRkZXYt PmxheW91dCk7DQog
CXNlcV9wcmludGYgKHNlcSwgIiBbJWQvJWRdIFsiLCBjb25mLT5yYWlkX2Rp c2tzLCBjb25mLT53
b3JraW5nX2Rpc2tzKTsNCkBAIC0xODAxLDYgKzIzMDgsMjAgQEANCiAjZGVm aW5lIEQoeCkgXA0K
IAlzZXFfcHJpbnRmIChzZXEsICI8IiN4IjolZD4iLCBhdG9taWNfcmVhZCgm Y29uZi0+eCkpDQog
CXByaW50YWxsKGNvbmYpOw0KKw0KKwlzcGluX2xvY2tfaXJxKCZjb25mLT5k ZXZpY2VfbG9jayk7
CS8qIGl0J3Mgb2sgbm93IGZvciBkZWJ1ZyAqLw0KKwlzZXFfcHJpbnRmIChz ZXEsICJcbiAgICAg
IGtub3duIGJhZCBzZWN0b3JzIG9uIGFjdGl2ZSBkZXZpY2VzOiIpOw0KKwlm b3IgKGkgPSBjb25m
LT5yYWlkX2Rpc2tzOyBpLS07ICkgew0KKwkgICAgaWYgKGNvbmYtPmRpc2tz W2ldLnJkZXYpIHsN
CisJCXNlcV9wcmludGYgKHNlcSwgIlxuICAgICAgJXMiLCBiZGV2bmFtZShj b25mLT5kaXNrc1tp
XS5yZGV2LT5iZGV2LCBiKSk7DQorCQlmb3IgKGogPSAwOyBqIDwgQkJfTlJf SEFTSDsgaisrKSB7
DQorCQkgICAgYmIgPSBjb25mLT5kaXNrc1tpXS5iYWRibG9ja19oYXNodGJs W2pdOw0KKwkJICAg
IGZvciAoOyBiYjsgYmIgPSBiYi0+aGFzaF9uZXh0KQ0KKwkJCXNlcV9wcmlu dGYgKHNlcSwgIiAl
bGx1LSVsbHUiLCBiYi0+c2VjdG9yLCBiYi0+c2VjdG9yICsgKHVuc2lnbmVk IGxvbmcgbG9uZyko
U1RSSVBFX1NJWkUgLyA1MTIpIC0gMSk7DQorCQl9DQorCSAgICB9DQorCX0N CisJc3Bpbl91bmxv
Y2tfaXJxKCZjb25mLT5kZXZpY2VfbG9jayk7DQogI2VuZGlmDQogfQ0KIA0K QEAgLTE4NDQsNiAr
MjM2NSwxNiBAQA0KIAkJCXRtcC0+cmRldi0+aW5fc3luYyA9IDE7DQogCQl9 DQogCX0NCisJdG1w
ID0gY29uZi0+ZGlza3MgKyBpOw0KKwlpZiAodG1wLT5yZGV2ICYmICF0bXAt PnJkZXYtPmZhdWx0
eSAmJiAhdG1wLT5yZGV2LT5pbl9zeW5jKSB7DQorCSAgICB0bXAtPnJkZXYt PmluX3N5bmMgPSAx
Ow0KKw0KKwkgICAgcHJpbnRrKEtFUk5fTk9USUNFICJyYWlkNV9zcGFyZV9h Y3RpdmU6ICVkIGlu
X3N5bmMgJWQtPiVkXG4iLA0KKwkJCWksIHRtcC0+cmRldi0+cmFpZF9kaXNr LCBjb25mLT5taXJy
b3JpdCk7DQorDQorCSAgICAvKiBzY2FyeS4uPyA6fSAqLw0KKwkgICAgdG1w LT5yZGV2LT5yYWlk
X2Rpc2sgPSBjb25mLT5taXJyb3JpdDsNCisJfQ0KIAlwcmludF9yYWlkNV9j b25mKGNvbmYpOw0K
IAlyZXR1cm4gMDsNCiB9DQpAQCAtMTg1Nyw2ICsyMzg4LDcgQEANCiANCiAJ cHJpbnRfcmFpZDVf
Y29uZihjb25mKTsNCiAJcmRldiA9IHAtPnJkZXY7DQorcHJpbnRrKCJyYWlk NV9yZW1vdmVfZGlz
ayAlZFxuIiwgbnVtYmVyKTsNCiAJaWYgKHJkZXYpIHsNCiAJCWlmIChyZGV2 LT5pbl9zeW5jIHx8
DQogCQkgICAgYXRvbWljX3JlYWQoJnJkZXYtPm5yX3BlbmRpbmcpKSB7DQpA QCAtMTg3MCw2ICsy
NDAyLDggQEANCiAJCQllcnIgPSAtRUJVU1k7DQogCQkJcC0+cmRldiA9IHJk ZXY7DQogCQl9DQor
CQlpZiAoIWVycikNCisJCQlzaHJpbmtfYmFkYmxvY2tzKHApOw0KIAl9DQog YWJvcnQ6DQogDQpA
QCAtMTg4NCwxOSArMjQxOCw0NiBAQA0KIAlpbnQgZGlzazsNCiAJc3RydWN0 IGRpc2tfaW5mbyAq
cDsNCiANCisJaWYgKG1kZGV2LT5kZWdyYWRlZCA+IDEpDQorCQkvKiBubyBw b2ludCBhZGRpbmcg
YSBkZXZpY2UgKi8NCisJCXJldHVybiAwOw0KKw0KIAkvKg0KIAkgKiBmaW5k IHRoZSBkaXNrIC4u
Lg0KIAkgKi8NCiAJZm9yIChkaXNrPTA7IGRpc2sgPCBtZGRldi0+cmFpZF9k aXNrczsgZGlzaysr
KQ0KIAkJaWYgKChwPWNvbmYtPmRpc2tzICsgZGlzayktPnJkZXYgPT0gTlVM TCkgew0KLQkJCXJk
ZXYtPmluX3N5bmMgPSAwOw0KKwkJCS8qcmRldi0+aW5fc3luYyA9IDA7CXRo aXMgaXMgdGhlIGRl
ZmF1bHQgYnkgbWQuYzogaG90X2FkZF9kaXNrKCkgKi8NCiAJCQlyZGV2LT5y YWlkX2Rpc2sgPSBk
aXNrOw0KIAkJCWZvdW5kID0gMTsNCiAJCQlwLT5yZGV2ID0gcmRldjsNCiAJ CQlicmVhazsNCiAJ
CX0NCisNCisJaWYgKCFmb3VuZCAmJiBjb25mLT5kaXNrc1tkaXNrXS5yZGV2 ID09IE5VTEwpIHsN
CisJICAgIGNoYXIgYltCREVWTkFNRV9TSVpFXTsNCisNCisJICAgIC8qIGFy cmF5IG9wdGltYWws
IHRoaXMgc2hvdWxkIGJlIHRoZSAnYWN0aXZlIHNwYXJlJyBhZGRlZCBieSBl ZWhfdGhyZWFkICov
DQorCSAgICBjb25mLT5kaXNrc1tkaXNrXS5yZGV2ID0gcmRldjsNCisJICAg IHJkZXYtPmluX3N5
bmMgPSAwOw0KKwkgICAgcmRldi0+cmFpZF9kaXNrID0gY29uZi0+cmFpZF9k aXNrczsNCisNCisJ
ICAgIGlmIChtZGRldi0+ZGVncmFkZWQpIC8qIGlmIHdlJ3JlIGhlcmUgYW5k IGl0J3MgdHJ1ZSwg
d2UncmUgY2FsbGVkIGFmdGVyIGVycm9yKCkgKi8NCisJCSAgICBtZGRldi0+ ZGVncmFkZWQtLTsN
CisJICAgIGVsc2UNCisJCSAgICBjb25mLT5taXJyb3JpdCA9IG1kZGV2LT5l ZWhfZGF0YS5mYWls
ZWRfbnVtOw0KKwkgICAgZm91bmQgPSAxOw0KKw0KKwkgICAgcHJpbnRrKEtF Uk5fTk9USUNFICJh
ZGRlZCBzcGFyZSBmb3IgcHJvYWN0aXZlIHJlcGxhY2VtZW50IG9mICVzXG4i LA0KKwkJICAgIGJk
ZXZuYW1lKGNvbmYtPmRpc2tzW2NvbmYtPm1pcnJvcml0XS5yZGV2LT5iZGV2 LCBiKSk7DQorCX0N
CisJaWYgKGZvdW5kKQ0KKwkJZ3Jvd19iYWRibG9ja3MoJmNvbmYtPmRpc2tz W2Rpc2tdKTsNCisJ
cHJpbnRrKEtFUk5fSU5GTyAicmFpZDVfYWRkX2Rpc2s6ICVkICglZCkgaW5f c3luYzogJWRcbiIs
IGRpc2ssIGZvdW5kLCBmb3VuZCA/IHJkZXYtPmluX3N5bmMgOiAtMSk7DQor DQogCXByaW50X3Jh
aWQ1X2NvbmYoY29uZik7DQotCXJldHVybiBmb3VuZDsNCisJLyogcmVidWls ZCBuZWVkZWQ/ICov
DQorCXJldHVybiByZGV2LT5pbl9zeW5jID8gMCA6IGZvdW5kOw0KIH0NCiAN CiBzdGF0aWMgaW50
IHJhaWQ1X3Jlc2l6ZShtZGRldl90ICptZGRldiwgc2VjdG9yX3Qgc2VjdG9y cykNCi==


--=-l6K2Yj3/j3TZD9PhfuIg--
-
To unsubscribe from this list: send the line "unsubscribe linux-raid" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html