linux-btrfs.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 1/5] Btrfs: stop defrag the files automatically when doin readonly remount or umount
@ 2012-05-17 11:55 Miao Xie
  0 siblings, 0 replies; only message in thread
From: Miao Xie @ 2012-05-17 11:55 UTC (permalink / raw)
  To: Linux Btrfs

If we remount the fs to be readonly or umount it, we should not continue
defraging the files, it is because
- the auto defragment will introduce lots of dirty pages, it breaks the rule
  of a readonly file system.
- it make the time of remount/umount become longer.

Signed-off-by: Miao Xie <miaox@cn.fujitsu.com>
---
 fs/btrfs/disk-io.c |   12 +++++++-----
 fs/btrfs/file.c    |    3 ++-
 fs/btrfs/super.c   |    5 +++++
 3 files changed, 14 insertions(+), 6 deletions(-)

diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c
index 20196f4..9a571f7 100644
--- a/fs/btrfs/disk-io.c
+++ b/fs/btrfs/disk-io.c
@@ -1529,6 +1529,9 @@ static int cleaner_kthread(void *arg)
 	do {
 		vfs_check_frozen(root->fs_info->sb, SB_FREEZE_WRITE);
 
+		if (!down_read_trylock(&root->fs_info->sb->s_umount))
+			goto skip;
+
 		if (!(root->fs_info->sb->s_flags & MS_RDONLY) &&
 		    mutex_trylock(&root->fs_info->cleaner_mutex)) {
 			btrfs_run_delayed_iputs(root);
@@ -1536,7 +1539,8 @@ static int cleaner_kthread(void *arg)
 			mutex_unlock(&root->fs_info->cleaner_mutex);
 			btrfs_run_defrag_inodes(root->fs_info);
 		}
-
+		up_read(&root->fs_info->sb->s_umount);
+skip:
 		if (!try_to_freeze()) {
 			set_current_state(TASK_INTERRUPTIBLE);
 			if (!kthread_should_stop())
@@ -3049,13 +3053,11 @@ int close_ctree(struct btrfs_root *root)
 
 	btrfs_scrub_cancel(root);
 
-	/* wait for any defraggers to finish */
-	wait_event(fs_info->transaction_wait,
-		   (atomic_read(&fs_info->defrag_running) == 0));
-
 	/* clear out the rbtree of defraggable inodes */
 	btrfs_run_defrag_inodes(fs_info);
 
+	BUG_ON(atomic_read(&fs_info->defrag_running));
+
 	/*
 	 * Here come 2 situations when btrfs is broken to flip readonly:
 	 *
diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c
index d83260d..23364c1 100644
--- a/fs/btrfs/file.c
+++ b/fs/btrfs/file.c
@@ -230,7 +230,8 @@ int btrfs_run_defrag_inodes(struct btrfs_fs_info *fs_info)
 		first_ino = defrag->ino + 1;
 		rb_erase(&defrag->rb_node, &fs_info->defrag_inodes);
 
-		if (btrfs_fs_closing(fs_info))
+		if (btrfs_fs_closing(fs_info) ||
+		    (fs_info->sb->s_flags & MS_RDONLY))
 			goto next_free;
 
 		spin_unlock(&fs_info->defrag_inodes_lock);
diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c
index 84571d7..7deb00e 100644
--- a/fs/btrfs/super.c
+++ b/fs/btrfs/super.c
@@ -1151,6 +1151,11 @@ static int btrfs_remount(struct super_block *sb, int *flags, char *data)
 		ret = btrfs_commit_super(root);
 		if (ret)
 			goto restore;
+
+		/* clear out the rbtree of defraggable inodes */
+		btrfs_run_defrag_inodes(fs_info);
+
+		BUG_ON(atomic_read(&fs_info->defrag_running));
 	} else {
 		if (fs_info->fs_devices->rw_devices == 0)
 			ret = -EACCES;
-- 
1.7.6.5

^ permalink raw reply related	[flat|nested] only message in thread

only message in thread, other threads:[~2012-05-17 11:56 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-05-17 11:55 [PATCH 1/5] Btrfs: stop defrag the files automatically when doin readonly remount or umount Miao Xie

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).