Skip to content

Commit 8204f8d

Browse files
committed
xfs: clear MS_ACTIVE after finishing log recovery
Way back when we established inode block-map redo log items, it was discovered that we needed to prevent the VFS from evicting inodes during log recovery because any given inode might be have bmap redo items to replay even if the inode has no link count and is ultimately deleted, and any eviction of an unlinked inode causes the inode to be truncated and freed too early. To make this possible, we set MS_ACTIVE so that inodes would not be torn down immediately upon release. Unfortunately, this also results in the quota inodes not being released at all if a later part of the mount process should fail, because we never reclaim the inodes. So, set MS_ACTIVE right before we do the last part of log recovery and clear it immediately after we finish the log recovery so that everything will be torn down properly if we abort the mount. Fixes: 17c12bc ("xfs: when replaying bmap operations, don't let unlinked inodes get reaped") Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com> Reviewed-by: Brian Foster <bfoster@redhat.com>
1 parent e28ae8e commit 8204f8d

File tree

2 files changed

+11
-10
lines changed

2 files changed

+11
-10
lines changed

fs/xfs/xfs_log.c

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -749,9 +749,20 @@ xfs_log_mount_finish(
749749
return 0;
750750
}
751751

752+
/*
753+
* During the second phase of log recovery, we need iget and
754+
* iput to behave like they do for an active filesystem.
755+
* xfs_fs_drop_inode needs to be able to prevent the deletion
756+
* of inodes before we're done replaying log items on those
757+
* inodes. Turn it off immediately after recovery finishes
758+
* so that we don't leak the quota inodes if subsequent mount
759+
* activities fail.
760+
*/
761+
mp->m_super->s_flags |= MS_ACTIVE;
752762
error = xlog_recover_finish(mp->m_log);
753763
if (!error)
754764
xfs_log_work_queue(mp);
765+
mp->m_super->s_flags &= ~MS_ACTIVE;
755766

756767
return error;
757768
}

fs/xfs/xfs_mount.c

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -944,15 +944,6 @@ xfs_mountfs(
944944
}
945945
}
946946

947-
/*
948-
* During the second phase of log recovery, we need iget and
949-
* iput to behave like they do for an active filesystem.
950-
* xfs_fs_drop_inode needs to be able to prevent the deletion
951-
* of inodes before we're done replaying log items on those
952-
* inodes.
953-
*/
954-
mp->m_super->s_flags |= MS_ACTIVE;
955-
956947
/*
957948
* Finish recovering the file system. This part needed to be delayed
958949
* until after the root and real-time bitmap inodes were consistently
@@ -1028,7 +1019,6 @@ xfs_mountfs(
10281019
out_quota:
10291020
xfs_qm_unmount_quotas(mp);
10301021
out_rtunmount:
1031-
mp->m_super->s_flags &= ~MS_ACTIVE;
10321022
xfs_rtunmount_inodes(mp);
10331023
out_rele_rip:
10341024
IRELE(rip);

0 commit comments

Comments
 (0)