From: Eric Sandeen Date: Tue, 15 Apr 2025 18:09:23 +0000 (-0500) Subject: xfs_repair: Bump link count if longform_dir2_rebuild yields shortform dir X-Git-Tag: v6.15.0~44 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=454fab69c484c24d8fb76ac3676553a54af381f7;p=thirdparty%2Fxfsprogs-dev.git xfs_repair: Bump link count if longform_dir2_rebuild yields shortform dir If longform_dir2_rebuild() has so few entries in *hashtab that it results in a short form directory, bump the link count manually as shortform directories have no explicit "." entry. Without this, repair will end with i.e.: resetting inode 131 nlinks from 2 to 1 in this case, because it thinks this directory inode only has 1 link discovered, and then a 2nd repair will fix it: resetting inode 131 nlinks from 1 to 2 because shortform_dir2_entry_check() explicitly adds the extra ref when the (newly-created)shortform directory is checked: /* * no '.' entry in shortform dirs, just bump up ref count by 1 * '..' was already (or will be) accounted for and checked when * the directory is reached or will be taken care of when the * directory is moved to orphanage. */ add_inode_ref(current_irec, current_ino_offset); Avoid this by adding the extra ref if we convert from longform to shortform. Signed-off-by: Eric Sandeen [aalbersh drop SoB with user.mail as name] Reviewed-by: Bill O'Donnell Reviewed-by: Darrick J. Wong --- diff --git a/repair/phase6.c b/repair/phase6.c index dbc090a5..8804278a 100644 --- a/repair/phase6.c +++ b/repair/phase6.c @@ -1392,6 +1392,13 @@ _("name create failed in ino %" PRIu64 " (%d)\n"), ino, error); _("name create failed (%d) during rebuild\n"), error); } + /* + * If we added too few entries to retain longform, add the extra + * ref for . as this is now a shortform directory. + */ + if (ip->i_df.if_format == XFS_DINODE_FMT_LOCAL) + add_inode_ref(irec, ino_offset); + return; out_bmap_cancel: