xfs: use i_prev_unlinked to distinguish inodes that are not on the unlinked list
authorDarrick J. Wong <djwong@kernel.org>
Mon, 11 Sep 2023 15:39:07 +0000 (08:39 -0700)
committerDarrick J. Wong <djwong@kernel.org>
Tue, 12 Sep 2023 17:31:07 +0000 (10:31 -0700)
commitf12b96683d6976a3a07fdf3323277c79dbe8f6ab
tree26d0306342e5e3c499945db875046b7d8f7f052d
parent68b957f64fca1930164bfc6d6d379acdccd547d7
xfs: use i_prev_unlinked to distinguish inodes that are not on the unlinked list

Alter the definition of i_prev_unlinked slightly to make it more obvious
when an inode with 0 link count is not part of the iunlink bucket lists
rooted in the AGI.  This distinction is necessary because it is not
sufficient to check inode.i_nlink to decide if an inode is on the
unlinked list.  Updates to i_nlink can happen while holding only
ILOCK_EXCL, but updates to an inode's position in the AGI unlinked list
(which happen after the nlink update) requires both ILOCK_EXCL and the
AGI buffer lock.

The next few patches will make it possible to reload an entire unlinked
bucket list when we're walking the inode table or performing handle
operations and need more than the ability to iget the last inode in the
chain.

The upcoming directory repair code also needs to be able to make this
distinction to decide if a zero link count directory should be moved to
the orphanage or allowed to inactivate.  An upcoming enhancement to the
online AGI fsck code will need this distinction to check and rebuild the
AGI unlinked buckets.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
fs/xfs/xfs_icache.c
fs/xfs/xfs_inode.c
fs/xfs/xfs_inode.h