From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 1D8DDC433EF for ; Thu, 6 Jan 2022 22:59:57 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 6C3F16B0072; Thu, 6 Jan 2022 17:59:57 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 64D626B0073; Thu, 6 Jan 2022 17:59:57 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 4C6336B0074; Thu, 6 Jan 2022 17:59:57 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0186.hostedemail.com [216.40.44.186]) by kanga.kvack.org (Postfix) with ESMTP id 373736B0072 for ; Thu, 6 Jan 2022 17:59:57 -0500 (EST) Received: from smtpin20.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay04.hostedemail.com (Postfix) with ESMTP id D7C4A92ECD for ; Thu, 6 Jan 2022 22:59:56 +0000 (UTC) X-FDA: 79001381592.20.AC09FD4 Received: from mail-ed1-f43.google.com (mail-ed1-f43.google.com [209.85.208.43]) by imf05.hostedemail.com (Postfix) with ESMTP id 5D23310000E for ; Thu, 6 Jan 2022 22:59:56 +0000 (UTC) Received: by mail-ed1-f43.google.com with SMTP id c71so3677066edf.6 for ; Thu, 06 Jan 2022 14:59:56 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux-foundation.org; s=google; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=wedonS74gSWJnWpiXoYzW3anrg5nrcdUbA3vzIQ0zdg=; b=YqDAvXZPBulnnBvCotyMwVEWL6pXP60KznBnmr5m42MhDlzU59XaS7BaCJ+Jm6Jgr0 0vHrsoBhKD6A4bK8ZwRX5g9nH9BgRpMVOoma7/M8qyJ1UT2Af7lRhjQfSLOgZJlKhJD3 o7iWCNOa7dUy9yaD5IBTHFYWQQk1d5xgGZofk= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=wedonS74gSWJnWpiXoYzW3anrg5nrcdUbA3vzIQ0zdg=; b=tqmWKZime5HqpjVNkFtPZgBY+KglWpvAC/5TchIvU8NMWiOEd0H/UdTCJAyZs6Drm+ JFp7XwYWYk2WsmF3JlPB8Wn7eg+gfv9hAj8ejP+fL0hkabviNKCsGS/PfyHlVvaDvY17 jbIOMxC14pCtCh8sopkmodJgAw4EoabKWG+S83Q+fV3LjI4/fCfrifUM1I/EBO1MT/f1 s9uWZqPd10fm7M8of8xtGVaQFCZXdNi3TBqDBxcrfQmMHMrqhDHldW0UAagqDeqlSQjb USuDJeEZ9YDTRFt+shTRrV8QcGq/suTvkSFe8OmsGHoxNgftsMNXtI7U239bT35oepWv ScJg== X-Gm-Message-State: AOAM531fZHQC9BE6WSVptHei54cza21WX5xoT2Zo0h6nXOkgtD+ZAE/9 cc6zHBJkU4+IDnXRkB++uCEoUoAzTI/MxeKC X-Google-Smtp-Source: ABdhPJxi+S1XAjqQ7FRt0GMGT15VLzbzojoBqjb6J0IoZmFkvjQoh6zIRxdDgn9iejwkr9dqNU1NcA== X-Received: by 2002:a17:906:5488:: with SMTP id r8mr46885683ejo.752.1641509994693; Thu, 06 Jan 2022 14:59:54 -0800 (PST) Received: from mail-wm1-f42.google.com (mail-wm1-f42.google.com. [209.85.128.42]) by smtp.gmail.com with ESMTPSA id u14sm1263737edv.92.2022.01.06.14.59.52 for (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Thu, 06 Jan 2022 14:59:53 -0800 (PST) Received: by mail-wm1-f42.google.com with SMTP id bg19-20020a05600c3c9300b0034565e837b6so3075858wmb.1 for ; Thu, 06 Jan 2022 14:59:52 -0800 (PST) X-Received: by 2002:a7b:c305:: with SMTP id k5mr8692804wmj.144.1641509992696; Thu, 06 Jan 2022 14:59:52 -0800 (PST) MIME-Version: 1.0 References: <000000000000e8f8f505d0e479a5@google.com> <20211211015620.1793-1-hdanton@sina.com> In-Reply-To: From: Linus Torvalds Date: Thu, 6 Jan 2022 14:59:36 -0800 X-Gmail-Original-Message-ID: Message-ID: Subject: Re: psi_trigger_poll() is completely broken To: Tejun Heo Cc: Eric Biggers , Zefan Li , Johannes Weiner , Peter Zijlstra , Juri Lelli , Vincent Guittot , Ingo Molnar , Hillf Danton , syzbot , linux-fsdevel , Linux Kernel Mailing List , syzkaller-bugs , Linux-MM Content-Type: multipart/mixed; boundary="00000000000002b22d05d4f1d4eb" X-Rspamd-Server: rspam08 X-Rspamd-Queue-Id: 5D23310000E X-Stat-Signature: c9fr1dms9a7c4bq8u4k3ufzej3wqgurc Authentication-Results: imf05.hostedemail.com; dkim=pass header.d=linux-foundation.org header.s=google header.b=YqDAvXZP; spf=pass (imf05.hostedemail.com: domain of torvalds@linuxfoundation.org designates 209.85.208.43 as permitted sender) smtp.mailfrom=torvalds@linuxfoundation.org; dmarc=none X-HE-Tag: 1641509996-239201 X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: --00000000000002b22d05d4f1d4eb Content-Type: text/plain; charset="UTF-8" On Thu, Jan 6, 2022 at 2:05 PM Tejun Heo wrote: > > On Wed, Jan 05, 2022 at 11:13:30AM -0800, Linus Torvalds wrote: > > > > What are the users? Can we make the rule for -EBUSY simply be that you > > can _install_ a trigger, but you can't replace an existing one (except > > with NULL, when you close it). > > I don't have enough context here and Johannes seems offline today. Let's > wait for him to chime in. Context here: https://lore.kernel.org/all/YdW3WfHURBXRmn%2F6@sol.localdomain/ > IIRC, the rationale for the shared trigger at the time was around the > complexities of preventing it from devolving into O(N) trigger checks on > every pressure update. If the overriding behavior is something that can be > changed, I'd prefer going for per-opener triggers even if that involves > adding complexities (maybe a rbtree w/ prev/next links for faster sweeps?). So here's a COMPLETELY UNTESTED patch to try to fix the lifetime and locking. The locking was completely broken, in that psi_trigger_replace() expected that the caller would hold some exclusive lock so that it would release the correct previous trigger. The cgroup code doesn't seem to have any such exclusion. This (UNTESTED!) patch fixes that breakage by just using a cmpxchg loop. And the lifetime was completely broken (and that's Eric's email) because psi_trigger_replace() would drop the refcount to the old trigger - assuming it got the right one - even though the old trigger could still have active waiters on the waitqueue due to poll() or select(). This (UNTESTED!) patch fixes _that_ breakage by making psi_trigger_replace() instead just put the previous trigger on the "stale_trigger" linked list, and never release it at all. It now gets released by "psi_trigger_release()" instead, which walks the list at file release time. Doing "psi_trigger_replace(.., NULL)" is not valid any more. And because the reference cannot go away, we now can throw away all the incorrect temporary kref_get/put games from psi_trigger_poll(), which didn't actually fix the race at all, only limited it to the poll waitqueue. That also means we can remove the "synchronize_rcu()" from psi_trigger_destroy(), since that was trying to hide all the problems with the "take rcu lock and then do kref_get()" thing not having locking. The locking still doesn't exist, but since we don't release the old one when replacing it, the issue is moot. NOTE NOTE NOTE! Not only is this patch entirely untested, there are optimizations you could do if there was some sane synchronization between psi_trigger_poll() and psi_trigger_replace(). I put comments about it in the code, but right now the code just assumes that replacing a trigger is fairly rare (and since it requires write permissions, it's not something random users can do). I'm not proud of this patch, but I think it might fix the fundamental bugs in the code for now. It's not lovely, it has room for improvement, and I wish we didn't need this kind of thing, but it looks superficially sane as a fix to me. Comments? And once again: this is UNTESTED. I've compiled-tested it, it looks kind of sane to me, but honestly, I don't know the code very well. Also, I'm not super-happy with how that 'psi_disabled' static branch works. If somebody switches it off after it has been on, that will also disable the freeing code, so now you'll be leaking memory. I couldn't find it in myself to care. Eric - you have the test-case, and the eagle-eyes that found this problem in the first place. As such, your opinion and comments count more than most... Linus --00000000000002b22d05d4f1d4eb Content-Type: text/x-patch; charset="US-ASCII"; name="patch.diff" Content-Disposition: attachment; filename="patch.diff" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_ky3kj4wz0 IGluY2x1ZGUvbGludXgvcHNpLmggICAgICAgfCAgMSArCiBpbmNsdWRlL2xpbnV4L3BzaV90eXBl cy5oIHwgIDMgKysKIGtlcm5lbC9jZ3JvdXAvY2dyb3VwLmMgICAgfCAgMiArLQoga2VybmVsL3Nj aGVkL3BzaS5jICAgICAgICB8IDcxICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrLS0t LS0tLS0tLS0tLS0tCiA0IGZpbGVzIGNoYW5nZWQsIDU0IGluc2VydGlvbnMoKyksIDIzIGRlbGV0 aW9ucygtKQoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcHNpLmggYi9pbmNsdWRlL2xpbnV4 L3BzaS5oCmluZGV4IDY1ZWIxNDc2YWM3MC4uOWVjOTQ2OGQ2MDY4IDEwMDY0NAotLS0gYS9pbmNs dWRlL2xpbnV4L3BzaS5oCisrKyBiL2luY2x1ZGUvbGludXgvcHNpLmgKQEAgLTMzLDYgKzMzLDcg QEAgdm9pZCBjZ3JvdXBfbW92ZV90YXNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgc3RydWN0IGNz c19zZXQgKnRvKTsKIHN0cnVjdCBwc2lfdHJpZ2dlciAqcHNpX3RyaWdnZXJfY3JlYXRlKHN0cnVj dCBwc2lfZ3JvdXAgKmdyb3VwLAogCQkJY2hhciAqYnVmLCBzaXplX3QgbmJ5dGVzLCBlbnVtIHBz aV9yZXMgcmVzKTsKIHZvaWQgcHNpX3RyaWdnZXJfcmVwbGFjZSh2b2lkICoqdHJpZ2dlcl9wdHIs IHN0cnVjdCBwc2lfdHJpZ2dlciAqdCk7Cit2b2lkIHBzaV90cmlnZ2VyX3JlbGVhc2Uodm9pZCAq KnRyaWdnZXJfcHRyKTsKIAogX19wb2xsX3QgcHNpX3RyaWdnZXJfcG9sbCh2b2lkICoqdHJpZ2dl cl9wdHIsIHN0cnVjdCBmaWxlICpmaWxlLAogCQkJcG9sbF90YWJsZSAqd2FpdCk7CmRpZmYgLS1n aXQgYS9pbmNsdWRlL2xpbnV4L3BzaV90eXBlcy5oIGIvaW5jbHVkZS9saW51eC9wc2lfdHlwZXMu aAppbmRleCAwYTIzMzAwZDQ5YWYuLmVhYjc5ZTY4YmY1NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9s aW51eC9wc2lfdHlwZXMuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BzaV90eXBlcy5oCkBAIC0xMzIs NiArMTMyLDkgQEAgc3RydWN0IHBzaV90cmlnZ2VyIHsKIAogCS8qIFJlZmNvdW50aW5nIHRvIHBy ZXZlbnQgcHJlbWF0dXJlIGRlc3RydWN0aW9uICovCiAJc3RydWN0IGtyZWYgcmVmY291bnQ7CisK KwkvKiBQcmV2aW91cyB0cmlnZ2VyIHRoYXQgdGhpcyBvbmUgcmVwbGFjZWQgKi8KKwlzdHJ1Y3Qg cHNpX3RyaWdnZXIgKnN0YWxlX3RyaWdnZXI7CiB9OwogCiBzdHJ1Y3QgcHNpX2dyb3VwIHsKZGlm ZiAtLWdpdCBhL2tlcm5lbC9jZ3JvdXAvY2dyb3VwLmMgYi9rZXJuZWwvY2dyb3VwL2Nncm91cC5j CmluZGV4IDkxOTE5NGRlMzljOC4uODAxZDBhZWMwNDQzIDEwMDY0NAotLS0gYS9rZXJuZWwvY2dy b3VwL2Nncm91cC5jCisrKyBiL2tlcm5lbC9jZ3JvdXAvY2dyb3VwLmMKQEAgLTM2ODQsNyArMzY4 NCw3IEBAIHN0YXRpYyBfX3BvbGxfdCBjZ3JvdXBfcHJlc3N1cmVfcG9sbChzdHJ1Y3Qga2VybmZz X29wZW5fZmlsZSAqb2YsCiAKIHN0YXRpYyB2b2lkIGNncm91cF9wcmVzc3VyZV9yZWxlYXNlKHN0 cnVjdCBrZXJuZnNfb3Blbl9maWxlICpvZikKIHsKLQlwc2lfdHJpZ2dlcl9yZXBsYWNlKCZvZi0+ cHJpdiwgTlVMTCk7CisJcHNpX3RyaWdnZXJfcmVsZWFzZSgmb2YtPnByaXYpOwogfQogCiBib29s IGNncm91cF9wc2lfZW5hYmxlZCh2b2lkKQpkaWZmIC0tZ2l0IGEva2VybmVsL3NjaGVkL3BzaS5j IGIva2VybmVsL3NjaGVkL3BzaS5jCmluZGV4IDE2NTJmMmJiNTRiNy4uMTA0MzBmNzVmMjFhIDEw MDY0NAotLS0gYS9rZXJuZWwvc2NoZWQvcHNpLmMKKysrIGIva2VybmVsL3NjaGVkL3BzaS5jCkBA IC0xMTUyLDYgKzExNTIsNyBAQCBzdHJ1Y3QgcHNpX3RyaWdnZXIgKnBzaV90cmlnZ2VyX2NyZWF0 ZShzdHJ1Y3QgcHNpX2dyb3VwICpncm91cCwKIAl0LT5sYXN0X2V2ZW50X3RpbWUgPSAwOwogCWlu aXRfd2FpdHF1ZXVlX2hlYWQoJnQtPmV2ZW50X3dhaXQpOwogCWtyZWZfaW5pdCgmdC0+cmVmY291 bnQpOworCXQtPnN0YWxlX3RyaWdnZXIgPSBOVUxMOwogCiAJbXV0ZXhfbG9jaygmZ3JvdXAtPnRy aWdnZXJfbG9jayk7CiAKQEAgLTEyMjMsMTIgKzEyMjQsNiBAQCBzdGF0aWMgdm9pZCBwc2lfdHJp Z2dlcl9kZXN0cm95KHN0cnVjdCBrcmVmICpyZWYpCiAKIAltdXRleF91bmxvY2soJmdyb3VwLT50 cmlnZ2VyX2xvY2spOwogCi0JLyoKLQkgKiBXYWl0IGZvciBib3RoICp0cmlnZ2VyX3B0ciBmcm9t IHBzaV90cmlnZ2VyX3JlcGxhY2UgYW5kCi0JICogcG9sbF90YXNrIFJDVXMgdG8gY29tcGxldGUg dGhlaXIgcmVhZC1zaWRlIGNyaXRpY2FsIHNlY3Rpb25zCi0JICogYmVmb3JlIGRlc3Ryb3lpbmcg dGhlIHRyaWdnZXIgYW5kIG9wdGlvbmFsbHkgdGhlIHBvbGxfdGFzawotCSAqLwotCXN5bmNocm9u aXplX3JjdSgpOwogCS8qCiAJICogU3RvcCBrdGhyZWFkICdwc2ltb24nIGFmdGVyIHJlbGVhc2lu ZyB0cmlnZ2VyX2xvY2sgdG8gcHJldmVudCBhCiAJICogZGVhZGxvY2sgd2hpbGUgd2FpdGluZyBm b3IgcHNpX3BvbGxfd29yayB0byBhY3F1aXJlIHRyaWdnZXJfbG9jawpAQCAtMTI0MywxNiArMTIz OCw0OCBAQCBzdGF0aWMgdm9pZCBwc2lfdHJpZ2dlcl9kZXN0cm95KHN0cnVjdCBrcmVmICpyZWYp CiAJa2ZyZWUodCk7CiB9CiAKKy8qCisgKiBSZXBsYWNpbmcgYSB0cmlnZ2VyIG11c3Qgbm90IHRo cm93IGF3YXkgdGhlIG9sZCBvbmUsIHNpbmNlIGl0CisgKiBjYW4gc3RpbGwgaGF2ZSBwZW5kaW5n IHdhaXRlcnMuCisgKgorICogUG9zc2libGUgb3B0aW1pemF0aW9uOiBhZnRlciBzdWNjZXNzZnVs bHkgaW5zdGFsbGluZyBhIG5ldworICogdHJpZ2dlciwgd2UgY291bGQgcmVsZWFzZSB0aGUgb2xk IG9uZSBmcm9tIHRoZSBzdGFsZSBsaXN0CisgKiBlYXJseS4gTm90IGRvbmUgaGVyZSB5ZXQgLSBu ZWVkcyBsb2NraW5nIHdpdGggcHNpX3RyaWdnZXJfcG9sbC4KKyAqLwogdm9pZCBwc2lfdHJpZ2dl cl9yZXBsYWNlKHZvaWQgKip0cmlnZ2VyX3B0ciwgc3RydWN0IHBzaV90cmlnZ2VyICpuZXcpCiB7 Ci0Jc3RydWN0IHBzaV90cmlnZ2VyICpvbGQgPSAqdHJpZ2dlcl9wdHI7CisJaWYgKHN0YXRpY19i cmFuY2hfbGlrZWx5KCZwc2lfZGlzYWJsZWQpKQorCQlyZXR1cm47CisKKwlmb3IgKDs7KSB7CisJ CXN0cnVjdCBwc2lfdHJpZ2dlciAqb2xkID0gKnRyaWdnZXJfcHRyOworCisJCW5ldy0+c3RhbGVf dHJpZ2dlciA9IG9sZDsKKwkJaWYgKHRyeV9jbXB4Y2hnKHRyaWdnZXJfcHRyLCBvbGQsIG5ldykp CisJCQlicmVhazsKKwl9CisKKwkvKgorCSAqIE5vdyB0aGF0IHRoZSBuZXcgb25lIGhhcyBiZWVu IGluc3RhbGxlZCwgd2UgY291bGQKKwkgKiBjaGVjayBpZiB0aGUgc3RhbGUgb25lIGhhcyBhbiBl bXB0eSB3YWl0LXF1ZXVlCisJICogYW5kIHJlbGVhc2UgaXQgZWFybHkuLi4gQnV0IHdlJ2QgbmVl ZCBzb21lIGxvY2tpbmcKKwkgKiB3aXRoIGVudyBwb2xsIHVzZXJzIHRvIGJlIHN1cmUuCisJICov Cit9CisKKy8qIE5vIGxvY2tpbmcgbmVlZGVkIGZvciBmaW5hbCByZWxlYXNlICovCit2b2lkIHBz aV90cmlnZ2VyX3JlbGVhc2Uodm9pZCAqKnRyaWdnZXJfcHRyKQoreworCXN0cnVjdCBwc2lfdHJp Z2dlciAqdHJpZ2dlcjsKIAogCWlmIChzdGF0aWNfYnJhbmNoX2xpa2VseSgmcHNpX2Rpc2FibGVk KSkKIAkJcmV0dXJuOwogCi0JcmN1X2Fzc2lnbl9wb2ludGVyKCp0cmlnZ2VyX3B0ciwgbmV3KTsK LQlpZiAob2xkKQotCQlrcmVmX3B1dCgmb2xkLT5yZWZjb3VudCwgcHNpX3RyaWdnZXJfZGVzdHJv eSk7CisJd2hpbGUgKHRyaWdnZXIpIHsKKwkJc3RydWN0IHBzaV90cmlnZ2VyICpuZXh0ID0gdHJp Z2dlci0+c3RhbGVfdHJpZ2dlcjsKKwkJa3JlZl9wdXQoJnRyaWdnZXItPnJlZmNvdW50LCBwc2lf dHJpZ2dlcl9kZXN0cm95KTsKKwkJdHJpZ2dlciA9IG5leHQ7CisJfQogfQogCiBfX3BvbGxfdCBw c2lfdHJpZ2dlcl9wb2xsKHZvaWQgKip0cmlnZ2VyX3B0ciwKQEAgLTEyNjQsMjQgKzEyOTEsMjQg QEAgX19wb2xsX3QgcHNpX3RyaWdnZXJfcG9sbCh2b2lkICoqdHJpZ2dlcl9wdHIsCiAJaWYgKHN0 YXRpY19icmFuY2hfbGlrZWx5KCZwc2lfZGlzYWJsZWQpKQogCQlyZXR1cm4gREVGQVVMVF9QT0xM TUFTSyB8IEVQT0xMRVJSIHwgRVBPTExQUkk7CiAKLQlyY3VfcmVhZF9sb2NrKCk7Ci0KLQl0ID0g cmN1X2RlcmVmZXJlbmNlKCoodm9pZCBfX3JjdSBfX2ZvcmNlICoqKXRyaWdnZXJfcHRyKTsKLQlp ZiAoIXQpIHsKLQkJcmN1X3JlYWRfdW5sb2NrKCk7CisJLyoKKwkgKiBTZWUgcHNpX3RyaWdnZXJf cmVwbGFjZSgpOiBmaW5kaW5nIGEgdHJpZ2dlciBtZWFucworCSAqIHRoYXQgaXQgaXMgZ3VhcmFu dGVlZCB0byBoYXZlIGFuIGVsZXZhdGVkIHJlZmNvdW50CisJICogZm9yIHRoZSBsaWZldGltZSBv ZiB0aGlzIGZpbGUgZGVzY3JpcHRvci4KKwkgKgorCSAqIElmIHdlIGhhZCBsb2NraW5nLCB3ZSBj b3VsZCByZWxlYXNlIGl0IGVhcmx5LiBBcyBpdAorCSAqIGlzLCB3ZSdsbCBvbmx5IHJlbGVhc2Ug aXQgd2l0aCBwc2lfdHJpZ2dlcl9yZWxlYXNlKCkKKwkgKiBhdCB0aGUgdmVyeSBlbmQuCisJICov CisJdCA9IFJFQURfT05DRSgqdHJpZ2dlcl9wdHIpOworCWlmICghdCkKIAkJcmV0dXJuIERFRkFV TFRfUE9MTE1BU0sgfCBFUE9MTEVSUiB8IEVQT0xMUFJJOwotCX0KLQlrcmVmX2dldCgmdC0+cmVm Y291bnQpOwotCi0JcmN1X3JlYWRfdW5sb2NrKCk7CiAKIAlwb2xsX3dhaXQoZmlsZSwgJnQtPmV2 ZW50X3dhaXQsIHdhaXQpOwogCiAJaWYgKGNtcHhjaGcoJnQtPmV2ZW50LCAxLCAwKSA9PSAxKQog CQlyZXQgfD0gRVBPTExQUkk7CiAKLQlrcmVmX3B1dCgmdC0+cmVmY291bnQsIHBzaV90cmlnZ2Vy X2Rlc3Ryb3kpOwotCiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMTM0Nyw3ICsxMzc0LDcgQEAgc3Rh dGljIGludCBwc2lfZm9wX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUg KmZpbGUpCiB7CiAJc3RydWN0IHNlcV9maWxlICpzZXEgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAK LQlwc2lfdHJpZ2dlcl9yZXBsYWNlKCZzZXEtPnByaXZhdGUsIE5VTEwpOworCXBzaV90cmlnZ2Vy X3JlbGVhc2UoJnNlcS0+cHJpdmF0ZSk7CiAJcmV0dXJuIHNpbmdsZV9yZWxlYXNlKGlub2RlLCBm aWxlKTsKIH0KIAo= --00000000000002b22d05d4f1d4eb--