aboutsummaryrefslogtreecommitdiffstats
path: root/fs/xfs/xfs_log_recover.c
diff options
context:
space:
mode:
authorDarrick J. Wong <darrick.wong@oracle.com>2016-10-03 12:11:29 -0400
committerDarrick J. Wong <darrick.wong@oracle.com>2016-10-04 14:05:44 -0400
commit17c12bcd3030e4b3247d0c961ce598c731a9dcf9 (patch)
tree6f3cf25e6946232fa12a73df795f43a873f68193 /fs/xfs/xfs_log_recover.c
parent9f3afb57d5f1e7145986132106c6ca91f8136cc2 (diff)
xfs: when replaying bmap operations, don't let unlinked inodes get reaped
Log recovery will iget an inode to replay BUI items and iput the inode when it's done. Unfortunately, if the inode was unlinked, the iput will see that i_nlink == 0 and decide to truncate & free the inode, which prevents us from replaying subsequent BUIs. We can't skip the BUIs because we have to replay all the redo items to ensure that atomic operations complete. Since unlinked inode recovery will reap the inode anyway, we can safely introduce a new inode flag to indicate that an inode is in this 'unlinked recovery' state and should not be auto-reaped in the drop_inode path. Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com> Reviewed-by: Christoph Hellwig <hch@lst.de>
Diffstat (limited to 'fs/xfs/xfs_log_recover.c')
-rw-r--r--fs/xfs/xfs_log_recover.c1
1 files changed, 1 insertions, 0 deletions
diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c
index 9697e946aa35..9b3d7c76915d 100644
--- a/fs/xfs/xfs_log_recover.c
+++ b/fs/xfs/xfs_log_recover.c
@@ -4969,6 +4969,7 @@ xlog_recover_process_one_iunlink(
4969 if (error) 4969 if (error)
4970 goto fail_iput; 4970 goto fail_iput;
4971 4971
4972 xfs_iflags_clear(ip, XFS_IRECOVERY);
4972 ASSERT(VFS_I(ip)->i_nlink == 0); 4973 ASSERT(VFS_I(ip)->i_nlink == 0);
4973 ASSERT(VFS_I(ip)->i_mode != 0); 4974 ASSERT(VFS_I(ip)->i_mode != 0);
4974 4975