From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S264432AbUEJBdY (ORCPT ); Sun, 9 May 2004 21:33:24 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S264440AbUEJBdY (ORCPT ); Sun, 9 May 2004 21:33:24 -0400 Received: from CPE0000c02944d6-CM00003965a061.cpe.net.cable.rogers.com ([69.193.74.215]:37278 "EHLO tentacle.dhs.org") by vger.kernel.org with ESMTP id S264432AbUEJBc5 (ORCPT ); Sun, 9 May 2004 21:32:57 -0400 Subject: [RFC/PATCH] inotify -- a dnotify replacement From: John McCutchan To: linux-kernel@vger.kernel.org, nautilus-list@gnome.org Content-Type: multipart/mixed; boundary="=-E4Xo9teWbY6Gsf9ZbKrl" Message-Id: <1084152941.22837.21.camel@vertex> Mime-Version: 1.0 X-Mailer: Ximian Evolution 1.4.6 Date: Sun, 09 May 2004 21:35:41 -0400 Sender: linux-kernel-owner@vger.kernel.org X-Mailing-List: linux-kernel@vger.kernel.org --=-E4Xo9teWbY6Gsf9ZbKrl Content-Type: text/plain Content-Transfer-Encoding: 7bit Hi, I have been working on inotify a dnotify replacement. inotify is a char device that has two ioctls: INOTIFY_WATCH and INOTIFY_IGNORE Which expect an inode number and an inode device number. I know that on some file systems the inode number and inode device number are not guaranteed to be unique. This driver is only meant for file systems that have unique inode numbers. The two biggest complaints people have about dnotify are 1) dnotify delivers events using signals. 2) dnotify needs a file to be kept open on the device, causing problems during unmount. As for 1) -- since inotify is a char device the events are delivered when the user calls read (). This easily integrates in to an applications select() loop. I have a solution for 2) but I haven't implemented it yet, as I don't have the expertise. What I want to do is distinguish between some one holding a 'real' reference on an inode, and a reference that is used only for watching. This way in the unmount code we can make sure that no one is holding a real reference to an inode on the device, then while invalidating the inodes, clear the inodes watch list and send UNMOUNT events to the inotify device. Changes would have to be made so that inodes are kept in the inode cache when a watching reference is held. I would like some pointers on how to implement 2). I am not sure the code path that takes place on unmount, or the best place to change the inode cache semantics. I would also appreciate comments on the design in general and code review (this is my first kernel project). Attached is a patch implementing everything described in the email. John --=-E4Xo9teWbY6Gsf9ZbKrl Content-Disposition: attachment; filename=inotify.patch Content-Type: text/x-patch; name=inotify.patch; charset=UTF-8 Content-Transfer-Encoding: base64 ZGlmZiAtcnUgY2xlYW4vbGludXgtMi42LjUvZnMvYXR0ci5jIGxpbnV4LTIuNi41L2ZzL2F0dHIu Yw0KLS0tIGNsZWFuL2xpbnV4LTIuNi41L2ZzL2F0dHIuYwkyMDA0LTA0LTAzIDIyOjM2OjI0LjAw MDAwMDAwMCAtMDUwMA0KKysrIGxpbnV4LTIuNi41L2ZzL2F0dHIuYwkyMDA0LTA1LTA5IDIxOjAy OjI0LjAwMDAwMDAwMCAtMDQwMA0KQEAgLTExLDYgKzExLDcgQEANCiAjaW5jbHVkZSA8bGludXgv c3RyaW5nLmg+DQogI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+DQogI2luY2x1ZGUgPGxpbnV4 L2Rub3RpZnkuaD4NCisjaW5jbHVkZSA8bGludXgvaW5vdGlmeS5oPg0KICNpbmNsdWRlIDxsaW51 eC9mY250bC5oPg0KICNpbmNsdWRlIDxsaW51eC9xdW90YW9wcy5oPg0KICNpbmNsdWRlIDxsaW51 eC9zZWN1cml0eS5oPg0KQEAgLTEyNyw2ICsxMjgsNyBAQA0KIAlyZXR1cm4gZG5fbWFzazsNCiB9 DQogDQorDQogaW50IG5vdGlmeV9jaGFuZ2Uoc3RydWN0IGRlbnRyeSAqIGRlbnRyeSwgc3RydWN0 IGlhdHRyICogYXR0cikNCiB7DQogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5v ZGU7DQpAQCAtMTg0LDggKzE4NiwxMCBAQA0KIAl9DQogCWlmICghZXJyb3IpIHsNCiAJCXVuc2ln bmVkIGxvbmcgZG5fbWFzayA9IHNldGF0dHJfbWFzayhpYV92YWxpZCk7DQotCQlpZiAoZG5fbWFz aykNCisJCWlmIChkbl9tYXNrKSB7DQogCQkJZG5vdGlmeV9wYXJlbnQoZGVudHJ5LCBkbl9tYXNr KTsNCisJCQlpbm90aWZ5X2RlbnRyeV9xdWV1ZV9ldmVudCAoZGVudHJ5LCBkbl9tYXNrKTsNCisJ CX0NCiAJfQ0KIAlyZXR1cm4gZXJyb3I7DQogfQ0KZGlmZiAtcnUgY2xlYW4vbGludXgtMi42LjUv ZnMvaW5vZGUuYyBsaW51eC0yLjYuNS9mcy9pbm9kZS5jDQotLS0gY2xlYW4vbGludXgtMi42LjUv ZnMvaW5vZGUuYwkyMDA0LTA0LTAzIDIyOjM4OjIzLjAwMDAwMDAwMCAtMDUwMA0KKysrIGxpbnV4 LTIuNi41L2ZzL2lub2RlLmMJMjAwNC0wNS0wOSAyMToxMDoxMi4wMDAwMDAwMDAgLTA0MDANCkBA IC0xNTEsNiArMTUxLDEwIEBADQogCQkJbWFwcGluZy0+YmFja2luZ19kZXZfaW5mbyA9IHNiLT5z X2JkZXYtPmJkX2lub2RlLT5pX21hcHBpbmctPmJhY2tpbmdfZGV2X2luZm87DQogCQltZW1zZXQo Jmlub2RlLT51LCAwLCBzaXplb2YoaW5vZGUtPnUpKTsNCiAJCWlub2RlLT5pX21hcHBpbmcgPSBt YXBwaW5nOw0KKw0KKwkJSU5JVF9MSVNUX0hFQUQoJmlub2RlLT53YXRjaGVycyk7DQorCQlhdG9t aWNfc2V0ICgmaW5vZGUtPndhdGNoZXJfY291bnQsIDApOw0KKwkJaW5vZGUtPndhdGNoZXJzX21h c2sgPSAwOw0KIAl9DQogCXJldHVybiBpbm9kZTsNCiB9DQpAQCAtMTU5LDExICsxNjMsMTUgQEAN CiB7DQogCWlmIChpbm9kZV9oYXNfYnVmZmVycyhpbm9kZSkpDQogCQlCVUcoKTsNCisJLyogV2hl biBhbiBpbm9kZSBnZXRzIGRlc3Ryb3llZCBpdCBzaG91bGRuJ3QgaGF2ZSBhbnkgd2F0Y2hlcnMg bGVmdCBvbiBpdCAqLw0KKwlpZiAoIWxpc3RfZW1wdHkgKCZpbm9kZS0+d2F0Y2hlcnMpKQ0KKwkJ QlVHKCk7DQogCXNlY3VyaXR5X2lub2RlX2ZyZWUoaW5vZGUpOw0KIAlpZiAoaW5vZGUtPmlfc2It PnNfb3AtPmRlc3Ryb3lfaW5vZGUpDQogCQlpbm9kZS0+aV9zYi0+c19vcC0+ZGVzdHJveV9pbm9k ZShpbm9kZSk7DQogCWVsc2UNCiAJCWttZW1fY2FjaGVfZnJlZShpbm9kZV9jYWNoZXAsIChpbm9k ZSkpOw0KKw0KIH0NCiANCiANCmRpZmYgLXJ1IGNsZWFuL2xpbnV4LTIuNi41L2ZzL01ha2VmaWxl IGxpbnV4LTIuNi41L2ZzL01ha2VmaWxlDQotLS0gY2xlYW4vbGludXgtMi42LjUvZnMvTWFrZWZp bGUJMjAwNC0wNC0wMyAyMjozNzoyMy4wMDAwMDAwMDAgLTA1MDANCisrKyBsaW51eC0yLjYuNS9m cy9NYWtlZmlsZQkyMDA0LTA0LTIwIDIzOjM1OjE3LjAwMDAwMDAwMCAtMDQwMA0KQEAgLTEwLDcg KzEwLDcgQEANCiAJCW5hbWVpLm8gZmNudGwubyBpb2N0bC5vIHJlYWRkaXIubyBzZWxlY3QubyBm aWZvLm8gbG9ja3MubyBcDQogCQlkY2FjaGUubyBpbm9kZS5vIGF0dHIubyBiYWRfaW5vZGUubyBm aWxlLm8gZG5vdGlmeS5vIFwNCiAJCWZpbGVzeXN0ZW1zLm8gbmFtZXNwYWNlLm8gc2VxX2ZpbGUu byB4YXR0ci5vIGxpYmZzLm8gXA0KLQkJZnMtd3JpdGViYWNrLm8gbXBhZ2UubyBkaXJlY3QtaW8u byBhaW8ubw0KKwkJZnMtd3JpdGViYWNrLm8gbXBhZ2UubyBkaXJlY3QtaW8ubyBhaW8ubyBpbm90 aWZ5Lm8gDQogDQogb2JqLSQoQ09ORklHX0VQT0xMKQkJKz0gZXZlbnRwb2xsLm8NCiBvYmotJChD T05GSUdfQ09NUEFUKQkJKz0gY29tcGF0Lm8NCmRpZmYgLXJ1IGNsZWFuL2xpbnV4LTIuNi41L2Zz L3JlYWRfd3JpdGUuYyBsaW51eC0yLjYuNS9mcy9yZWFkX3dyaXRlLmMNCi0tLSBjbGVhbi9saW51 eC0yLjYuNS9mcy9yZWFkX3dyaXRlLmMJMjAwNC0wNC0wMyAyMjozNzozNi4wMDAwMDAwMDAgLTA1 MDANCisrKyBsaW51eC0yLjYuNS9mcy9yZWFkX3dyaXRlLmMJMjAwNC0wNS0wOSAyMTowMjoxNC4w MDAwMDAwMDAgLTA0MDANCkBAIC0xMSw2ICsxMSw3IEBADQogI2luY2x1ZGUgPGxpbnV4L3Vpby5o Pg0KICNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPg0KICNpbmNsdWRlIDxsaW51eC9kbm90aWZ5 Lmg+DQorI2luY2x1ZGUgPGxpbnV4L2lub3RpZnkuaD4NCiAjaW5jbHVkZSA8bGludXgvc2VjdXJp dHkuaD4NCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+DQogDQpAQCAtMjE0LDggKzIxNSwxMCBA QA0KIAkJCQlyZXQgPSBmaWxlLT5mX29wLT5yZWFkKGZpbGUsIGJ1ZiwgY291bnQsIHBvcyk7DQog CQkJZWxzZQ0KIAkJCQlyZXQgPSBkb19zeW5jX3JlYWQoZmlsZSwgYnVmLCBjb3VudCwgcG9zKTsN Ci0JCQlpZiAocmV0ID4gMCkNCisJCQlpZiAocmV0ID4gMCkgew0KIAkJCQlkbm90aWZ5X3BhcmVu dChmaWxlLT5mX2RlbnRyeSwgRE5fQUNDRVNTKTsNCisJCQkJaW5vdGlmeV9kZW50cnlfcXVldWVf ZXZlbnQgKGZpbGUtPmZfZGVudHJ5LCBJTl9BQ0NFU1MpOw0KKwkJCX0NCiAJCX0NCiAJfQ0KIA0K QEAgLTI1OCw4ICsyNjEsMTAgQEANCiAJCQkJcmV0ID0gZmlsZS0+Zl9vcC0+d3JpdGUoZmlsZSwg YnVmLCBjb3VudCwgcG9zKTsNCiAJCQllbHNlDQogCQkJCXJldCA9IGRvX3N5bmNfd3JpdGUoZmls ZSwgYnVmLCBjb3VudCwgcG9zKTsNCi0JCQlpZiAocmV0ID4gMCkNCisJCQlpZiAocmV0ID4gMCkg ew0KIAkJCQlkbm90aWZ5X3BhcmVudChmaWxlLT5mX2RlbnRyeSwgRE5fTU9ESUZZKTsNCisJCQkJ aW5vdGlmeV9kZW50cnlfcXVldWVfZXZlbnQgKGZpbGUtPmZfZGVudHJ5LCBJTl9NT0RJRlkpOw0K KwkJCX0NCiAJCX0NCiAJfQ0KIA0KQEAgLTQ3Myw5ICs0NzgsMTIgQEANCiBvdXQ6DQogCWlmIChp b3YgIT0gaW92c3RhY2spDQogCQlrZnJlZShpb3YpOw0KLQlpZiAoKHJldCArICh0eXBlID09IFJF QUQpKSA+IDApDQorCWlmICgocmV0ICsgKHR5cGUgPT0gUkVBRCkpID4gMCkgew0KIAkJZG5vdGlm eV9wYXJlbnQoZmlsZS0+Zl9kZW50cnksDQogCQkJCSh0eXBlID09IFJFQUQpID8gRE5fQUNDRVNT IDogRE5fTU9ESUZZKTsNCisJCWlub3RpZnlfZGVudHJ5X3F1ZXVlX2V2ZW50IChmaWxlLT5mX2Rl bnRyeSwgDQorCQkJCSh0eXBlID09IFJFQUQpID8gSU5fQUNDRVNTIDogSU5fTU9ESUZZKTsNCisJ fQ0KIAlyZXR1cm4gcmV0Ow0KIH0NCiANCmRpZmYgLXJ1IGNsZWFuL2xpbnV4LTIuNi41L2luY2x1 ZGUvbGludXgvZnMuaCBsaW51eC0yLjYuNS9pbmNsdWRlL2xpbnV4L2ZzLmgNCi0tLSBjbGVhbi9s aW51eC0yLjYuNS9pbmNsdWRlL2xpbnV4L2ZzLmgJMjAwNC0wNC0wMyAyMjozNjo1Mi4wMDAwMDAw MDAgLTA1MDANCisrKyBsaW51eC0yLjYuNS9pbmNsdWRlL2xpbnV4L2ZzLmgJMjAwNC0wNS0wOSAy MTowNjo0Mi4wMDAwMDAwMDAgLTA0MDANCkBAIC00MTQsNiArNDE0LDEwIEBADQogCXVuc2lnbmVk IGxvbmcJCWlfZG5vdGlmeV9tYXNrOyAvKiBEaXJlY3Rvcnkgbm90aWZ5IGV2ZW50cyAqLw0KIAlz dHJ1Y3QgZG5vdGlmeV9zdHJ1Y3QJKmlfZG5vdGlmeTsgLyogZm9yIGRpcmVjdG9yeSBub3RpZmlj YXRpb25zICovDQogDQorCXN0cnVjdCBsaXN0X2hlYWQgCXdhdGNoZXJzOw0KKwl1bnNpZ25lZCBs b25nCQl3YXRjaGVyc19tYXNrOw0KKwlhdG9taWNfdAkJd2F0Y2hlcl9jb3VudDsNCisNCiAJdW5z aWduZWQgbG9uZwkJaV9zdGF0ZTsNCiAJdW5zaWduZWQgbG9uZwkJZGlydGllZF93aGVuOwkvKiBq aWZmaWVzIG9mIGZpcnN0IGRpcnR5aW5nICovDQogDQpkaWZmIC1ydSBjbGVhbi9saW51eC0yLjYu NS9pbmNsdWRlL2xpbnV4L21pc2NkZXZpY2UuaCBsaW51eC0yLjYuNS9pbmNsdWRlL2xpbnV4L21p c2NkZXZpY2UuaA0KLS0tIGNsZWFuL2xpbnV4LTIuNi41L2luY2x1ZGUvbGludXgvbWlzY2Rldmlj ZS5oCTIwMDQtMDQtMDMgMjI6Mzc6MjMuMDAwMDAwMDAwIC0wNTAwDQorKysgbGludXgtMi42LjUv aW5jbHVkZS9saW51eC9taXNjZGV2aWNlLmgJMjAwNC0wNS0wOCAxOTozNDowNC4wMDAwMDAwMDAg LTA0MDANCkBAIC0zNiw2ICszNiw4IEBADQogDQogI2RlZmluZSBUVU5fTUlOT1IJICAgICAyMDAN CiANCisjZGVmaW5lIElOT1RJRllfTUlOT1IgOTkNCisNCiBzdHJ1Y3QgZGV2aWNlOw0KIA0KIHN0 cnVjdCBtaXNjZGV2aWNlIA0K --=-E4Xo9teWbY6Gsf9ZbKrl Content-Disposition: attachment; filename=inotify.h Content-Type: text/x-chdr; name=inotify.h; charset=UTF-8 Content-Transfer-Encoding: base64 LyoNCiAqIElub2RlIGJhc2VkIGRpcmVjdG9yeSBub3RpZmljYXRpb24gZm9yIExpbnV4DQogKg0K ICogQ29weXJpZ2h0IChDKSAyMDA0IEpvaG4gTWNDdXRjaGFuDQogKi8NCg0KI2lmbmRlZiBfTElO VVhfSU5PVElGWV9IDQojZGVmaW5lIF9MSU5VWF9JTk9USUZZX0gNCg0KI2luY2x1ZGUgPGxpbnV4 L2ZzLmg+DQojaW5jbHVkZSA8bGludXgvaW9jdGwuaD4NCg0KLyogV2hlbiByZWFkaW5nIGZyb20g dGhlIGRldmljZSB0aGUgZm9ybWF0IGlzOg0KICogCUlOT0RFX05VTUJFUiBbdW5zaWduZWQgbG9u Z10NCiAqIAlJTk9ERV9ERVZJQ0VfTlVNQkVSIFt1bnNpZ25lZCBsb25nXQ0KICogCUVWRU5UX01B U0sgW3Vuc2lnbmVkIGxvbmddDQogKi8NCg0KI2RlZmluZSBJTl9BQ0NFU1MJMHgwMDAwMDAwMQkv KiBGaWxlIHdhcyBhY2Nlc3NlZCAqLw0KI2RlZmluZSBJTl9NT0RJRlkJMHgwMDAwMDAwMgkvKiBG aWxlIHdhcyBtb2RpZmllZCAqLw0KI2RlZmluZSBJTl9DUkVBVEUJMHgwMDAwMDAwNAkvKiBGaWxl IHdhcyBjcmVhdGVkICovDQojZGVmaW5lIElOX0RFTEVURQkweDAwMDAwMDA4CS8qIEZpbGUgd2Fz IGRlbGV0ZWQgKi8NCiNkZWZpbmUgSU5fUkVOQU1FCTB4MDAwMDAwMTAJLyogRmlsZSB3YXMgcmVu YW1lZCAqLw0KI2RlZmluZSBJTl9BVFRSSUIJMHgwMDAwMDAyMAkvKiBGaWxlIGNoYW5nZWQgYXR0 cmlidXRlcyAqLw0KI2RlZmluZSBJTl9NT1ZFCQkweDAwMDAwMDQwCS8qIEZpbGUgd2FzIG1vdmVk ICovDQojZGVmaW5lIElOX1VOTU9VTlQJMHgwMDAwMDA4MAkvKiBEZXZpY2UgZmlsZSB3YXMgb24s IHdhcyB1bm1vdW50ZWQgKi8NCg0KLyogRmlsbCB0aGlzIGFuZCBwYXNzIGl0IHRvIHRoZSBpb2N0 bCAqLw0Kc3RydWN0IGlub3RpZnlfcGFja2V0IHsNCgl1bnNpZ25lZCBsb25nIGlfbm87IC8vIGZy b20gc3RhdA0KCXVuc2lnbmVkIGxvbmcgaV9kZXY7IC8vIGZyb20gc3RhdA0KCXVuc2lnbmVkIGxv bmcgbWFzazsgLy8gY29tYmluYXRpb24gb2YgYWJvdmUNCn07DQoNCi8qIGlvY3RsICovDQoNCiNk ZWZpbmUgSU5PVElGWV9JT0NUTF9NQUdJQyAnUScNCiNkZWZpbmUgSU5PVElGWV9JT0NUTF9NQVhO UiAyDQoNCiNkZWZpbmUgSU5PVElGWV9XQVRDSAlfSU9XKElOT1RJRllfSU9DVExfTUFHSUMsIDEs IHN0cnVjdCBpbm90aWZ5X3dhdGNoKQ0KI2RlZmluZSBJTk9USUZZX0lHTk9SRQlfSU9XKElOT1RJ RllfSU9DVExfTUFHSUMsIDIsIHN0cnVjdCBpbm90aWZ5X3dhdGNoKQ0KDQovKiBLZXJuZWwgQVBJ ICovDQp2b2lkIGlub3RpZnlfaW5vZGVfcXVldWVfZXZlbnQgKHN0cnVjdCBpbm9kZSAqaW5vZGUs IHVuc2lnbmVkIGxvbmcgbWFzayk7DQp2b2lkIGlub3RpZnlfZGVudHJ5X3F1ZXVlX2V2ZW50IChz dHJ1Y3QgZGVudHJ5ICpkZW50cnksIHVuc2lnbmVkIGxvbmcgbWFzayk7DQp2b2lkIGlub3RpZnlf aW5vZGVfdXBkYXRlX21hc2sgKHN0cnVjdCBpbm9kZSAqaW5vZGUpOw0KDQojZW5kaWYNCg0K --=-E4Xo9teWbY6Gsf9ZbKrl Content-Disposition: attachment; filename=inotify.c Content-Type: text/x-csrc; name=inotify.c; charset=UTF-8 Content-Transfer-Encoding: base64 LyoNCiAqIElub2RlIGJhc2VkIGRpcmVjdG9yeSBub3RpZmljYXRpb25zIGZvciBMaW51eC4NCiAq DQogKiBDb3B5cmlnaHQgKEMpIDIwMDQgSm9obiBNY0N1dGNoYW4NCiAqDQogKiBUaGlzIHByb2dy YW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlm eSBpdA0KICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5z ZSBhcyBwdWJsaXNoZWQgYnkgdGhlDQogKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhl ciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55DQogKiBsYXRlciB2ZXJzaW9uLg0K ICoNCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdp bGwgYmUgdXNlZnVsLCBidXQNCiAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4g dGhlIGltcGxpZWQgd2FycmFudHkgb2YNCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZP UiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VDQogKiBHZW5lcmFsIFB1YmxpYyBM aWNlbnNlIGZvciBtb3JlIGRldGFpbHMuDQogKi8NCg0KI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5o Pg0KI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPg0KI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+DQoj aW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4NCiNpbmNsdWRlIDxsaW51eC9zbGFiLmg+DQojaW5j bHVkZSA8bGludXgvZnMuaD4NCiNpbmNsdWRlIDxsaW51eC9wb2xsLmg+DQojaW5jbHVkZSA8bGlu dXgvbWlzY2RldmljZS5oPg0KI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPg0KI2luY2x1ZGUgPGxp bnV4L2luaXQuaD4NCiNpbmNsdWRlIDxsaW51eC90eXBlcy5oPg0KI2luY2x1ZGUgPGxpbnV4L3N0 ZGRlZi5oPg0KI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPg0KI2luY2x1ZGUgPGxpbnV4L2xpc3Qu aD4NCiNpbmNsdWRlIDxsaW51eC9pbm90aWZ5Lmg+DQoNCi8qIFRPRE86DQogKiBnZXQgbW9yZSBl dmVudHMgc2VudCB0byB0aGUgcXVldWUNCiAqIAlyZW5hbWUNCiAqIAltb3ZlDQogKiAJdW5tb3Vu dA0KICogY2hlY2sgdGhhdCBhbnkgaW5vZGVzIHdlIGFyZSBhc2tlZCB0byB3YXRjaCBhcmUgYWN0 dWFsbHkgZGlyZWN0b3JpZXMNCiAqIHdyaXRlIHVzZXIgc3BhY2UgdGVzdCBhcHANCiAqIGNoYW5n ZSB1bW91bnQgY29kZQ0KICovDQoNCiNkZWZpbmUgTUFYX1dBVENIRVJfQ09VTlQgOCAvKiBXZSBv bmx5IHN1cHBvcnQgOCB3YXRjaGVycyAqLw0KI2RlZmluZSBNQVhfV0FUQ0hfQ09VTlQgMTI4IC8q IEEgd2F0Y2hlciBjYW4gb25seSBiZSB3YXRjaGluZyAxMjggaW5vZGVzICovDQoNCnN0YXRpYyBp bnQgd2F0Y2hlcl9jb3VudCA9IDA7DQoNCnN0cnVjdCBpbm90aWZ5X3dhdGNoIHsNCglzdHJ1Y3Qg bGlzdF9oZWFkCWxpc3Q7DQoJc3RydWN0IGlub2RlICoJCWlub2RlOw0KfTsNCiNkZWZpbmUgbGlz dF90b19pbm90aWZ5X3dhdGNoKHBvcykgbGlzdF9lbnRyeSgocG9zKSxzdHJ1Y3QgaW5vdGlmeV93 YXRjaCxsaXN0KQ0KDQovKiBBIGxpc3Qgb2YgdGhlc2Ugc3RydWN0dXJlcyBpcyBhdHRhY2hlZCB0 byBlYWNoIGlub2RlIHRoYXQgaXMgYmVpbmcgd2F0Y2hlZC4NCiAqICAqIGVhY2ggaXRlbSBpbiB0 aGUgbGlzdCByZXByZXNlbnRzIGEgdW5pcXVlIHdhdGNoZXIuDQogKiAgICogaXQgdGVsbCB1cyB3 aGF0IGV2ZW50cyB3ZSBhcmUgbG9va2luZyBhdCBhbmQgd2hvIGlzIHdhdGNoaW5nIHRoZSBpbm9k ZS4NCiAqICAgICovDQpzdHJ1Y3QgaW5vdGlmeV9pbm9kZV93YXRjaGVyIHsNCglzdHJ1Y3QgbGlz dF9oZWFkICAgICAgICBsaXN0Ow0KCXVuc2lnbmVkIGxvbmcgICAgICAgICAgIG1hc2s7DQoJc3Ry dWN0IGlub2RlICogICAgICAgICAgaW5vZGU7DQoJdm9pZCAqICAgICAgICAgICAgICAgICAgcHJp dmF0ZV9kYXRhOyAvLyB0aGUgZHJpdmVyIGluc3RhbmNlDQp9Ow0KI2RlZmluZSBsaXN0X3RvX2lu b3RpZnlfaW5vZGVfd2F0Y2hlcihwb3MpIGxpc3RfZW50cnkoKHBvcyksIHN0cnVjdCBpbm9maXlf aW5vZGVfd2F0Y2hlciwgbGlzdCkNCg0KLyogQSBsaXN0IG9mIHRoZXNlIGlzIGF0dGFjaGVkIHRv IGVhY2ggaW5zdGFuY2Ugb2YgdGhlIGRyaXZlcg0KICogd2hlbiB0aGUgZHJpdmVycyByZWFkKCkg Z2V0cyBjYWxsZWQsIHRoaXMgbGlzdCBpcyB3YWxrZWQgYW5kDQogKiBhbGwgZXZlbnRzIHRoYXQg Y2FuIGZpdCBpbiB0aGUgYnVmZmVyIGdldCBkZWxpdmVyZWQNCiAqLw0Kc3RydWN0IGlub3RpZnlf ZXZlbnQgew0KICAgICAgICBzdHJ1Y3QgbGlzdF9oZWFkICAgICAgICBsaXN0Ow0KICAgICAgICB1 bnNpZ25lZCBsb25nICAgICAgICAgICBpX25vOw0KICAgICAgICB1bnNpZ25lZCBsb25nICAgICAg ICAgICBpX2RldjsNCiAgICAgICAgdW5zaWduZWQgbG9uZyAgICAgICAgICAgbWFzazsNCn07DQoj ZGVmaW5lIGxpc3RfdG9faW5vdGlmeV9ldmVudChwb3MpIGxpc3RfZW50cnkoKHBvcyksIHN0cnVj dCBpbm90aWZ5X2V2ZW50LCBsaXN0KQ0KDQoNCg0KLyogRm9yIGVhY2ggaW5vdGlmeSBkZXZpY2Ug d2UgbmVlZCB0byBrZWVwIGEgbGlzdCBvZiBldmVudHMgcXVldWVkIG9uIGl0DQogKiBhc3dlbGwg YXMgYSBsaXN0IG9mIGlub2RlcyB0aGF0IHdlIGFyZSB3YXRjaGluZw0KICovDQpzdHJ1Y3QgaW5v dGlmeV9kZXZpY2Ugew0KCXN0cnVjdCBsaXN0X2hlYWQgKglldmVudHM7DQoJc3RydWN0IGxpc3Rf aGVhZCAqCXdhdGNoOw0KCWF0b21pY190CQl3YXRjaF9jb3VudDsNCgljaGFyIAkJCXJlYWRfc3Rh dGU7DQoJd2FpdF9xdWV1ZV9oZWFkX3QgCXdhaXQ7DQp9Ow0KDQpzdGF0aWMgc3RydWN0IGlub3Rp ZnlfaW5vZGVfd2F0Y2hlciAqaW5vdGlmeV9pbm9kZV9maW5kX3dhdGNoZXIgKHN0cnVjdCBpbm90 aWZ5X2RldmljZSAqZGV2LCBzdHJ1Y3QgaW5vZGUgKmlub2RlKQ0Kew0KCXN0cnVjdCBpbm90aWZ5 X2lub2RlX3dhdGNoZXIgKndhdGNoZXI7DQoNCglsaXN0X2Zvcl9lYWNoX2VudHJ5ICh3YXRjaGVy LCAmaW5vZGUtPndhdGNoZXJzLCBsaXN0KQ0KCXsNCgkJLyogVGhpcyB3YXRjaGVyIGlzIGZyb20g dGhpcyBkZXZpY2UgKi8NCgkJaWYgKHdhdGNoZXItPnByaXZhdGVfZGF0YSA9PSBkZXYpDQoJCXsN CgkJCXJldHVybiB3YXRjaGVyOw0KCQl9DQoJfQ0KCXJldHVybiBOVUxMOw0KfQ0KDQpzdGF0aWMg dm9pZCBpbm90aWZ5X2lub2RlX2FkZF93YXRjaGVyIChzdHJ1Y3QgaW5vdGlmeV9kZXZpY2UgKmRl diwgc3RydWN0IGlub2RlICppbm9kZSwgdW5zaWduZWQgbG9uZyBtYXNrKQ0Kew0KCXN0cnVjdCBp bm90aWZ5X2lub2RlX3dhdGNoZXIgKndhdGNoZXI7DQoNCgl3YXRjaGVyID0gaW5vdGlmeV9pbm9k ZV9maW5kX3dhdGNoZXIgKGRldiwgaW5vZGUpOw0KDQoJCS8qIENoZWNrIGlmIHdlIGFyZSBhbHJl YWR5IHdhdGNoaW5nIHRoaXMgaW5vZGUgKi8NCglpZiAoTlVMTCAhPSB3YXRjaGVyKSB7DQoJCXdh dGNoZXItPm1hc2sgPSBtYXNrOw0KCX0gZWxzZSB7DQoJCXdhdGNoZXIgPSBrbWFsbG9jIChzaXpl b2YgKHN0cnVjdCBpbm90aWZ5X2lub2RlX3dhdGNoZXIpLCBHRlBfS0VSTkVMKTsNCgkJd2F0Y2hl ci0+cHJpdmF0ZV9kYXRhID0gZGV2Ow0KCQl3YXRjaGVyLT5pbm9kZSA9IGlub2RlOw0KCQl3YXRj aGVyLT5tYXNrID0gbWFzazsNCgkJDQoJCWF0b21pY19pbmMgKCZpbm9kZS0+d2F0Y2hlcl9jb3Vu dCk7DQoJCWxpc3RfYWRkICgmd2F0Y2hlci0+bGlzdCwgJmlub2RlLT53YXRjaGVycyk7DQoJfQ0K DQoJaW5vdGlmeV9pbm9kZV91cGRhdGVfbWFzayAoaW5vZGUpOw0KfQ0KDQpzdGF0aWMgdm9pZCBp bm90aWZ5X2lub2RlX3JtX3dhdGNoZXIgKHN0cnVjdCBpbm90aWZ5X2RldmljZSAqZGV2LCBzdHJ1 Y3QgaW5vZGUgKmlub2RlKQ0Kew0KCXN0cnVjdCBpbm90aWZ5X2lub2RlX3dhdGNoZXIgKndhdGNo ZXI7DQoNCgl3YXRjaGVyID0gaW5vdGlmeV9pbm9kZV9maW5kX3dhdGNoZXIgKGRldiwgaW5vZGUp Ow0KDQoJaWYgKE5VTEwgIT0gd2F0Y2hlcikgew0KCQlsaXN0X2RlbCgmd2F0Y2hlci0+bGlzdCk7 DQoJCWtmcmVlICh3YXRjaGVyKTsNCg0KCQlhdG9taWNfZGVjICgmaW5vZGUtPndhdGNoZXJfY291 bnQpOw0KCX0NCn0NCg0Kc3RhdGljIHN0cnVjdCBpbm90aWZ5X3dhdGNoICppbm90aWZ5X2Rldl9m aW5kX3dhdGNoZXIgKHN0cnVjdCBpbm90aWZ5X2RldmljZSAqZGV2LCBzdHJ1Y3QgaW5vZGUgKmlu b2RlKQ0KewkNCglzdHJ1Y3QgaW5vdGlmeV93YXRjaCAqd2F0Y2g7DQoNCglsaXN0X2Zvcl9lYWNo X2VudHJ5ICh3YXRjaCwgZGV2LT53YXRjaCwgbGlzdCkNCgl7DQoJCWlmICh3YXRjaC0+aW5vZGUg PT0gaW5vZGUpIHsNCgkJCXJldHVybiB3YXRjaDsNCgkJfQ0KCX0NCg0KCXJldHVybiBOVUxMOw0K fQ0KDQpzdGF0aWMgdm9pZCBpbm90aWZ5X2Rldl9hZGRfd2F0Y2hlciAoc3RydWN0IGlub3RpZnlf ZGV2aWNlICpkZXYsIHN0cnVjdCBpbm9kZSAqaW5vZGUpDQp7DQoJc3RydWN0IGlub3RpZnlfd2F0 Y2ggKndhdGNoOw0KDQoJd2F0Y2ggPSBpbm90aWZ5X2Rldl9maW5kX3dhdGNoZXIgKGRldiwgaW5v ZGUpOw0KDQoJaWYgKHdhdGNoID09IE5VTEwpDQoJew0KCQl3YXRjaCA9IGttYWxsb2MgKHNpemVv ZiAoc3RydWN0IGlub3RpZnlfd2F0Y2gpLCBHRlBfS0VSTkVMKTsNCgkJd2F0Y2gtPmlub2RlID0g aW5vZGU7DQoNCgkJYXRvbWljX2luYyAoJmRldi0+d2F0Y2hfY291bnQpOw0KCQlsaXN0X2FkZCAo JndhdGNoLT5saXN0LCBkZXYtPndhdGNoKTsNCgl9DQp9DQoNCnN0YXRpYyB2b2lkIGlub3RpZnlf ZGV2X3JtX3dhdGNoZXIgKHN0cnVjdCBpbm90aWZ5X2RldmljZSAqZGV2LCBzdHJ1Y3QgaW5vZGUg Kmlub2RlKQ0Kew0KCXN0cnVjdCBpbm90aWZ5X3dhdGNoICp3YXRjaDsNCg0KCXdhdGNoID0gaW5v dGlmeV9kZXZfZmluZF93YXRjaGVyIChkZXYsIGlub2RlKTsNCg0KCWlmIChOVUxMICE9IHdhdGNo KSB7DQoJCWxpc3RfZGVsICgmd2F0Y2gtPmxpc3QpOw0KCQlrZnJlZSAod2F0Y2gpOw0KDQoJCWF0 b21pY19kZWMgKCZkZXYtPndhdGNoX2NvdW50KTsNCgl9IA0KfQ0KDQpzdGF0aWMgY2hhciBpbm90 aWZ5X2Rldl9oYXNfZXZlbnRzIChzdHJ1Y3QgaW5vdGlmeV9kZXZpY2UgKmRldikNCnsNCglyZXR1 cm4gZGV2LT5ldmVudHMgJiYgIWxpc3RfZW1wdHkoZGV2LT5ldmVudHMpOw0KfQ0KDQpzdGF0aWMg dm9pZCBpbm90aWZ5X2Rldl9ldmVudF9kZXF1ZXVlIChzdHJ1Y3QgaW5vdGlmeV9kZXZpY2UgKmRl dikNCnsNCglzdHJ1Y3QgaW5vdGlmeV9ldmVudCAqZXZlbnQ7DQoNCglpZiAobGlzdF9lbXB0eSAo ZGV2LT5ldmVudHMpKSB7DQoJCXJldHVybjsNCgl9DQoNCgkvKiBHZXQgdGhlIGZpcnN0IGVudHJ5 IGZyb20gdGhlIGV2ZW50IHF1ZXVlICovDQoJZXZlbnQgPSBsaXN0X3RvX2lub3RpZnlfZXZlbnQg KGRldi0+ZXZlbnRzLT5uZXh0KTsNCglsaXN0X2RlbCAoJmV2ZW50LT5saXN0KTsNCg0KCWtmcmVl IChldmVudCk7DQp9DQoNCnN0YXRpYyB2b2lkIGlub3RpZnlfZGV2X2V2ZW50X3F1ZXVlIChzdHJ1 Y3QgaW5vdGlmeV9kZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBpX25vLCB1bnNpZ25lZCBsb25n IGlfZGV2LCB1bnNpZ25lZCBsb25nIG1hc2spDQp7DQoJc3RydWN0IGlub3RpZnlfZXZlbnQgKmV2 ZW50Ow0KDQoJZXZlbnQgPSBrbWFsbG9jIChzaXplb2YgKHN0cnVjdCBpbm90aWZ5X2V2ZW50KSwg R0ZQX0tFUk5FTCk7DQoJZXZlbnQtPmlfbm8gPSBpX25vOw0KCWV2ZW50LT5pX2RldiA9IGlfZGV2 Ow0KCWV2ZW50LT5tYXNrID0gbWFzazsNCg0KCWxpc3RfYWRkX3RhaWwgKCZldmVudC0+bGlzdCwg ZGV2LT5ldmVudHMpOw0KfQ0KDQovKiBLZXJuZWwgQVBJICovDQp2b2lkIGlub3RpZnlfaW5vZGVf cXVldWVfZXZlbnQgKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHVuc2lnbmVkIGxvbmcgbWFzaykNCnsN CglzdHJ1Y3QgaW5vdGlmeV9pbm9kZV93YXRjaGVyICp3YXRjaGVyOw0KDQoJLyogSWYgdGhpcyBp bm9kZSBpc24ndCBpbnRlcmVzdGVkIGluIHRoZSBldmVudCAqLw0KCWlmICghKGlub2RlLT53YXRj aGVyc19tYXNrICYgbWFzaykpIHsNCgkJcmV0dXJuOw0KCX0NCg0KCWxpc3RfZm9yX2VhY2hfZW50 cnkgKHdhdGNoZXIsICZpbm9kZS0+d2F0Y2hlcnMsIGxpc3QpIHsNCgkJaWYgKHdhdGNoZXItPm1h c2sgJiBtYXNrKSB7DQoJCQlpbm90aWZ5X2Rldl9ldmVudF9xdWV1ZSAod2F0Y2hlci0+cHJpdmF0 ZV9kYXRhLCBpbm9kZS0+aV9pbm8sIG5ld19lbmNvZGVfZGV2IChpbm9kZS0+aV9zYi0+c19kZXYp LCBtYXNrKTsNCgkJfQ0KCX0NCn0NCkVYUE9SVF9TWU1CT0xfR1BMKGlub3RpZnlfaW5vZGVfcXVl dWVfZXZlbnQpOw0KDQovKiBCYXNlZCBvbiBkbm90aWZ5X3BhcmVudCAtLSBsb2NraW5nIG1heSBi ZSBicm9rZW4gKi8NCnZvaWQgaW5vdGlmeV9kZW50cnlfcXVldWVfZXZlbnQgKHN0cnVjdCBkZW50 cnkgKmRlbnRyeSwgdW5zaWduZWQgbG9uZyBtYXNrKQ0Kew0KCXN0cnVjdCBkZW50cnkgKnBhcmVu dDsNCg0KCXNwaW5fbG9jaygmZGVudHJ5LT5kX2xvY2spOw0KCXBhcmVudCA9IGRlbnRyeS0+ZF9w YXJlbnQ7DQoJZGdldCAocGFyZW50KTsNCglpbm90aWZ5X2lub2RlX3F1ZXVlX2V2ZW50IChwYXJl bnQtPmRfaW5vZGUsIG1hc2spOw0KCWRwdXQgKHBhcmVudCk7DQoJc3Bpbl91bmxvY2soJmRlbnRy eS0+ZF9sb2NrKTsNCn0NCkVYUE9SVF9TWU1CT0xfR1BMKGlub3RpZnlfZGVudHJ5X3F1ZXVlX2V2 ZW50KTsNCg0KDQp2b2lkIGlub3RpZnlfaW5vZGVfdXBkYXRlX21hc2sgKHN0cnVjdCBpbm9kZSAq aW5vZGUpDQp7DQoJc3RydWN0IGlub3RpZnlfaW5vZGVfd2F0Y2hlciAqd2F0Y2hlcjsNCgl1bnNp Z25lZCBsb25nIG5ld19tYXNrOw0KDQoJbmV3X21hc2sgPSAwOw0KCWxpc3RfZm9yX2VhY2hfZW50 cnkgKHdhdGNoZXIsICZpbm9kZS0+d2F0Y2hlcnMsIGxpc3QpIHsNCgkJbmV3X21hc2sgfD0gd2F0 Y2hlci0+bWFzazsNCgl9DQoJaW5vZGUtPndhdGNoZXJzX21hc2sgPSBuZXdfbWFzazsNCn0NCkVY UE9SVF9TWU1CT0xfR1BMKGlub3RpZnlfaW5vZGVfdXBkYXRlX21hc2spOw0KDQovKiBUaGUgZHJp dmVyIGludGVyZmFjZSBpcyBpbXBsZW1lbnRlZCBiZWxvdyAqLw0KDQojZGVmaW5lIElOT1RJRllf UkVBRF9TVEFURV9JTk9ERSAwDQojZGVmaW5lIElOT1RJRllfUkVBRF9TVEFURV9ERVYJIDENCiNk ZWZpbmUgSU5PVElGWV9SRUFEX1NUQVRFX01BU0sgIDINCg0Kc3RhdGljIHNzaXplX3QgaW5vdGlm eV9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyICpidWYsDQoJCQkgICBzaXplX3QgY291bnQs IGxvZmZfdCAqcG9zKSB7DQoJc3RydWN0IGlub3RpZnlfZGV2aWNlICpkZXY7DQoJc2l6ZV90IG91 dDsNCg0KCW91dCA9IDA7DQoNCglkZXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7DQoNCglpZiAoIWlu b3RpZnlfZGV2X2hhc19ldmVudHMgKGRldikpIHsNCgkJcmV0dXJuIDA7DQoJfQ0KDQoJd2hpbGUg KG91dCA8IGNvdW50ICYmIGlub3RpZnlfZGV2X2hhc19ldmVudHMgKGRldikpIHsNCgkJc3RydWN0 IGlub3RpZnlfZXZlbnQgKmV2ZW50Ow0KDQoJCWV2ZW50ID0gbGlzdF90b19pbm90aWZ5X2V2ZW50 IChkZXYtPmV2ZW50cy0+bmV4dCk7DQoNCgkJc3dpdGNoIChkZXYtPnJlYWRfc3RhdGUpIHsNCgkJ CWNhc2UgSU5PVElGWV9SRUFEX1NUQVRFX0lOT0RFOg0KCQkJCWlmIChwdXRfdXNlciAoZXZlbnQt Pmlfbm8sIGJ1ZikpDQoJCQkJCXJldHVybiAtRUZBVUxUOw0KCQkJCWJ1ZiArPSBzaXplb2YgKGV2 ZW50LT5pX25vKTsNCgkJCQlkZXYtPnJlYWRfc3RhdGUrKzsNCgkJCWJyZWFrOw0KCQkJY2FzZSBJ Tk9USUZZX1JFQURfU1RBVEVfREVWOg0KCQkJCWlmIChwdXRfdXNlciAoZXZlbnQtPmlfZGV2LCBi dWYpKQ0KCQkJCQlyZXR1cm4gLUVGQVVMVDsNCgkJCQlidWYgKz0gc2l6ZW9mIChldmVudC0+aV9k ZXYpOw0KCQkJCWRldi0+cmVhZF9zdGF0ZSsrOw0KCQkJYnJlYWs7DQoJCQljYXNlIElOT1RJRllf UkVBRF9TVEFURV9NQVNLOg0KCQkJCWlmIChwdXRfdXNlciAoZXZlbnQtPm1hc2ssIGJ1ZikpDQoJ CQkJCXJldHVybiAtRUZBVUxUOw0KCQkJCWJ1ZiArPSBzaXplb2YgKGV2ZW50LT5tYXNrKTsNCgkJ CQlkZXYtPnJlYWRfc3RhdGUgPSBJTk9USUZZX1JFQURfU1RBVEVfSU5PREU7DQoJCQkJLyogV2Ug aGF2ZSBmaW5pc2hlZCBkZWxpdmVyaW5nIHRoZSBjb21wbGV0ZSBldmVudCwgc28gZGVxdWV1ZSBp dCAqLw0KCQkJCWlub3RpZnlfZGV2X2V2ZW50X2RlcXVldWUgKGRldik7DQoJCQlicmVhazsNCgkJ CWRlZmF1bHQ6DQoJCQkJLyogQlVHICovDQoJCQlicmVhazsNCgkJfQ0KDQoJCW91dCsrOw0KCX0N Cg0KCXJldHVybiBvdXQ7DQp9DQoNCnN0YXRpYyB1bnNpZ25lZCBpbnQgaW5vdGlmeV9wb2xsKHN0 cnVjdCBmaWxlICpmaWxlLCBwb2xsX3RhYmxlICp3YWl0KSB7DQoJc3RydWN0IGlub3RpZnlfZGV2 aWNlICpkZXY7DQoNCglkZXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7DQoNCglwb2xsX3dhaXQgKGZp bGUsICZkZXYtPndhaXQsIHdhaXQpOw0KDQoJaWYgKGlub3RpZnlfZGV2X2hhc19ldmVudHMgKGRl dikpDQoJCXJldHVybiBQT0xMSU4gfCBQT0xMUkROT1JNOw0KDQoJcmV0dXJuIDA7DQp9DQoNCnN0 YXRpYyBpbnQgaW5vdGlmeV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpm aWxlKSB7DQoJc3RydWN0IGlub3RpZnlfZGV2aWNlICpkZXY7DQoNCglpZiAod2F0Y2hlcl9jb3Vu dCA9PSBNQVhfV0FUQ0hFUl9DT1VOVCkNCgkJcmV0dXJuIC1FTk9ERVY7DQoNCgl3YXRjaGVyX2Nv dW50Kys7DQoNCglkZXYgPSBrbWFsbG9jIChzaXplb2YgKHN0cnVjdCBpbm90aWZ5X2RldmljZSks IEdGUF9LRVJORUwpOw0KCWRldi0+ZXZlbnRzID0ga21hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgbGlz dF9oZWFkKSwgR0ZQX0tFUk5FTCk7DQoJSU5JVF9MSVNUX0hFQUQoZGV2LT5ldmVudHMpOw0KCWRl di0+d2F0Y2ggPSBrbWFsbG9jIChzaXplb2YgKHN0cnVjdCBsaXN0X2hlYWQpLCBHRlBfS0VSTkVM KTsNCglJTklUX0xJU1RfSEVBRChkZXYtPndhdGNoKTsNCglhdG9taWNfc2V0KCZkZXYtPndhdGNo X2NvdW50LCAwKTsNCglkZXYtPnJlYWRfc3RhdGUgPSBJTk9USUZZX1JFQURfU1RBVEVfSU5PREU7 DQoJaW5pdF93YWl0cXVldWVfaGVhZCAoJmRldi0+d2FpdCk7DQoNCglmaWxlLT5wcml2YXRlX2Rh dGEgPSBkZXY7DQoNCglyZXR1cm4gMDsNCn0NCg0Kc3RhdGljIHZvaWQgaW5vdGlmeV9yZWxlYXNl X2FsbF93YXRjaGVycyAoc3RydWN0IGlub3RpZnlfZGV2aWNlICpkZXYpDQp7DQoJc3RydWN0IGlu b3RpZnlfd2F0Y2ggKndhdGNoOw0KDQoJbGlzdF9mb3JfZWFjaF9lbnRyeSAod2F0Y2gsIGRldi0+ d2F0Y2gsIGxpc3QpIHsNCgkJLyogUmVtb3ZlIHRoZSB3YXRjaGVyIGZyb20gdGhlIGlub2RlICov DQoJCWlub3RpZnlfaW5vZGVfcm1fd2F0Y2hlciAoZGV2LCB3YXRjaC0+aW5vZGUpOw0KCQkvKiBS ZW1vdmUgdGhlIGlub2RlIGZyb20gdGhlIGRldmljZSAqLw0KCQlpbm90aWZ5X2Rldl9ybV93YXRj aGVyIChkZXYsIHdhdGNoLT5pbm9kZSk7DQoNCgl9DQp9DQoNCnN0YXRpYyB2b2lkIGlub3RpZnlf cmVsZWFzZV9hbGxfZXZlbnRzIChzdHJ1Y3QgaW5vdGlmeV9kZXZpY2UgKmRldikNCnsNCgl3aGls ZSAoaW5vdGlmeV9kZXZfaGFzX2V2ZW50cyAoZGV2KSkgew0KCQlpbm90aWZ5X2Rldl9ldmVudF9k ZXF1ZXVlIChkZXYpOw0KCX0NCn0NCg0KDQpzdGF0aWMgaW50IGlub3RpZnlfcmVsZWFzZShzdHJ1 Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkNCnsNCglpZiAoZmlsZS0+cHJpdmF0 ZV9kYXRhKSB7DQoJCXN0cnVjdCBpbm90aWZ5X2RldmljZSAqZGV2Ow0KDQoJCWRldiA9IChzdHJ1 Y3QgaW5vdGlmeV9kZXZpY2UgKilmaWxlLT5wcml2YXRlX2RhdGE7DQoNCgkJaW5vdGlmeV9yZWxl YXNlX2FsbF93YXRjaGVycyAoZGV2KTsNCgkJa2ZyZWUgKGRldi0+d2F0Y2gpOw0KDQoJCWlub3Rp ZnlfcmVsZWFzZV9hbGxfZXZlbnRzIChkZXYpOw0KCQlrZnJlZSAoZGV2LT5ldmVudHMpOw0KDQoJ CWtmcmVlIChkZXYpOw0KCX0NCg0KCXdhdGNoZXJfY291bnQtLTsNCglyZXR1cm4gMDsNCn0NCg0K c3RhdGljIHN0cnVjdCBpbm9kZSAqaW5vdGlmeV9maW5kX2lub2RlIChzdHJ1Y3QgaW5vdGlmeV9w YWNrZXQgKnBhY2tldCkNCnsNCglzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnM7DQoJc3RydWN0IGlub2Rl ICppbm9kZTsNCg0KCXMgPSB1c2VyX2dldF9zdXBlciAobmV3X2RlY29kZV9kZXYocGFja2V0LT5p X2RldikpOw0KDQoJaWYgKCFzKSB7DQoJCXJldHVybiBOVUxMOw0KCX0NCg0KCWlub2RlID0gaWxv b2t1cCAocywgcGFja2V0LT5pX25vKTsNCg0KCWRyb3Bfc3VwZXIocyk7DQoNCglpZiAoIWlub2Rl KSB7DQoJCXJldHVybiBOVUxMOw0KCX0NCg0KCS8qIGlsb29rdXAgdGFrZXMgYSByZWZlcmVuY2Ug b24gdGhlIGlub2RlLCByZWxlYXNlIGl0ICovDQoJaXB1dCAoaW5vZGUpOw0KCXJldHVybiBpbm9k ZTsNCn0NCg0Kc3RhdGljIGludCBpbm90aWZ5X3dhdGNoKHN0cnVjdCBpbm90aWZ5X2RldmljZSAq ZGV2LCBzdHJ1Y3QgaW5vdGlmeV9wYWNrZXQgKnBhY2tldCkNCnsNCglpbnQgZXJyOw0KCXN0cnVj dCBpbm9kZSAqaW5vZGU7DQoJZXJyID0gMDsNCg0KCWlub2RlID0gaW5vdGlmeV9maW5kX2lub2Rl IChwYWNrZXQpOw0KDQoJaWYgKCFpbm9kZSkgew0KCQllcnIgPSAtRU5PRU5UOw0KCQlnb3RvIG91 dDsNCgl9DQoNCglpbm90aWZ5X2lub2RlX2FkZF93YXRjaGVyIChkZXYsIGlub2RlLCBwYWNrZXQt Pm1hc2spOw0KCWlub3RpZnlfZGV2X2FkZF93YXRjaGVyIChkZXYsIGlub2RlKTsNCm91dDoNCgly ZXR1cm4gZXJyOw0KfQ0KDQpzdGF0aWMgaW50IGlub3RpZnlfaWdub3JlKHN0cnVjdCBpbm90aWZ5 X2RldmljZSAqZGV2LCBzdHJ1Y3QgaW5vdGlmeV9wYWNrZXQgKnBhY2tldCkNCnsNCglpbnQgZXJy Ow0KCXN0cnVjdCBpbm9kZSAqaW5vZGU7DQoJZXJyID0gMDsNCg0KCWlub2RlID0gaW5vdGlmeV9m aW5kX2lub2RlIChwYWNrZXQpOw0KDQoJaWYgKCFpbm9kZSkgew0KCQllcnIgPSAtRU5PRU5UOw0K CQlnb3RvIG91dDsNCgl9DQoNCglpbm90aWZ5X2lub2RlX3JtX3dhdGNoZXIgKGRldiwgaW5vZGUp Ow0KCWlub3RpZnlfZGV2X3JtX3dhdGNoZXIgKGRldiwgaW5vZGUpOw0Kb3V0Og0KCXJldHVybiBl cnI7DQp9DQoNCnN0YXRpYyBpbnQgaW5vdGlmeV9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlwLCBzdHJ1 Y3QgZmlsZSAqZnAsDQoJCQkgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpIHsN CglpbnQgZXJyOw0KCXN0cnVjdCBpbm90aWZ5X2RldmljZSAqZGV2Ow0KCXN0cnVjdCBpbm90aWZ5 X3BhY2tldCAqcGFja2V0Ow0KDQoJZGV2ID0gZnAtPnByaXZhdGVfZGF0YTsNCgllcnIgPSAwOw0K DQoJaWYgKF9JT0NfVFlQRShjbWQpICE9IElOT1RJRllfSU9DVExfTUFHSUMpIHJldHVybiAtRUlO VkFMOw0KCWlmIChfSU9DX05SKGNtZCkgPiBJTk9USUZZX0lPQ1RMX01BWE5SKSByZXR1cm4gLUVJ TlZBTDsNCg0KCWlmIChfSU9DX0RJUihjbWQpICYgX0lPQ19SRUFEKQ0KCQllcnIgPSAhYWNjZXNz X29rIChWRVJJRllfV1JJVEUsICh2b2lkICopYXJnLCBfSU9DX1NJWkUoY21kKSk7DQoJaWYgKF9J T0NfRElSKGNtZCkgJiBfSU9DX1dSSVRFKQ0KCQllcnIgPSAhYWNjZXNzX29rIChWRVJJRllfUkVB RCwgKHZvaWQgKilhcmcsIF9JT0NfU0laRShjbWQpKTsNCg0KCWlmIChlcnIpIHJldHVybiAtRUZB VUxUOw0KDQoJcGFja2V0ID0ga21hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgaW5vdGlmeV9wYWNrZXQp LCBHRlBfS0VSTkVMKTsNCg0KCWlmIChjb3B5X2Zyb21fdXNlciAocGFja2V0LCAodm9pZCAqKWFy Zywgc2l6ZW9mIChzdHJ1Y3QgaW5vdGlmeV9wYWNrZXQpKSkgew0KCQllcnIgPSAtRUZBVUxUOw0K CQlnb3RvIG91dDsNCgl9DQoNCgllcnIgPSAtRUlOVkFMOw0KDQoJc3dpdGNoIChjbWQpIHsNCgkJ Y2FzZSBJTk9USUZZX1dBVENIOg0KCQkJcHJpbnRrKEtFUk5fQUxFUlQgImlub3RpZnkgV0FUQ0g6 ICVsZCAlbGQgJWxkXG4iLCBwYWNrZXQtPmlfbm8sIHBhY2tldC0+aV9kZXYsIHBhY2tldC0+bWFz ayk7DQoJCQllcnIgPSBpbm90aWZ5X3dhdGNoIChkZXYsIHBhY2tldCk7DQoJCWJyZWFrOw0KCQlj YXNlIElOT1RJRllfSUdOT1JFOg0KCQkJcHJpbnRrKEtFUk5fQUxFUlQgImlub3RpZnkgSUdOT1JF OiAlbGQgJWxkXG4iLCBwYWNrZXQtPmlfbm8sIHBhY2tldC0+aV9kZXYpOw0KCQkJZXJyID0gaW5v dGlmeV9pZ25vcmUgKGRldiwgcGFja2V0KTsNCgkJYnJlYWs7DQoJfQ0Kb3V0Og0KCWtmcmVlIChw YWNrZXQpOw0KCXJldHVybiBlcnI7DQp9DQoNCnN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25z IGlub3RpZnlfZm9wcyA9IHsNCgkub3duZXIJCT0gVEhJU19NT0RVTEUsDQoJLnJlYWQJCT0gaW5v dGlmeV9yZWFkLA0KCS5wb2xsCQk9IGlub3RpZnlfcG9sbCwNCgkub3BlbgkJPSBpbm90aWZ5X29w ZW4sDQoJLnJlbGVhc2UJPSBpbm90aWZ5X3JlbGVhc2UsDQoJLmlvY3RsCQk9IGlub3RpZnlfaW9j dGwsDQp9Ow0KDQpzdHJ1Y3QgbWlzY2RldmljZSBpbm90aWZ5X2RldmljZSA9IHsNCgkubWlub3Ig ID0gSU5PVElGWV9NSU5PUiwNCgkubmFtZQk9ICJpbm90aWZ5IiwNCgkuZm9wcwk9ICZpbm90aWZ5 X2ZvcHMsDQp9Ow0KDQoNCnN0YXRpYyBpbnQgX19pbml0IGlub3RpZnlfaW5pdCAodm9pZCkNCnsN CglpbnQgcmV0Ow0KDQoJcmV0ID0gbWlzY19yZWdpc3RlciAoJmlub3RpZnlfZGV2aWNlKTsNCg0K CWlmIChyZXQpIHsNCgkJZ290byBvdXQ7DQoJfQ0KDQoJcmV0ID0gMDsNCglwcmludGsoS0VSTl9B TEVSVCAiaW5vdGlmeSAwLjEgc3RhcnR1cFxuIik7DQpvdXQ6DQoJcmV0dXJuIHJldDsNCn0NCg0K c3RhdGljIHZvaWQgaW5vdGlmeV9leGl0ICh2b2lkKQ0Kew0KCW1pc2NfZGVyZWdpc3RlciAoJmlu b3RpZnlfZGV2aWNlKTsNCglwcmludGsoS0VSTl9BTEVSVCAiaW5vdGlmeSAwLjEgc2h1dGRvd25c biIpOw0KfQ0KDQoNCk1PRFVMRV9BVVRIT1IoIkpvaG4gTWNDdXRjaGFuIDx0dGJAdGVudGFjbGUu ZGhzLm9yZz4iKTsNCk1PRFVMRV9ERVNDUklQVElPTigiSW5vZGUgZXZlbnQgZHJpdmVyIik7DQpN T0RVTEVfTElDRU5TRSgiR1BMIik7DQoNCm1vZHVsZV9pbml0IChpbm90aWZ5X2luaXQpOw0KbW9k dWxlX2V4aXQgKGlub3RpZnlfZXhpdCk7DQo= --=-E4Xo9teWbY6Gsf9ZbKrl--