Эх сурвалжийг харах

Btrfs: Fix async caching interaction with unmount

- don't stop the caching thread until btrfs_commit_super return.

- if caching is interrupted by umount, set last to (u64)-1.
  otherwise the un-scanned range of block group will be considered
  as free extent.

Signed-off-by: Chris Mason <chris.mason@oracle.com>
Yan Zheng 16 жил өмнө
parent
commit
f25784b35f

+ 3 - 0
fs/btrfs/disk-io.c

@@ -2317,6 +2317,9 @@ int close_ctree(struct btrfs_root *root)
 			printk(KERN_ERR "btrfs: commit super ret %d\n", ret);
 			printk(KERN_ERR "btrfs: commit super ret %d\n", ret);
 	}
 	}
 
 
+	fs_info->closing = 2;
+	smp_mb();
+
 	if (fs_info->delalloc_bytes) {
 	if (fs_info->delalloc_bytes) {
 		printk(KERN_INFO "btrfs: at unmount delalloc count %llu\n",
 		printk(KERN_INFO "btrfs: at unmount delalloc count %llu\n",
 		       (unsigned long long)fs_info->delalloc_bytes);
 		       (unsigned long long)fs_info->delalloc_bytes);

+ 3 - 1
fs/btrfs/extent-tree.c

@@ -288,8 +288,10 @@ again:
 
 
 	while (1) {
 	while (1) {
 		smp_mb();
 		smp_mb();
-		if (block_group->fs_info->closing)
+		if (block_group->fs_info->closing > 1) {
+			last = (u64)-1;
 			break;
 			break;
+		}
 
 
 		leaf = path->nodes[0];
 		leaf = path->nodes[0];
 		slot = path->slots[0];
 		slot = path->slots[0];