initialization online defrag on a new mount. cleanup when unmounting. Signed-off-by: Wengang Wang <wen.gang.wang@xxxxxxxxxx> --- fs/xfs/xfs_defrag.c | 23 +++++++++++++++++++++++ fs/xfs/xfs_mount.c | 3 +++ fs/xfs/xfs_super.c | 3 +++ 3 files changed, 29 insertions(+) diff --git a/fs/xfs/xfs_defrag.c b/fs/xfs/xfs_defrag.c index 954d05376809..8bdc6290a69d 100644 --- a/fs/xfs/xfs_defrag.c +++ b/fs/xfs/xfs_defrag.c @@ -54,6 +54,29 @@ */ #define XFS_DEFRAG_MAX_PIECE_BLOCKS 4096U +/* initialization called for new mount */ +void xfs_initialize_defrag(struct xfs_mount *mp) +{ + sema_init(&mp->m_defrag_lock, 1); + mp->m_nr_defrag = 0; + mp->m_defrag_task = NULL; + INIT_LIST_HEAD(&mp->m_defrag_list); +} + +/* stop all the defragmentations on this mount and wait until they really stopped */ +void xfs_stop_wait_defrags(struct xfs_mount *mp) +{ + down(&mp->m_defrag_lock); + if (list_empty(&mp->m_defrag_list)) { + up(&mp->m_defrag_lock); + return; + } + ASSERT(mp->m_defrag_task); + up(&mp->m_defrag_lock); + kthread_stop(mp->m_defrag_task); + mp->m_defrag_task = NULL; +} + int xfs_file_defrag(struct file *filp, struct xfs_defrag *defrag) { return -EOPNOTSUPP; diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index aed5be5508fe..ed7e1f150b59 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c @@ -35,6 +35,7 @@ #include "xfs_trace.h" #include "xfs_ag.h" #include "scrub/stats.h" +#include "xfs_defrag.h" static DEFINE_MUTEX(xfs_uuid_table_mutex); static int xfs_uuid_table_size; @@ -1056,6 +1057,8 @@ xfs_unmountfs( uint64_t resblks; int error; + xfs_stop_wait_defrags(mp); + /* * Perform all on-disk metadata updates required to inactivate inodes * that the VFS evicted earlier in the unmount process. Freeing inodes diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index 764304595e8b..f74706130e35 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -44,6 +44,7 @@ #include "xfs_dahash_test.h" #include "xfs_rtbitmap.h" #include "scrub/stats.h" +#include "xfs_defrag.h" #include <linux/magic.h> #include <linux/fs_context.h> @@ -2023,6 +2024,8 @@ static int xfs_init_fs_context( fc->s_fs_info = mp; fc->ops = &xfs_context_ops; + xfs_initialize_defrag(mp); + return 0; } -- 2.39.3 (Apple Git-145)