From mboxrd@z Thu Jan 1 00:00:00 1970 Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.remote-ip=100.103.45.18 ARC-Seal: i=1; d=subspace.kernel.org; s=arc20261015; a=rsa-sha256; cv=none; t=1794657802; b=midBVZVnhm1hNbTejFuqrgMmeoYeCKnry2vfGTWK3V0cDsuEo1vfcWZIwAcaHSGqDNp+ plUuSSZVH/IRWU49HatunUuyLJ7hNM8wEhAqeE1uQ3/4jXDCLiZhG3m6Q3AL0YPtnJ66w 6/NHmEVnSrGDZTKMaflMuEnuptgJ/UpxUHvkcyHKVZLh9Doe8reX9P13IcAsNHtpWYhGn HXGCtBHNu1WXRpl7BS/adnqV3HFPMDZuzYPXW5aRGYV2hf1PYdEpdzqS9dBAIfeCtWWzG rdNDXvfupaltlY/3Pho29rxGS/IrQM3U5fFmZRjlcZs37Xb4yOfh1mHG4M1VTR1hr7g== ARC-Message-Signature: i=1; d=subspace.kernel.org; s=arc20261015; a=rsa-sha256; c=relaxed/relaxed; t=1794657802; h=Received:DKIM-Signature:Message-ID:From:Subject:Reply-To:To:Cc: In-Reply-To:References:Content-Type:Content-Transfer-Encoding:Date; bh=ZtvIFXoOKLAsH+V2h5HHt5wrTO8bTwuJgaiMNtvW4Sw=; b=YcOLFYDsnO6Lk+11mbk9SDaqAXOvdLw4mbKnOuRWNyRlxmx8zs4R4H+8DapsYZJbrefv /9sMe6CNaPWsFqVAmoND7P4jdCai6MXXIi0xziu279AXmJ6J4NGNpyEdpLRk/IerkXnSl AJynfom1CMtvrJ4VgBWPacmiQXR8JUc6K19g6HTAzdSqr8GVqtfI7YjcP11dpbw2FxqNz PgnRzp2wyQgDG315zxNqUhvr+ZegpyhfhU7ZQTJWNYxNkp5PnUB8DcvBn1ngijsNVlDaT M7zbS++c4bAZokoegY+K9IDVxOHM326R5KA1u7S5ZPn9ru5FpbN7xlK1t5rHQVUjdug== ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass header.d=kernel.org header.i=@kernel.org header.a=rsa-sha256 header.s=k20260515 header.b=ZBqU4DgI; arc=none smtp.remote-ip=100.103.45.18 Received: from smtp.kernel.org (quasi.space.kernel.org [100.103.45.18]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (prime256v1)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 531A6606A327; Sat, 14 Nov 2026 12:03:22 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.a=rsa-sha256 header.s=k20260515 header.b=ZBqU4DgI Received: by smtp.kernel.org (Postfix) with ESMTPSA id 4FBAB1F000C4; Sat, 14 Nov 2026 12:03:21 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1794657801; bh=ZtvIFXoOKLAsH+V2h5HHt5wrTO8bTwuJgaiMNtvW4Sw=; h=From:Subject:Reply-To:To:Cc:In-Reply-To:References:Date; b=ZBqU4DgIsVF4fBQNr4bYIKhPWkjeKQvvtPUUd9Cz31YPzLVJOtMSWjDuH7EGA/h7n P2EPM9PNC3jDOgl7kqQR3OcR5SuiZnwdbTz/URj/thGHq6pavdyM9GR1V7q5+9Nr9L ogQpeDGM/vpkwHN2a+d6KH5p1Dq1y5+epVPBRSkaCZhhXeQqYtWZ7nOpi4phoiJOFa QW2WytooNIT+NaZ1bOtDLE6flFWVJJCUO+3bxaKOxlU9uNVzGHsSLlk/mD2Ae18ZH1 y1aN0XFGCVxI9RZanX5gvGBBfw/tKxhyoRW6iX00wFbvNon9+aBAYwguwpQmTyJmz/ sjdBN32e0lXhA== Message-ID: From: sashiko-bot@kernel.org Subject: Re: [PATCH v3 01/33] jfs: free uncommitted anonymous tlocks when evicting an inode Reply-To: sashiko-reviews@lists.linux.dev To: "Christian Brauner" , "Jan Kara" Cc: "Al Viro" , linux-ext4@vger.kernel.org, linux-mm@kvack.org, linux-efi@vger.kernel.org, linux-mtd@lists.infradead.org, dsterba@suse.cz, tytso@mit.edu, "Mark Fasheh" , "Joel Becker" , "Joseph Qi" In-Reply-To: <20261113-work-fs-sb_rdonly-v3-1-0be92bb73709@kernel.org> References: <20261113-work-fs-sb_rdonly-v3-0-0be92bb73709@kernel.org> <20261113-work-fs-sb_rdonly-v3-1-0be92bb73709@kernel.org> Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Date: Sat, 14 Nov 2026 12:03:20 +0000 X-Mailing-List: linux-efi@vger.kernel.org List-Id: List-Post: List-Help: List-Subscribe: List-Unsubscribe: List-Owner: Precedence: list Thank you for your contribution! Sashiko AI review found 3 potential issues to consider: - [Medium] jfs: false WARN_ON_ONCE() in jfs_evict_inode() on read-write mounts - [Medium] jfs: txAbortAnon() after jfs_free_zero_link() leaks metapages and tlocks - [Medium] jfs: race between jfs_evict_inode(), txAbortAnon(), and txQuiesce() -- commit a15655dff32c48b09c331d3e03e198e2173008c1 Author: Christian Brauner jfs: free uncommitted anonymous tlocks when evicting an inode This commit adds txAbortAnon() and calls it from jfs_evict_inode() to release uncommitted anonymous transaction locks and metapage pins when an inode is evicted before writeback commits them. > diff --git a/fs/jfs/inode.c b/fs/jfs/inode.c > index c7914dbc91ed9..6390d915c7f11 100644 > --- a/fs/jfs/inode.c > +++ b/fs/jfs/inode.c > @@ -172,6 +172,15 @@ void jfs_evict_inode(struct inode *inode) > clear_inode(inode); > dquot_drop(inode); > =20 > + /* > + * Writeback commits the anonymous transactions of allocations. If the > + * filesystem went read-only without a sync, e.g. after an error, > + * nothing did. > + */ > + if (ji->atlhead) { > + WARN_ON_ONCE(!sb_rdonly(inode->i_sb)); [Severity: Medium] Can WARN_ON_ONCE(!sb_rdonly(inode->i_sb)) fire on a read-write mount when ji->atlhead is left populated without setting COMMIT_Dirty? In extAlloc(), xtExtend() and xtInsert() acquire anonymous tlocks on non-root xtree metapages via txLock() before splitting pages in xtSplitUp(). When xtSplitUp() fails with -ENOSPC or -EDQUOT, extAlloc() frees the data blocks and returns before calling mark_inode_dirty(ip): fs/jfs/jfs_extent.c:extAlloc() { ... if (xaddr && xaddr =3D=3D nxaddr) rc =3D xtExtend(0, ip, xoff, (int) nxlen, 0); else rc =3D xtInsert(0, ip, xflag, xoff, (int) nxlen, &nxaddr, 0); /* if the extend or insert failed, * free the newly allocated blocks and return the error. */ if (rc) { dbFree(ip, nxaddr, nxlen); dquot_free_block(ip, nxlen); mutex_unlock(&JFS_IP(ip)->commit_mutex); return (rc); } ... mark_inode_dirty(ip); } Because COMMIT_Dirty is never set on the inode, jfs_write_inode() does not commit the anonymous tlocks, and evicting the inode triggers the warning on a read-write filesystem. The warning also triggers after a filesystem error when mounted with errors=3Dcontinue, where jfs_handle_error() marks t= he superblock dirty without setting SB_RDONLY, or via extRecord() -> xtUpdate(), which is fixed in a later patch in this series (commit "jfs: don't set SB_RDONLY after filesystem errors"). > + txAbortAnon(inode); > + } [Severity: Medium] Does calling txAbortAnon() after jfs_free_zero_link() leak metapages and linelocks when an unlinked inode with COMMIT_Freewmap is evicted after an error? Earlier in jfs_evict_inode(), an unlinked inode with COMMIT_Freewmap calls jfs_free_zero_link() -> xtTruncate(..., COMMIT_WMAP). For each non-root xtree metapage, xtTruncate() marks mp->lid with tlckFREELOCK, calls discard_metapage(mp), and finishes with txFreelock(ip): fs/jfs/jfs_txnmgr.c:txFreelock() { ... while ((lid =3D xtlck->next) !=3D 0) { tlck =3D lid_to_tlock(lid); if (tlck->flag & tlckFREELOCK) { xtlck->next =3D tlck->next; txLockFree(lid); } else { ... } If the transaction in jfs_unlink() or jfs_rename() aborted after commitZeroLink() set COMMIT_Freewmap, ji->atlhead still holds anonymous tlckPAGELOCK tlocks when jfs_evict_inode() runs. txFreelock() unlinks those tlocks from ji->atlhead and frees lid before txAbortAnon() runs, without dropping mp->nohomeok, clearing mp->lid, or freeing chained linelocks. Calling txAbortAnon() before jfs_free_zero_link() would release the metapage pins and linelocks before xtTruncate() discards the pages. > diff --git a/fs/jfs/jfs_txnmgr.c b/fs/jfs/jfs_txnmgr.c > index 083dbbb0c3268..85192dd4461a4 100644 > --- a/fs/jfs/jfs_txnmgr.c > +++ b/fs/jfs/jfs_txnmgr.c > @@ -2581,6 +2581,74 @@ void txFreelock(struct inode *ip) > TXN_UNLOCK(); > } > =20 > +/* > + * txAbortAnon() > + * > + * function: free the anonymous tlocks of an inode that is evicted > + * before writeback committed them, e.g. because an error made > + * the filesystem read-only. > + * > + * A page that carries nothing but uncommitted changes isn't written hom= e. > + * A page that is also waiting to go home with committed changes (mp->ls= n) > + * goes home with both, after an error the superblock is marked dirty. > + */ > +void txAbortAnon(struct inode *ip) > +{ > + struct jfs_inode_info *jfs_ip =3D JFS_IP(ip); > + struct linelock *linelock; > + struct metapage *mp; > + struct tlock *tlck; > + lid_t lid, next, llid, k; > + > + /* txQuiesce() and jfs_sync() commit under the commit_mutex */ > + mutex_lock(&jfs_ip->commit_mutex); > + > + TXN_LOCK(); > + lid =3D jfs_ip->atlhead; > + jfs_ip->atlhead =3D jfs_ip->atltail =3D 0; > + list_del_init(&jfs_ip->anon_inode_list); > + TXN_UNLOCK(); [Severity: Medium] Can jfs_evict_inode() and txAbortAnon() race with txQuiesce() walking the global TxAnchor.anon_list? txQuiesce() walks TxAnchor.anon_list (shared across all JFS mounts) under TXN_LOCK() and drops TXN_LOCK() without pinning the inode before taking commit_mutex: CPU0 CPU1 txQuiesce() jfs_evict_inode() TXN_LOCK() txAbortAnon() jfs_ip =3D list_entry(...) mutex_lock(&jfs_ip->commit_mutex) TXN_UNLOCK() TXN_LOCK() list_del_init(&jfs_ip->anon_inode_lis= t) TXN_UNLOCK() ... mutex_unlock(&jfs_ip->commit_mutex) ... destroy_inode(ip) txBegin(ip->i_sb, ...) mutex_lock(&jfs_ip->commit_mutex) <-- use-after-free In the opposite interleaving, txCommit() called from txQuiesce() clears jfs_ip->atlhead =3D 0 before taking TXN_LOCK() to remove jfs_ip->anon_inode_list. Because jfs_evict_inode() checks if (ji->atlhead) without commit_mutex or TXN_LOCK(), it can see ji->atlhead =3D=3D 0, skip txAbortAnon(), and hit BUG_ON(!list_empty(&ji->anon_inode_list)) or free the inode while txCommit() is still running. --=20 Sashiko AI review =C2=B7 https://sashiko.dev/#/patchset/20261113-work-fs-sb= _rdonly-v3-0-0be92bb73709@kernel.org?part=3D1 From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (prime256v1) server-digest SHA256) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A4BF4606A889 for ; Sat, 14 Nov 2026 12:03:28 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.a=rsa-sha256 header.s=bombadil.20210309 header.b=hc5OmnR9; dkim=fail reason="signature verification failed" (2048-bit key) header.d=kernel.org header.i=@kernel.org header.a=rsa-sha256 header.s=k20260515 header.b=ZBqU4DgI DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:MIME-Version:Reply-To:List-Subscribe: List-Help:List-Post:List-Archive:List-Unsubscribe:List-Id:Date:References: In-Reply-To:Cc:To:Subject:From:Message-ID:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Unsubscribe-Post:List-Owner; bh=0Am3zAlkEORH21gkofuGaLquTO6fNj8TwPKHNRNPotA=; b=hc5OmnR9+aldeaHjnbaHExClLN yLMChq875bp8GFKSVnJdrMsDT+mZCRiXoLipv7CV3iNj4DrarcRbpCOivZ+BFsEa5LOqBjsvRyzLc G32Rym0xmZBOq6bZ9WtbZ94Bwm3+Bs8K8QkqKnxA+2IjKMcUgGYDukXOJXXOqqZunU+vwAer/111/ L/a5mdKLsDIp38MGWPKNVqqr4QDynJwZH+tmU9aUePSea5qG/EQsTzg+dfx1vZG0lRua3NLzJ1f+C uN9LYepZFTIM7/u5sW1yzumij8/SK0Lse91VdW+WXZZXyfCD+cJe8ktvTCCmkygpk62qC3+CnARIw wz8KVq9w==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.100.1 #2 (Red Hat Linux)) id 1xSCTc-0000000Fypd-2boK; Sat, 14 Nov 2026 12:03:24 +0000 Received: from tor.source.kernel.org ([2600:3c04:e001:324:0:1991:8:25]) by bombadil.infradead.org with esmtps (Exim 4.100.1 #2 (Red Hat Linux)) id 1xSCTb-0000000FypT-0MQY for linux-mtd@lists.infradead.org; Sat, 14 Nov 2026 12:03:23 +0000 Received: from smtp.kernel.org (quasi.space.kernel.org [100.103.45.18]) by tor.source.kernel.org (Postfix) with ESMTP id 2ACB9602D3; Sat, 14 Nov 2026 12:03:22 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 4FBAB1F000C4; Sat, 14 Nov 2026 12:03:21 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1794657801; bh=ZtvIFXoOKLAsH+V2h5HHt5wrTO8bTwuJgaiMNtvW4Sw=; h=From:Subject:Reply-To:To:Cc:In-Reply-To:References:Date; b=ZBqU4DgIsVF4fBQNr4bYIKhPWkjeKQvvtPUUd9Cz31YPzLVJOtMSWjDuH7EGA/h7n P2EPM9PNC3jDOgl7kqQR3OcR5SuiZnwdbTz/URj/thGHq6pavdyM9GR1V7q5+9Nr9L ogQpeDGM/vpkwHN2a+d6KH5p1Dq1y5+epVPBRSkaCZhhXeQqYtWZ7nOpi4phoiJOFa QW2WytooNIT+NaZ1bOtDLE6flFWVJJCUO+3bxaKOxlU9uNVzGHsSLlk/mD2Ae18ZH1 y1aN0XFGCVxI9RZanX5gvGBBfw/tKxhyoRW6iX00wFbvNon9+aBAYwguwpQmTyJmz/ sjdBN32e0lXhA== Message-ID: From: sashiko-bot@kernel.org Subject: Re: [PATCH v3 01/33] jfs: free uncommitted anonymous tlocks when evicting an inode To: "Christian Brauner" , "Jan Kara" Cc: "Al Viro" , linux-ext4@vger.kernel.org, linux-mm@kvack.org, linux-efi@vger.kernel.org, linux-mtd@lists.infradead.org, dsterba@suse.cz, tytso@mit.edu, "Mark Fasheh" , "Joel Becker" , "Joseph Qi" In-Reply-To: <20261113-work-fs-sb_rdonly-v3-1-0be92bb73709@kernel.org> References: <20261113-work-fs-sb_rdonly-v3-0-0be92bb73709@kernel.org> <20261113-work-fs-sb_rdonly-v3-1-0be92bb73709@kernel.org> Date: Sat, 14 Nov 2026 12:03:20 +0000 X-BeenThere: linux-mtd@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: Linux MTD discussion mailing list List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: sashiko-reviews@lists.linux.dev X-Archived-By: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-mtd" X-Spam-Status: No, score=-8.9 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_EF,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=4.0.1 X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-26) on aws-us-west-2-korg-listserv-alma10-1 VGhhbmsgeW91IGZvciB5b3VyIGNvbnRyaWJ1dGlvbiEgU2FzaGlrbyBBSSByZXZpZXcgZm91bmQg MyBwb3RlbnRpYWwKaXNzdWVzIHRvIGNvbnNpZGVyOgotIFtNZWRpdW1dIGpmczogZmFsc2UgV0FS Tl9PTl9PTkNFKCkgaW4gamZzX2V2aWN0X2lub2RlKCkgb24gcmVhZC13cml0ZQogIG1vdW50cwot IFtNZWRpdW1dIGpmczogdHhBYm9ydEFub24oKSBhZnRlciBqZnNfZnJlZV96ZXJvX2xpbmsoKSBs ZWFrcyBtZXRhcGFnZXMKICBhbmQgdGxvY2tzCi0gW01lZGl1bV0gamZzOiByYWNlIGJldHdlZW4g amZzX2V2aWN0X2lub2RlKCksIHR4QWJvcnRBbm9uKCksIGFuZAogIHR4UXVpZXNjZSgpCi0tCgpj b21taXQgYTE1NjU1ZGZmMzJjNDhiMDljMzMxZDNlMDNlMTk4ZTIxNzMwMDhjMQpBdXRob3I6IENo cmlzdGlhbiBCcmF1bmVyIDxicmF1bmVyQGtlcm5lbC5vcmc+CgpqZnM6IGZyZWUgdW5jb21taXR0 ZWQgYW5vbnltb3VzIHRsb2NrcyB3aGVuIGV2aWN0aW5nIGFuIGlub2RlCgpUaGlzIGNvbW1pdCBh ZGRzIHR4QWJvcnRBbm9uKCkgYW5kIGNhbGxzIGl0IGZyb20gamZzX2V2aWN0X2lub2RlKCkgdG8K cmVsZWFzZSB1bmNvbW1pdHRlZCBhbm9ueW1vdXMgdHJhbnNhY3Rpb24gbG9ja3MgYW5kIG1ldGFw YWdlIHBpbnMgd2hlbiBhbgppbm9kZSBpcyBldmljdGVkIGJlZm9yZSB3cml0ZWJhY2sgY29tbWl0 cyB0aGVtLgoKPiBkaWZmIC0tZ2l0IGEvZnMvamZzL2lub2RlLmMgYi9mcy9qZnMvaW5vZGUuYwo+ IGluZGV4IGM3OTE0ZGJjOTFlZDkuLjYzOTBkOTE1YzdmMTEgMTAwNjQ0Cj4gLS0tIGEvZnMvamZz L2lub2RlLmMKPiArKysgYi9mcy9qZnMvaW5vZGUuYwo+IEBAIC0xNzIsNiArMTcyLDE1IEBAIHZv aWQgamZzX2V2aWN0X2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCj4gIAljbGVhcl9pbm9kZShp bm9kZSk7Cj4gIAlkcXVvdF9kcm9wKGlub2RlKTsKPiAgCj4gKwkvKgo+ICsJICogV3JpdGViYWNr IGNvbW1pdHMgdGhlIGFub255bW91cyB0cmFuc2FjdGlvbnMgb2YgYWxsb2NhdGlvbnMuIElmIHRo ZQo+ICsJICogZmlsZXN5c3RlbSB3ZW50IHJlYWQtb25seSB3aXRob3V0IGEgc3luYywgZS5nLiBh ZnRlciBhbiBlcnJvciwKPiArCSAqIG5vdGhpbmcgZGlkLgo+ICsJICovCj4gKwlpZiAoamktPmF0 bGhlYWQpIHsKPiArCQlXQVJOX09OX09OQ0UoIXNiX3Jkb25seShpbm9kZS0+aV9zYikpOwoKW1Nl dmVyaXR5OiBNZWRpdW1dCkNhbiBXQVJOX09OX09OQ0UoIXNiX3Jkb25seShpbm9kZS0+aV9zYikp IGZpcmUgb24gYSByZWFkLXdyaXRlIG1vdW50IHdoZW4KamktPmF0bGhlYWQgaXMgbGVmdCBwb3B1 bGF0ZWQgd2l0aG91dCBzZXR0aW5nIENPTU1JVF9EaXJ0eT8KCkluIGV4dEFsbG9jKCksIHh0RXh0 ZW5kKCkgYW5kIHh0SW5zZXJ0KCkgYWNxdWlyZSBhbm9ueW1vdXMgdGxvY2tzIG9uCm5vbi1yb290 IHh0cmVlIG1ldGFwYWdlcyB2aWEgdHhMb2NrKCkgYmVmb3JlIHNwbGl0dGluZyBwYWdlcyBpbgp4 dFNwbGl0VXAoKS4gIFdoZW4geHRTcGxpdFVwKCkgZmFpbHMgd2l0aCAtRU5PU1BDIG9yIC1FRFFV T1QsIGV4dEFsbG9jKCkKZnJlZXMgdGhlIGRhdGEgYmxvY2tzIGFuZCByZXR1cm5zIGJlZm9yZSBj YWxsaW5nIG1hcmtfaW5vZGVfZGlydHkoaXApOgoKZnMvamZzL2pmc19leHRlbnQuYzpleHRBbGxv YygpIHsKCS4uLgoJaWYgKHhhZGRyICYmIHhhZGRyID09IG54YWRkcikKCQlyYyA9IHh0RXh0ZW5k KDAsIGlwLCB4b2ZmLCAoaW50KSBueGxlbiwgMCk7CgllbHNlCgkJcmMgPSB4dEluc2VydCgwLCBp cCwgeGZsYWcsIHhvZmYsIChpbnQpIG54bGVuLCAmbnhhZGRyLCAwKTsKCgkvKiBpZiB0aGUgZXh0 ZW5kIG9yIGluc2VydCBmYWlsZWQsCgkgKiBmcmVlIHRoZSBuZXdseSBhbGxvY2F0ZWQgYmxvY2tz IGFuZCByZXR1cm4gdGhlIGVycm9yLgoJICovCglpZiAocmMpIHsKCQlkYkZyZWUoaXAsIG54YWRk ciwgbnhsZW4pOwoJCWRxdW90X2ZyZWVfYmxvY2soaXAsIG54bGVuKTsKCQltdXRleF91bmxvY2so JkpGU19JUChpcCktPmNvbW1pdF9tdXRleCk7CgkJcmV0dXJuIChyYyk7Cgl9CgkuLi4KCW1hcmtf aW5vZGVfZGlydHkoaXApOwp9CgpCZWNhdXNlIENPTU1JVF9EaXJ0eSBpcyBuZXZlciBzZXQgb24g dGhlIGlub2RlLCBqZnNfd3JpdGVfaW5vZGUoKSBkb2VzIG5vdApjb21taXQgdGhlIGFub255bW91 cyB0bG9ja3MsIGFuZCBldmljdGluZyB0aGUgaW5vZGUgdHJpZ2dlcnMgdGhlIHdhcm5pbmcgb24K YSByZWFkLXdyaXRlIGZpbGVzeXN0ZW0uICBUaGUgd2FybmluZyBhbHNvIHRyaWdnZXJzIGFmdGVy IGEgZmlsZXN5c3RlbQplcnJvciB3aGVuIG1vdW50ZWQgd2l0aCBlcnJvcnM9Y29udGludWUsIHdo ZXJlIGpmc19oYW5kbGVfZXJyb3IoKSBtYXJrcyB0aGUKc3VwZXJibG9jayBkaXJ0eSB3aXRob3V0 IHNldHRpbmcgU0JfUkRPTkxZLCBvciB2aWEgZXh0UmVjb3JkKCkgLT4KeHRVcGRhdGUoKSwgd2hp Y2ggaXMgZml4ZWQgaW4gYSBsYXRlciBwYXRjaCBpbiB0aGlzIHNlcmllcyAoY29tbWl0ICJqZnM6 CmRvbid0IHNldCBTQl9SRE9OTFkgYWZ0ZXIgZmlsZXN5c3RlbSBlcnJvcnMiKS4KCj4gKwkJdHhB Ym9ydEFub24oaW5vZGUpOwo+ICsJfQoKW1NldmVyaXR5OiBNZWRpdW1dCkRvZXMgY2FsbGluZyB0 eEFib3J0QW5vbigpIGFmdGVyIGpmc19mcmVlX3plcm9fbGluaygpIGxlYWsgbWV0YXBhZ2VzIGFu ZApsaW5lbG9ja3Mgd2hlbiBhbiB1bmxpbmtlZCBpbm9kZSB3aXRoIENPTU1JVF9GcmVld21hcCBp cyBldmljdGVkIGFmdGVyIGFuCmVycm9yPwoKRWFybGllciBpbiBqZnNfZXZpY3RfaW5vZGUoKSwg YW4gdW5saW5rZWQgaW5vZGUgd2l0aCBDT01NSVRfRnJlZXdtYXAgY2FsbHMKamZzX2ZyZWVfemVy b19saW5rKCkgLT4geHRUcnVuY2F0ZSguLi4sIENPTU1JVF9XTUFQKS4gIEZvciBlYWNoIG5vbi1y b290Cnh0cmVlIG1ldGFwYWdlLCB4dFRydW5jYXRlKCkgbWFya3MgbXAtPmxpZCB3aXRoIHRsY2tG UkVFTE9DSywgY2FsbHMKZGlzY2FyZF9tZXRhcGFnZShtcCksIGFuZCBmaW5pc2hlcyB3aXRoIHR4 RnJlZWxvY2soaXApOgoKZnMvamZzL2pmc190eG5tZ3IuYzp0eEZyZWVsb2NrKCkgewoJLi4uCgl3 aGlsZSAoKGxpZCA9IHh0bGNrLT5uZXh0KSAhPSAwKSB7CgkJdGxjayA9IGxpZF90b190bG9jayhs aWQpOwoJCWlmICh0bGNrLT5mbGFnICYgdGxja0ZSRUVMT0NLKSB7CgkJCXh0bGNrLT5uZXh0ID0g dGxjay0+bmV4dDsKCQkJdHhMb2NrRnJlZShsaWQpOwoJCX0gZWxzZSB7CgkuLi4KfQoKSWYgdGhl IHRyYW5zYWN0aW9uIGluIGpmc191bmxpbmsoKSBvciBqZnNfcmVuYW1lKCkgYWJvcnRlZCBhZnRl cgpjb21taXRaZXJvTGluaygpIHNldCBDT01NSVRfRnJlZXdtYXAsIGppLT5hdGxoZWFkIHN0aWxs IGhvbGRzIGFub255bW91cwp0bGNrUEFHRUxPQ0sgdGxvY2tzIHdoZW4gamZzX2V2aWN0X2lub2Rl KCkgcnVucy4gIHR4RnJlZWxvY2soKSB1bmxpbmtzCnRob3NlIHRsb2NrcyBmcm9tIGppLT5hdGxo ZWFkIGFuZCBmcmVlcyBsaWQgYmVmb3JlIHR4QWJvcnRBbm9uKCkgcnVucywKd2l0aG91dCBkcm9w cGluZyBtcC0+bm9ob21lb2ssIGNsZWFyaW5nIG1wLT5saWQsIG9yIGZyZWVpbmcgY2hhaW5lZAps aW5lbG9ja3MuICBDYWxsaW5nIHR4QWJvcnRBbm9uKCkgYmVmb3JlIGpmc19mcmVlX3plcm9fbGlu aygpIHdvdWxkIHJlbGVhc2UKdGhlIG1ldGFwYWdlIHBpbnMgYW5kIGxpbmVsb2NrcyBiZWZvcmUg eHRUcnVuY2F0ZSgpIGRpc2NhcmRzIHRoZSBwYWdlcy4KCj4gZGlmZiAtLWdpdCBhL2ZzL2pmcy9q ZnNfdHhubWdyLmMgYi9mcy9qZnMvamZzX3R4bm1nci5jCj4gaW5kZXggMDgzZGJiYjBjMzI2OC4u ODUxOTJkZDQ0NjFhNCAxMDA2NDQKPiAtLS0gYS9mcy9qZnMvamZzX3R4bm1nci5jCj4gKysrIGIv ZnMvamZzL2pmc190eG5tZ3IuYwo+IEBAIC0yNTgxLDYgKzI1ODEsNzQgQEAgdm9pZCB0eEZyZWVs b2NrKHN0cnVjdCBpbm9kZSAqaXApCj4gIAlUWE5fVU5MT0NLKCk7Cj4gIH0KPiAgCj4gKy8qCj4g KyAqCXR4QWJvcnRBbm9uKCkKPiArICoKPiArICogZnVuY3Rpb246CWZyZWUgdGhlIGFub255bW91 cyB0bG9ja3Mgb2YgYW4gaW5vZGUgdGhhdCBpcyBldmljdGVkCj4gKyAqCQliZWZvcmUgd3JpdGVi YWNrIGNvbW1pdHRlZCB0aGVtLCBlLmcuIGJlY2F1c2UgYW4gZXJyb3IgbWFkZQo+ICsgKgkJdGhl IGZpbGVzeXN0ZW0gcmVhZC1vbmx5Lgo+ICsgKgo+ICsgKiBBIHBhZ2UgdGhhdCBjYXJyaWVzIG5v dGhpbmcgYnV0IHVuY29tbWl0dGVkIGNoYW5nZXMgaXNuJ3Qgd3JpdHRlbiBob21lLgo+ICsgKiBB IHBhZ2UgdGhhdCBpcyBhbHNvIHdhaXRpbmcgdG8gZ28gaG9tZSB3aXRoIGNvbW1pdHRlZCBjaGFu Z2VzIChtcC0+bHNuKQo+ICsgKiBnb2VzIGhvbWUgd2l0aCBib3RoLCBhZnRlciBhbiBlcnJvciB0 aGUgc3VwZXJibG9jayBpcyBtYXJrZWQgZGlydHkuCj4gKyAqLwo+ICt2b2lkIHR4QWJvcnRBbm9u KHN0cnVjdCBpbm9kZSAqaXApCj4gK3sKPiArCXN0cnVjdCBqZnNfaW5vZGVfaW5mbyAqamZzX2lw ID0gSkZTX0lQKGlwKTsKPiArCXN0cnVjdCBsaW5lbG9jayAqbGluZWxvY2s7Cj4gKwlzdHJ1Y3Qg bWV0YXBhZ2UgKm1wOwo+ICsJc3RydWN0IHRsb2NrICp0bGNrOwo+ICsJbGlkX3QgbGlkLCBuZXh0 LCBsbGlkLCBrOwo+ICsKPiArCS8qIHR4UXVpZXNjZSgpIGFuZCBqZnNfc3luYygpIGNvbW1pdCB1 bmRlciB0aGUgY29tbWl0X211dGV4ICovCj4gKwltdXRleF9sb2NrKCZqZnNfaXAtPmNvbW1pdF9t dXRleCk7Cj4gKwo+ICsJVFhOX0xPQ0soKTsKPiArCWxpZCA9IGpmc19pcC0+YXRsaGVhZDsKPiAr CWpmc19pcC0+YXRsaGVhZCA9IGpmc19pcC0+YXRsdGFpbCA9IDA7Cj4gKwlsaXN0X2RlbF9pbml0 KCZqZnNfaXAtPmFub25faW5vZGVfbGlzdCk7Cj4gKwlUWE5fVU5MT0NLKCk7CgpbU2V2ZXJpdHk6 IE1lZGl1bV0KQ2FuIGpmc19ldmljdF9pbm9kZSgpIGFuZCB0eEFib3J0QW5vbigpIHJhY2Ugd2l0 aCB0eFF1aWVzY2UoKSB3YWxraW5nIHRoZQpnbG9iYWwgVHhBbmNob3IuYW5vbl9saXN0PwoKdHhR dWllc2NlKCkgd2Fsa3MgVHhBbmNob3IuYW5vbl9saXN0IChzaGFyZWQgYWNyb3NzIGFsbCBKRlMg bW91bnRzKSB1bmRlcgpUWE5fTE9DSygpIGFuZCBkcm9wcyBUWE5fTE9DSygpIHdpdGhvdXQgcGlu bmluZyB0aGUgaW5vZGUgYmVmb3JlIHRha2luZwpjb21taXRfbXV0ZXg6CgpDUFUwICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgQ1BVMQp0eFF1aWVzY2UoKSAgICAgICAgICAgICAgICAgICAg ICAgamZzX2V2aWN0X2lub2RlKCkKICBUWE5fTE9DSygpICAgICAgICAgICAgICAgICAgICAgICAg dHhBYm9ydEFub24oKQogIGpmc19pcCA9IGxpc3RfZW50cnkoLi4uKSAgICAgICAgICAgIG11dGV4 X2xvY2soJmpmc19pcC0+Y29tbWl0X211dGV4KQogIFRYTl9VTkxPQ0soKSAgICAgICAgICAgICAg ICAgICAgICAgIFRYTl9MT0NLKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBsaXN0X2RlbF9pbml0KCZqZnNfaXAtPmFub25faW5vZGVfbGlzdCkKICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBUWE5fVU5MT0NLKCkKICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBtdXRleF91bmxvY2soJmpmc19pcC0+Y29tbWl0X211dGV4KQogICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRl c3Ryb3lfaW5vZGUoaXApCiAgdHhCZWdpbihpcC0+aV9zYiwgLi4uKQogIG11dGV4X2xvY2soJmpm c19pcC0+Y29tbWl0X211dGV4KSAgPC0tIHVzZS1hZnRlci1mcmVlCgpJbiB0aGUgb3Bwb3NpdGUg aW50ZXJsZWF2aW5nLCB0eENvbW1pdCgpIGNhbGxlZCBmcm9tIHR4UXVpZXNjZSgpIGNsZWFycwpq ZnNfaXAtPmF0bGhlYWQgPSAwIGJlZm9yZSB0YWtpbmcgVFhOX0xPQ0soKSB0byByZW1vdmUKamZz X2lwLT5hbm9uX2lub2RlX2xpc3QuICBCZWNhdXNlIGpmc19ldmljdF9pbm9kZSgpIGNoZWNrcyBp ZiAoamktPmF0bGhlYWQpCndpdGhvdXQgY29tbWl0X211dGV4IG9yIFRYTl9MT0NLKCksIGl0IGNh biBzZWUgamktPmF0bGhlYWQgPT0gMCwgc2tpcAp0eEFib3J0QW5vbigpLCBhbmQgaGl0IEJVR19P TighbGlzdF9lbXB0eSgmamktPmFub25faW5vZGVfbGlzdCkpIG9yIGZyZWUKdGhlIGlub2RlIHdo aWxlIHR4Q29tbWl0KCkgaXMgc3RpbGwgcnVubmluZy4KCi0tIApTYXNoaWtvIEFJIHJldmlldyDC tyBodHRwczovL3Nhc2hpa28uZGV2LyMvcGF0Y2hzZXQvMjAyNjExMTMtd29yay1mcy1zYl9yZG9u bHktdjMtMC0wYmU5MmJiNzM3MDlAa2VybmVsLm9yZz9wYXJ0PTEKCl9fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpMaW51eCBNVEQgZGlzY3Vzc2lv biBtYWlsaW5nIGxpc3QKaHR0cDovL2xpc3RzLmluZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5m by9saW51eC1tdGQvCg==