diff for duplicates of <1517334602.5412.3.camel@primarydata.com> diff --git a/a/1.txt b/N1/1.txt index 11e24ee..f617a13 100644 --- a/a/1.txt +++ b/N1/1.txt @@ -103,4 +103,3 @@ inode_peek_iversion_raw() and shift 'old'? Trond Myklebust Linux NFS client maintainer, PrimaryData trond.myklebust@primarydata.com -ÿôèº{.nÇ+·®+%Ëÿ±éݶ\x17¥wÿº{.nÇ+·¥{±ý»k~ÏâØ^nr¡ö¦zË\x1aëh¨èÚ&£ûàz¿äz¹Þú+Ê+zf£¢·h§~Ûiÿÿïêÿêçz_è®\x0fæj:+v¨þ)ߣøm diff --git a/a/content_digest b/N1/content_digest index e372c4c..5891c68 100644 --- a/a/content_digest +++ b/N1/content_digest @@ -118,7 +118,6 @@ "-- \n" "Trond Myklebust\n" "Linux NFS client maintainer, PrimaryData\n" - "trond.myklebust@primarydata.com\n" - "\303\277\303\264\303\250\302\272{.n\303\207+\302\211\302\267\302\237\302\256\302\211\302\255\302\206+%\302\212\303\213\303\277\302\261\303\251\303\235\302\266\027\302\245\302\212w\303\277\302\272{.n\303\207+\302\211\302\267\302\245\302\212{\302\261\303\275\302\273k~\303\217\303\242\302\236\303\230^n\302\207r\302\241\303\266\302\246z\303\213\032\302\201\303\253h\302\231\302\250\303\250\302\255\303\232&\302\243\303\273\303\240z\302\277\303\244z\302\271\303\236\302\227\303\272+\302\200\303\212+zf\302\243\302\242\302\267h\302\232\302\210\302\247~\302\206\302\255\302\206\303\233i\303\277\303\277\303\257\302\201\303\252\303\277\302\221\303\252\303\247z_\303\250\302\256\017\303\246j:+v\302\211\302\250\303\276)\303\237\302\243\303\270m" + trond.myklebust@primarydata.com -7136147e0b37f2b79cf58f1d1beeeb8d5b69a489dffadedb1bd6ec795eb867e4 +66d5cb6bf02cdf31d61b48ec9d5eb0fef7e284b25675083098d1e371c51dc596
diff --git a/a/1.txt b/N2/1.txt index 11e24ee..2c37b6f 100644 --- a/a/1.txt +++ b/N2/1.txt @@ -1,106 +1,64 @@ -On Tue, 2018-01-30 at 12:31 -0500, Jeff Layton wrote: -> From: Jeff Layton <jlayton@redhat.com> -> -> As Linus points out: -> -> The inode_cmp_iversion{+raw}() functions are pure and utter crap. -> -> Why? -> -> You say that they return 0/negative/positive, but they do so in a -> completely broken manner. They return that ternary value as the -> sequence number difference in a 's64', which means that if you -> actually care about that ternary value, and do the *sane* thing -> that -> the kernel-doc of the function implies is the right thing, you -> would -> do -> -> int cmp = inode_cmp_iversion(inode, old); -> if (cmp < 0 ... -> -> and as a result you get code that looks sane, but that doesn't -> actually *WORK* right. -> -> Since none of the callers actually care about the ternary value here, -> convert the inode_cmp_iversion{+raw} functions to just return a -> boolean -> value (false for matching, true for non-matching). -> -> This matches the existing use of these functions just fine, and makes -> it -> simple to convert them to return a ternary value in the future if we -> grow callers that need it. -> -> Signed-off-by: Jeff Layton <jlayton@redhat.com> -> --- -> include/linux/iversion.h | 20 +++++++++----------- -> 1 file changed, 9 insertions(+), 11 deletions(-) -> -> diff --git a/include/linux/iversion.h b/include/linux/iversion.h -> index 858463fca249..ace32775c5f0 100644 -> --- a/include/linux/iversion.h -> +++ b/include/linux/iversion.h -> @@ -309,13 +309,13 @@ inode_query_iversion(struct inode *inode) -> * @inode: inode to check -> * @old: old value to check against its i_version -> * -> - * Compare the current raw i_version counter with a previous one. -> Returns 0 if -> - * they are the same or non-zero if they are different. -> + * Compare the current raw i_version counter with a previous one. -> Returns false -> + * if they are the same or true if they are different. -> */ -> -static inline s64 -> +static inline bool -> inode_cmp_iversion_raw(const struct inode *inode, u64 old) -> { -> - return (s64)inode_peek_iversion_raw(inode) - (s64)old; -> + return inode_peek_iversion_raw(inode) != old; -> } -> -> /** -> @@ -323,19 +323,17 @@ inode_cmp_iversion_raw(const struct inode -> *inode, u64 old) -> * @inode: inode to check -> * @old: old value to check against its i_version -> * -> - * Compare an i_version counter with a previous one. Returns 0 if -> they are -> - * the same, a positive value if the one in the inode appears newer -> than @old, -> - * and a negative value if @old appears to be newer than the one in -> the -> - * inode. -> + * Compare an i_version counter with a previous one. Returns false -> if they are -> + * the same, and true if they are different. -> * -> * Note that we don't need to set the QUERIED flag in this case, as -> the value -> * in the inode is not being recorded for later use. -> */ -> -> -static inline s64 -> +static inline bool -> inode_cmp_iversion(const struct inode *inode, u64 old) -> { -> - return (s64)(inode_peek_iversion_raw(inode) & -> ~I_VERSION_QUERIED) - -> - (s64)(old << I_VERSION_QUERIED_SHIFT); -> + return (inode_peek_iversion_raw(inode) & ~I_VERSION_QUERIED) -> != -> + (old << I_VERSION_QUERIED_SHIFT); -> } - -Is there any reason why this couldn't just use inode_peek_iversion() -instead of having to both mask the output from -inode_peek_iversion_raw() and shift 'old'? - -> #endif --- -Trond Myklebust -Linux NFS client maintainer, PrimaryData -trond.myklebust@primarydata.com -ÿôèº{.nÇ+·®+%Ëÿ±éݶ\x17¥wÿº{.nÇ+·¥{±ý»k~ÏâØ^nr¡ö¦zË\x1aëh¨èÚ&£ûàz¿äz¹Þú+Ê+zf£¢·h§~Ûiÿÿïêÿêçz_è®\x0fæj:+v¨þ)ߣøm +T24gVHVlLCAyMDE4LTAxLTMwIGF0IDEyOjMxIC0wNTAwLCBKZWZmIExheXRvbiB3cm90ZToNCj4g +RnJvbTogSmVmZiBMYXl0b24gPGpsYXl0b25AcmVkaGF0LmNvbT4NCj4gDQo+IEFzIExpbnVzIHBv +aW50cyBvdXQ6DQo+IA0KPiAgICAgVGhlIGlub2RlX2NtcF9pdmVyc2lvbnsrcmF3fSgpIGZ1bmN0 +aW9ucyBhcmUgcHVyZSBhbmQgdXR0ZXIgY3JhcC4NCj4gDQo+ICAgICBXaHk/DQo+IA0KPiAgICAg +WW91IHNheSB0aGF0IHRoZXkgcmV0dXJuIDAvbmVnYXRpdmUvcG9zaXRpdmUsIGJ1dCB0aGV5IGRv +IHNvIGluIGENCj4gICAgIGNvbXBsZXRlbHkgYnJva2VuIG1hbm5lci4gVGhleSByZXR1cm4gdGhh +dCB0ZXJuYXJ5IHZhbHVlIGFzIHRoZQ0KPiAgICAgc2VxdWVuY2UgbnVtYmVyIGRpZmZlcmVuY2Ug +aW4gYSAnczY0Jywgd2hpY2ggbWVhbnMgdGhhdCBpZiB5b3UNCj4gICAgIGFjdHVhbGx5IGNhcmUg +YWJvdXQgdGhhdCB0ZXJuYXJ5IHZhbHVlLCBhbmQgZG8gdGhlICpzYW5lKiB0aGluZw0KPiB0aGF0 +DQo+ICAgICB0aGUga2VybmVsLWRvYyBvZiB0aGUgZnVuY3Rpb24gaW1wbGllcyBpcyB0aGUgcmln +aHQgdGhpbmcsIHlvdQ0KPiB3b3VsZA0KPiAgICAgZG8NCj4gDQo+ICAgICAgICAgaW50IGNtcCA9 +IGlub2RlX2NtcF9pdmVyc2lvbihpbm9kZSwgb2xkKTsNCj4gICAgICAgICBpZiAoY21wIDwgMCAu +Li4NCj4gDQo+ICAgICBhbmQgYXMgYSByZXN1bHQgeW91IGdldCBjb2RlIHRoYXQgbG9va3Mgc2Fu +ZSwgYnV0IHRoYXQgZG9lc24ndA0KPiAgICAgYWN0dWFsbHkgKldPUksqIHJpZ2h0Lg0KPiANCj4g +U2luY2Ugbm9uZSBvZiB0aGUgY2FsbGVycyBhY3R1YWxseSBjYXJlIGFib3V0IHRoZSB0ZXJuYXJ5 +IHZhbHVlIGhlcmUsDQo+IGNvbnZlcnQgdGhlIGlub2RlX2NtcF9pdmVyc2lvbnsrcmF3fSBmdW5j +dGlvbnMgdG8ganVzdCByZXR1cm4gYQ0KPiBib29sZWFuDQo+IHZhbHVlIChmYWxzZSBmb3IgbWF0 +Y2hpbmcsIHRydWUgZm9yIG5vbi1tYXRjaGluZykuDQo+IA0KPiBUaGlzIG1hdGNoZXMgdGhlIGV4 +aXN0aW5nIHVzZSBvZiB0aGVzZSBmdW5jdGlvbnMganVzdCBmaW5lLCBhbmQgbWFrZXMNCj4gaXQN +Cj4gc2ltcGxlIHRvIGNvbnZlcnQgdGhlbSB0byByZXR1cm4gYSB0ZXJuYXJ5IHZhbHVlIGluIHRo +ZSBmdXR1cmUgaWYgd2UNCj4gZ3JvdyBjYWxsZXJzIHRoYXQgbmVlZCBpdC4NCj4gDQo+IFNpZ25l +ZC1vZmYtYnk6IEplZmYgTGF5dG9uIDxqbGF5dG9uQHJlZGhhdC5jb20+DQo+IC0tLQ0KPiAgaW5j +bHVkZS9saW51eC9pdmVyc2lvbi5oIHwgMjAgKysrKysrKysrLS0tLS0tLS0tLS0NCj4gIDEgZmls +ZSBjaGFuZ2VkLCA5IGluc2VydGlvbnMoKyksIDExIGRlbGV0aW9ucygtKQ0KPiANCj4gZGlmZiAt +LWdpdCBhL2luY2x1ZGUvbGludXgvaXZlcnNpb24uaCBiL2luY2x1ZGUvbGludXgvaXZlcnNpb24u +aA0KPiBpbmRleCA4NTg0NjNmY2EyNDkuLmFjZTMyNzc1YzVmMCAxMDA2NDQNCj4gLS0tIGEvaW5j +bHVkZS9saW51eC9pdmVyc2lvbi5oDQo+ICsrKyBiL2luY2x1ZGUvbGludXgvaXZlcnNpb24uaA0K +PiBAQCAtMzA5LDEzICszMDksMTMgQEAgaW5vZGVfcXVlcnlfaXZlcnNpb24oc3RydWN0IGlub2Rl +ICppbm9kZSkNCj4gICAqIEBpbm9kZTogaW5vZGUgdG8gY2hlY2sNCj4gICAqIEBvbGQ6IG9sZCB2 +YWx1ZSB0byBjaGVjayBhZ2FpbnN0IGl0cyBpX3ZlcnNpb24NCj4gICAqDQo+IC0gKiBDb21wYXJl +IHRoZSBjdXJyZW50IHJhdyBpX3ZlcnNpb24gY291bnRlciB3aXRoIGEgcHJldmlvdXMgb25lLg0K +PiBSZXR1cm5zIDAgaWYNCj4gLSAqIHRoZXkgYXJlIHRoZSBzYW1lIG9yIG5vbi16ZXJvIGlmIHRo +ZXkgYXJlIGRpZmZlcmVudC4NCj4gKyAqIENvbXBhcmUgdGhlIGN1cnJlbnQgcmF3IGlfdmVyc2lv +biBjb3VudGVyIHdpdGggYSBwcmV2aW91cyBvbmUuDQo+IFJldHVybnMgZmFsc2UNCj4gKyAqIGlm +IHRoZXkgYXJlIHRoZSBzYW1lIG9yIHRydWUgaWYgdGhleSBhcmUgZGlmZmVyZW50Lg0KPiAgICov +DQo+IC1zdGF0aWMgaW5saW5lIHM2NA0KPiArc3RhdGljIGlubGluZSBib29sDQo+ICBpbm9kZV9j +bXBfaXZlcnNpb25fcmF3KGNvbnN0IHN0cnVjdCBpbm9kZSAqaW5vZGUsIHU2NCBvbGQpDQo+ICB7 +DQo+IC0JcmV0dXJuIChzNjQpaW5vZGVfcGVla19pdmVyc2lvbl9yYXcoaW5vZGUpIC0gKHM2NClv +bGQ7DQo+ICsJcmV0dXJuIGlub2RlX3BlZWtfaXZlcnNpb25fcmF3KGlub2RlKSAhPSBvbGQ7DQo+ +ICB9DQo+ICANCj4gIC8qKg0KPiBAQCAtMzIzLDE5ICszMjMsMTcgQEAgaW5vZGVfY21wX2l2ZXJz +aW9uX3Jhdyhjb25zdCBzdHJ1Y3QgaW5vZGUNCj4gKmlub2RlLCB1NjQgb2xkKQ0KPiAgICogQGlu +b2RlOiBpbm9kZSB0byBjaGVjaw0KPiAgICogQG9sZDogb2xkIHZhbHVlIHRvIGNoZWNrIGFnYWlu +c3QgaXRzIGlfdmVyc2lvbg0KPiAgICoNCj4gLSAqIENvbXBhcmUgYW4gaV92ZXJzaW9uIGNvdW50 +ZXIgd2l0aCBhIHByZXZpb3VzIG9uZS4gUmV0dXJucyAwIGlmDQo+IHRoZXkgYXJlDQo+IC0gKiB0 +aGUgc2FtZSwgYSBwb3NpdGl2ZSB2YWx1ZSBpZiB0aGUgb25lIGluIHRoZSBpbm9kZSBhcHBlYXJz +IG5ld2VyDQo+IHRoYW4gQG9sZCwNCj4gLSAqIGFuZCBhIG5lZ2F0aXZlIHZhbHVlIGlmIEBvbGQg +YXBwZWFycyB0byBiZSBuZXdlciB0aGFuIHRoZSBvbmUgaW4NCj4gdGhlDQo+IC0gKiBpbm9kZS4N +Cj4gKyAqIENvbXBhcmUgYW4gaV92ZXJzaW9uIGNvdW50ZXIgd2l0aCBhIHByZXZpb3VzIG9uZS4g +UmV0dXJucyBmYWxzZQ0KPiBpZiB0aGV5IGFyZQ0KPiArICogdGhlIHNhbWUsIGFuZCB0cnVlIGlm +IHRoZXkgYXJlIGRpZmZlcmVudC4NCj4gICAqDQo+ICAgKiBOb3RlIHRoYXQgd2UgZG9uJ3QgbmVl +ZCB0byBzZXQgdGhlIFFVRVJJRUQgZmxhZyBpbiB0aGlzIGNhc2UsIGFzDQo+IHRoZSB2YWx1ZQ0K +PiAgICogaW4gdGhlIGlub2RlIGlzIG5vdCBiZWluZyByZWNvcmRlZCBmb3IgbGF0ZXIgdXNlLg0K +PiAgICovDQo+ICANCj4gLXN0YXRpYyBpbmxpbmUgczY0DQo+ICtzdGF0aWMgaW5saW5lIGJvb2wN +Cj4gIGlub2RlX2NtcF9pdmVyc2lvbihjb25zdCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1NjQgb2xk +KQ0KPiAgew0KPiAtCXJldHVybiAoczY0KShpbm9kZV9wZWVrX2l2ZXJzaW9uX3Jhdyhpbm9kZSkg +Jg0KPiB+SV9WRVJTSU9OX1FVRVJJRUQpIC0NCj4gLQkgICAgICAgKHM2NCkob2xkIDw8IElfVkVS +U0lPTl9RVUVSSUVEX1NISUZUKTsNCj4gKwlyZXR1cm4gKGlub2RlX3BlZWtfaXZlcnNpb25fcmF3 +KGlub2RlKSAmIH5JX1ZFUlNJT05fUVVFUklFRCkNCj4gIT0NCj4gKwkJCShvbGQgPDwgSV9WRVJT +SU9OX1FVRVJJRURfU0hJRlQpOw0KPiAgfQ0KDQpJcyB0aGVyZSBhbnkgcmVhc29uIHdoeSB0aGlz +IGNvdWxkbid0IGp1c3QgdXNlIGlub2RlX3BlZWtfaXZlcnNpb24oKQ0KaW5zdGVhZCBvZiBoYXZp +bmcgdG8gYm90aCBtYXNrIHRoZSBvdXRwdXQgZnJvbQ0KaW5vZGVfcGVla19pdmVyc2lvbl9yYXco +KSBhbmQgc2hpZnQgJ29sZCc/DQoNCj4gICNlbmRpZg0KLS0gDQpUcm9uZCBNeWtsZWJ1c3QNCkxp +bnV4IE5GUyBjbGllbnQgbWFpbnRhaW5lciwgUHJpbWFyeURhdGENCnRyb25kLm15a2xlYnVzdEBw +cmltYXJ5ZGF0YS5jb20NCg== diff --git a/a/content_digest b/N2/content_digest index e372c4c..dfc7123 100644 --- a/a/content_digest +++ b/N2/content_digest @@ -14,111 +14,69 @@ " tytso@mit.edu <tytso@mit.edu>\0" "\00:1\0" "b\0" - "On Tue, 2018-01-30 at 12:31 -0500, Jeff Layton wrote:\n" - "> From: Jeff Layton <jlayton@redhat.com>\n" - "> \n" - "> As Linus points out:\n" - "> \n" - "> The inode_cmp_iversion{+raw}() functions are pure and utter crap.\n" - "> \n" - "> Why?\n" - "> \n" - "> You say that they return 0/negative/positive, but they do so in a\n" - "> completely broken manner. They return that ternary value as the\n" - "> sequence number difference in a 's64', which means that if you\n" - "> actually care about that ternary value, and do the *sane* thing\n" - "> that\n" - "> the kernel-doc of the function implies is the right thing, you\n" - "> would\n" - "> do\n" - "> \n" - "> int cmp = inode_cmp_iversion(inode, old);\n" - "> if (cmp < 0 ...\n" - "> \n" - "> and as a result you get code that looks sane, but that doesn't\n" - "> actually *WORK* right.\n" - "> \n" - "> Since none of the callers actually care about the ternary value here,\n" - "> convert the inode_cmp_iversion{+raw} functions to just return a\n" - "> boolean\n" - "> value (false for matching, true for non-matching).\n" - "> \n" - "> This matches the existing use of these functions just fine, and makes\n" - "> it\n" - "> simple to convert them to return a ternary value in the future if we\n" - "> grow callers that need it.\n" - "> \n" - "> Signed-off-by: Jeff Layton <jlayton@redhat.com>\n" - "> ---\n" - "> include/linux/iversion.h | 20 +++++++++-----------\n" - "> 1 file changed, 9 insertions(+), 11 deletions(-)\n" - "> \n" - "> diff --git a/include/linux/iversion.h b/include/linux/iversion.h\n" - "> index 858463fca249..ace32775c5f0 100644\n" - "> --- a/include/linux/iversion.h\n" - "> +++ b/include/linux/iversion.h\n" - "> @@ -309,13 +309,13 @@ inode_query_iversion(struct inode *inode)\n" - "> * @inode: inode to check\n" - "> * @old: old value to check against its i_version\n" - "> *\n" - "> - * Compare the current raw i_version counter with a previous one.\n" - "> Returns 0 if\n" - "> - * they are the same or non-zero if they are different.\n" - "> + * Compare the current raw i_version counter with a previous one.\n" - "> Returns false\n" - "> + * if they are the same or true if they are different.\n" - "> */\n" - "> -static inline s64\n" - "> +static inline bool\n" - "> inode_cmp_iversion_raw(const struct inode *inode, u64 old)\n" - "> {\n" - "> -\treturn (s64)inode_peek_iversion_raw(inode) - (s64)old;\n" - "> +\treturn inode_peek_iversion_raw(inode) != old;\n" - "> }\n" - "> \n" - "> /**\n" - "> @@ -323,19 +323,17 @@ inode_cmp_iversion_raw(const struct inode\n" - "> *inode, u64 old)\n" - "> * @inode: inode to check\n" - "> * @old: old value to check against its i_version\n" - "> *\n" - "> - * Compare an i_version counter with a previous one. Returns 0 if\n" - "> they are\n" - "> - * the same, a positive value if the one in the inode appears newer\n" - "> than @old,\n" - "> - * and a negative value if @old appears to be newer than the one in\n" - "> the\n" - "> - * inode.\n" - "> + * Compare an i_version counter with a previous one. Returns false\n" - "> if they are\n" - "> + * the same, and true if they are different.\n" - "> *\n" - "> * Note that we don't need to set the QUERIED flag in this case, as\n" - "> the value\n" - "> * in the inode is not being recorded for later use.\n" - "> */\n" - "> \n" - "> -static inline s64\n" - "> +static inline bool\n" - "> inode_cmp_iversion(const struct inode *inode, u64 old)\n" - "> {\n" - "> -\treturn (s64)(inode_peek_iversion_raw(inode) &\n" - "> ~I_VERSION_QUERIED) -\n" - "> -\t (s64)(old << I_VERSION_QUERIED_SHIFT);\n" - "> +\treturn (inode_peek_iversion_raw(inode) & ~I_VERSION_QUERIED)\n" - "> !=\n" - "> +\t\t\t(old << I_VERSION_QUERIED_SHIFT);\n" - "> }\n" - "\n" - "Is there any reason why this couldn't just use inode_peek_iversion()\n" - "instead of having to both mask the output from\n" - "inode_peek_iversion_raw() and shift 'old'?\n" - "\n" - "> #endif\n" - "-- \n" - "Trond Myklebust\n" - "Linux NFS client maintainer, PrimaryData\n" - "trond.myklebust@primarydata.com\n" - "\303\277\303\264\303\250\302\272{.n\303\207+\302\211\302\267\302\237\302\256\302\211\302\255\302\206+%\302\212\303\213\303\277\302\261\303\251\303\235\302\266\027\302\245\302\212w\303\277\302\272{.n\303\207+\302\211\302\267\302\245\302\212{\302\261\303\275\302\273k~\303\217\303\242\302\236\303\230^n\302\207r\302\241\303\266\302\246z\303\213\032\302\201\303\253h\302\231\302\250\303\250\302\255\303\232&\302\243\303\273\303\240z\302\277\303\244z\302\271\303\236\302\227\303\272+\302\200\303\212+zf\302\243\302\242\302\267h\302\232\302\210\302\247~\302\206\302\255\302\206\303\233i\303\277\303\277\303\257\302\201\303\252\303\277\302\221\303\252\303\247z_\303\250\302\256\017\303\246j:+v\302\211\302\250\303\276)\303\237\302\243\303\270m" + "T24gVHVlLCAyMDE4LTAxLTMwIGF0IDEyOjMxIC0wNTAwLCBKZWZmIExheXRvbiB3cm90ZToNCj4g\n" + "RnJvbTogSmVmZiBMYXl0b24gPGpsYXl0b25AcmVkaGF0LmNvbT4NCj4gDQo+IEFzIExpbnVzIHBv\n" + "aW50cyBvdXQ6DQo+IA0KPiAgICAgVGhlIGlub2RlX2NtcF9pdmVyc2lvbnsrcmF3fSgpIGZ1bmN0\n" + "aW9ucyBhcmUgcHVyZSBhbmQgdXR0ZXIgY3JhcC4NCj4gDQo+ICAgICBXaHk/DQo+IA0KPiAgICAg\n" + "WW91IHNheSB0aGF0IHRoZXkgcmV0dXJuIDAvbmVnYXRpdmUvcG9zaXRpdmUsIGJ1dCB0aGV5IGRv\n" + "IHNvIGluIGENCj4gICAgIGNvbXBsZXRlbHkgYnJva2VuIG1hbm5lci4gVGhleSByZXR1cm4gdGhh\n" + "dCB0ZXJuYXJ5IHZhbHVlIGFzIHRoZQ0KPiAgICAgc2VxdWVuY2UgbnVtYmVyIGRpZmZlcmVuY2Ug\n" + "aW4gYSAnczY0Jywgd2hpY2ggbWVhbnMgdGhhdCBpZiB5b3UNCj4gICAgIGFjdHVhbGx5IGNhcmUg\n" + "YWJvdXQgdGhhdCB0ZXJuYXJ5IHZhbHVlLCBhbmQgZG8gdGhlICpzYW5lKiB0aGluZw0KPiB0aGF0\n" + "DQo+ICAgICB0aGUga2VybmVsLWRvYyBvZiB0aGUgZnVuY3Rpb24gaW1wbGllcyBpcyB0aGUgcmln\n" + "aHQgdGhpbmcsIHlvdQ0KPiB3b3VsZA0KPiAgICAgZG8NCj4gDQo+ICAgICAgICAgaW50IGNtcCA9\n" + "IGlub2RlX2NtcF9pdmVyc2lvbihpbm9kZSwgb2xkKTsNCj4gICAgICAgICBpZiAoY21wIDwgMCAu\n" + "Li4NCj4gDQo+ICAgICBhbmQgYXMgYSByZXN1bHQgeW91IGdldCBjb2RlIHRoYXQgbG9va3Mgc2Fu\n" + "ZSwgYnV0IHRoYXQgZG9lc24ndA0KPiAgICAgYWN0dWFsbHkgKldPUksqIHJpZ2h0Lg0KPiANCj4g\n" + "U2luY2Ugbm9uZSBvZiB0aGUgY2FsbGVycyBhY3R1YWxseSBjYXJlIGFib3V0IHRoZSB0ZXJuYXJ5\n" + "IHZhbHVlIGhlcmUsDQo+IGNvbnZlcnQgdGhlIGlub2RlX2NtcF9pdmVyc2lvbnsrcmF3fSBmdW5j\n" + "dGlvbnMgdG8ganVzdCByZXR1cm4gYQ0KPiBib29sZWFuDQo+IHZhbHVlIChmYWxzZSBmb3IgbWF0\n" + "Y2hpbmcsIHRydWUgZm9yIG5vbi1tYXRjaGluZykuDQo+IA0KPiBUaGlzIG1hdGNoZXMgdGhlIGV4\n" + "aXN0aW5nIHVzZSBvZiB0aGVzZSBmdW5jdGlvbnMganVzdCBmaW5lLCBhbmQgbWFrZXMNCj4gaXQN\n" + "Cj4gc2ltcGxlIHRvIGNvbnZlcnQgdGhlbSB0byByZXR1cm4gYSB0ZXJuYXJ5IHZhbHVlIGluIHRo\n" + "ZSBmdXR1cmUgaWYgd2UNCj4gZ3JvdyBjYWxsZXJzIHRoYXQgbmVlZCBpdC4NCj4gDQo+IFNpZ25l\n" + "ZC1vZmYtYnk6IEplZmYgTGF5dG9uIDxqbGF5dG9uQHJlZGhhdC5jb20+DQo+IC0tLQ0KPiAgaW5j\n" + "bHVkZS9saW51eC9pdmVyc2lvbi5oIHwgMjAgKysrKysrKysrLS0tLS0tLS0tLS0NCj4gIDEgZmls\n" + "ZSBjaGFuZ2VkLCA5IGluc2VydGlvbnMoKyksIDExIGRlbGV0aW9ucygtKQ0KPiANCj4gZGlmZiAt\n" + "LWdpdCBhL2luY2x1ZGUvbGludXgvaXZlcnNpb24uaCBiL2luY2x1ZGUvbGludXgvaXZlcnNpb24u\n" + "aA0KPiBpbmRleCA4NTg0NjNmY2EyNDkuLmFjZTMyNzc1YzVmMCAxMDA2NDQNCj4gLS0tIGEvaW5j\n" + "bHVkZS9saW51eC9pdmVyc2lvbi5oDQo+ICsrKyBiL2luY2x1ZGUvbGludXgvaXZlcnNpb24uaA0K\n" + "PiBAQCAtMzA5LDEzICszMDksMTMgQEAgaW5vZGVfcXVlcnlfaXZlcnNpb24oc3RydWN0IGlub2Rl\n" + "ICppbm9kZSkNCj4gICAqIEBpbm9kZTogaW5vZGUgdG8gY2hlY2sNCj4gICAqIEBvbGQ6IG9sZCB2\n" + "YWx1ZSB0byBjaGVjayBhZ2FpbnN0IGl0cyBpX3ZlcnNpb24NCj4gICAqDQo+IC0gKiBDb21wYXJl\n" + "IHRoZSBjdXJyZW50IHJhdyBpX3ZlcnNpb24gY291bnRlciB3aXRoIGEgcHJldmlvdXMgb25lLg0K\n" + "PiBSZXR1cm5zIDAgaWYNCj4gLSAqIHRoZXkgYXJlIHRoZSBzYW1lIG9yIG5vbi16ZXJvIGlmIHRo\n" + "ZXkgYXJlIGRpZmZlcmVudC4NCj4gKyAqIENvbXBhcmUgdGhlIGN1cnJlbnQgcmF3IGlfdmVyc2lv\n" + "biBjb3VudGVyIHdpdGggYSBwcmV2aW91cyBvbmUuDQo+IFJldHVybnMgZmFsc2UNCj4gKyAqIGlm\n" + "IHRoZXkgYXJlIHRoZSBzYW1lIG9yIHRydWUgaWYgdGhleSBhcmUgZGlmZmVyZW50Lg0KPiAgICov\n" + "DQo+IC1zdGF0aWMgaW5saW5lIHM2NA0KPiArc3RhdGljIGlubGluZSBib29sDQo+ICBpbm9kZV9j\n" + "bXBfaXZlcnNpb25fcmF3KGNvbnN0IHN0cnVjdCBpbm9kZSAqaW5vZGUsIHU2NCBvbGQpDQo+ICB7\n" + "DQo+IC0JcmV0dXJuIChzNjQpaW5vZGVfcGVla19pdmVyc2lvbl9yYXcoaW5vZGUpIC0gKHM2NClv\n" + "bGQ7DQo+ICsJcmV0dXJuIGlub2RlX3BlZWtfaXZlcnNpb25fcmF3KGlub2RlKSAhPSBvbGQ7DQo+\n" + "ICB9DQo+ICANCj4gIC8qKg0KPiBAQCAtMzIzLDE5ICszMjMsMTcgQEAgaW5vZGVfY21wX2l2ZXJz\n" + "aW9uX3Jhdyhjb25zdCBzdHJ1Y3QgaW5vZGUNCj4gKmlub2RlLCB1NjQgb2xkKQ0KPiAgICogQGlu\n" + "b2RlOiBpbm9kZSB0byBjaGVjaw0KPiAgICogQG9sZDogb2xkIHZhbHVlIHRvIGNoZWNrIGFnYWlu\n" + "c3QgaXRzIGlfdmVyc2lvbg0KPiAgICoNCj4gLSAqIENvbXBhcmUgYW4gaV92ZXJzaW9uIGNvdW50\n" + "ZXIgd2l0aCBhIHByZXZpb3VzIG9uZS4gUmV0dXJucyAwIGlmDQo+IHRoZXkgYXJlDQo+IC0gKiB0\n" + "aGUgc2FtZSwgYSBwb3NpdGl2ZSB2YWx1ZSBpZiB0aGUgb25lIGluIHRoZSBpbm9kZSBhcHBlYXJz\n" + "IG5ld2VyDQo+IHRoYW4gQG9sZCwNCj4gLSAqIGFuZCBhIG5lZ2F0aXZlIHZhbHVlIGlmIEBvbGQg\n" + "YXBwZWFycyB0byBiZSBuZXdlciB0aGFuIHRoZSBvbmUgaW4NCj4gdGhlDQo+IC0gKiBpbm9kZS4N\n" + "Cj4gKyAqIENvbXBhcmUgYW4gaV92ZXJzaW9uIGNvdW50ZXIgd2l0aCBhIHByZXZpb3VzIG9uZS4g\n" + "UmV0dXJucyBmYWxzZQ0KPiBpZiB0aGV5IGFyZQ0KPiArICogdGhlIHNhbWUsIGFuZCB0cnVlIGlm\n" + "IHRoZXkgYXJlIGRpZmZlcmVudC4NCj4gICAqDQo+ICAgKiBOb3RlIHRoYXQgd2UgZG9uJ3QgbmVl\n" + "ZCB0byBzZXQgdGhlIFFVRVJJRUQgZmxhZyBpbiB0aGlzIGNhc2UsIGFzDQo+IHRoZSB2YWx1ZQ0K\n" + "PiAgICogaW4gdGhlIGlub2RlIGlzIG5vdCBiZWluZyByZWNvcmRlZCBmb3IgbGF0ZXIgdXNlLg0K\n" + "PiAgICovDQo+ICANCj4gLXN0YXRpYyBpbmxpbmUgczY0DQo+ICtzdGF0aWMgaW5saW5lIGJvb2wN\n" + "Cj4gIGlub2RlX2NtcF9pdmVyc2lvbihjb25zdCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1NjQgb2xk\n" + "KQ0KPiAgew0KPiAtCXJldHVybiAoczY0KShpbm9kZV9wZWVrX2l2ZXJzaW9uX3Jhdyhpbm9kZSkg\n" + "Jg0KPiB+SV9WRVJTSU9OX1FVRVJJRUQpIC0NCj4gLQkgICAgICAgKHM2NCkob2xkIDw8IElfVkVS\n" + "U0lPTl9RVUVSSUVEX1NISUZUKTsNCj4gKwlyZXR1cm4gKGlub2RlX3BlZWtfaXZlcnNpb25fcmF3\n" + "KGlub2RlKSAmIH5JX1ZFUlNJT05fUVVFUklFRCkNCj4gIT0NCj4gKwkJCShvbGQgPDwgSV9WRVJT\n" + "SU9OX1FVRVJJRURfU0hJRlQpOw0KPiAgfQ0KDQpJcyB0aGVyZSBhbnkgcmVhc29uIHdoeSB0aGlz\n" + "IGNvdWxkbid0IGp1c3QgdXNlIGlub2RlX3BlZWtfaXZlcnNpb24oKQ0KaW5zdGVhZCBvZiBoYXZp\n" + "bmcgdG8gYm90aCBtYXNrIHRoZSBvdXRwdXQgZnJvbQ0KaW5vZGVfcGVla19pdmVyc2lvbl9yYXco\n" + "KSBhbmQgc2hpZnQgJ29sZCc/DQoNCj4gICNlbmRpZg0KLS0gDQpUcm9uZCBNeWtsZWJ1c3QNCkxp\n" + "bnV4IE5GUyBjbGllbnQgbWFpbnRhaW5lciwgUHJpbWFyeURhdGENCnRyb25kLm15a2xlYnVzdEBw\n" + cmltYXJ5ZGF0YS5jb20NCg== -7136147e0b37f2b79cf58f1d1beeeb8d5b69a489dffadedb1bd6ec795eb867e4 +8b9c7088fcdd5d2db1c2757a0149bc001403792b9025c30328388a8919736b80
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.