summaryrefslogtreecommitdiff
path: root/fs/xfs/xfs_log_recover.c
diff options
context:
space:
mode:
authorDarrick J. Wong <djwong@kernel.org>2021-06-21 10:34:18 -0700
committerDarrick J. Wong <djwong@kernel.org>2021-07-23 18:21:40 -0700
commit273d5694f010d9aa3f97fe4a35c97b9e259715d8 (patch)
treecccf669bd31954f9e96ba4c731357d392356d198 /fs/xfs/xfs_log_recover.c
parentdbf5dc200d38851e0c08a436526e3c99d5b474a4 (diff)
xfs: defer inode inactivation to a workqueue
Instead of calling xfs_inactive directly from xfs_fs_destroy_inode, defer the inactivation phase to a separate workqueue. With this change, we can speed up directory tree deletions by reducing the duration of unlink() calls to the directory and unlinked list updates. By moving the inactivation work to the background, we can reduce the total cost of deleting a lot of files by performing the file deletions in disk order instead of directory entry order, which can be arbitrary. We introduce two new inode flags -- NEEDS_INACTIVE and INACTIVATING. The first flag helps our worker find inodes needing inactivation, and the second flag marks inodes that are in the process of being inactivated. A concurrent xfs_iget on the inode can still resurrect the inode by clearing NEEDS_INACTIVE (or bailing if INACTIVATING is set). Unfortunately, deferring the inactivation has one huge downside -- eventual consistency. Since all the freeing is deferred to a worker thread, one can rm a file but the space doesn't come back immediately. This can cause some odd side effects with quota accounting and statfs, so we flush inactivation work during syncfs in order to maintain the existing behaviors, at least for callers that unlink() and sync(). For this patch we'll set the delay to zero to mimic the old timing as much as possible; in the next patch we'll play with different delay settings. Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Diffstat (limited to 'fs/xfs/xfs_log_recover.c')
-rw-r--r--fs/xfs/xfs_log_recover.c7
1 files changed, 7 insertions, 0 deletions
diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c
index 1721fce2ec94..a98d2429d795 100644
--- a/fs/xfs/xfs_log_recover.c
+++ b/fs/xfs/xfs_log_recover.c
@@ -2786,6 +2786,13 @@ xlog_recover_process_iunlinks(
}
xfs_buf_rele(agibp);
}
+
+ /*
+ * Flush the pending unlinked inodes to ensure that the inactivations
+ * are fully completed on disk and the incore inodes can be reclaimed
+ * before we signal that recovery is complete.
+ */
+ xfs_inodegc_flush(mp);
}
STATIC void