]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
xfs: zero i_nlink before repair puts inode on unlinked list
authorDarrick J. Wong <djwong@kernel.org>
Tue, 21 Jul 2026 03:24:33 +0000 (20:24 -0700)
committerCarlos Maiolino <cem@kernel.org>
Wed, 22 Jul 2026 13:06:25 +0000 (15:06 +0200)
LOLLM observes that we don't reset i_nlink if we encounter a file with
no parent that isn't on the unlinked list.  This causes unnecessary
assertion trips on debugging kernels and an inconsistent file, so let's
fix that.

Cc: stable@vger.kernel.org # v6.10
Fixes: 669dfe883c8e20 ("xfs: update the unlinked list when repairing link counts")
Signed-off-by: "Darrick J. Wong" <djwong@kernel.org>
Assisted-by: LOLLM # finding obvious bugs
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Carlos Maiolino <cem@kernel.org>
fs/xfs/scrub/nlinks_repair.c

index fbc2ff809fc06fc7058da9924b8987b5d3777055..09e097e1668935f360047f12a4668fcabf1c8fcd 100644 (file)
@@ -232,9 +232,14 @@ xrep_nlinks_repair_inode(
         * unlinked list, put it on the unlinked list.
         */
        if (total_links == 0 && !xfs_inode_on_unlinked_list(ip)) {
+               if (actual_nlink)
+                       clear_nlink(VFS_I(ip));
                error = xfs_iunlink(sc->tp, ip);
-               if (error)
+               if (error) {
+                       if (actual_nlink)
+                               set_nlink(VFS_I(ip), actual_nlink);
                        goto out_trans;
+               }
                dirty = true;
        }