Revision 616163313237 () - Diff

Link to this snippet: https://friendpaste.com/2LY9eLAR9q0RoOtRK7VYmX
Embed:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c
index b077544b5232..e742965e4bc3 100644
--- a/fs/btrfs/ioctl.c
+++ b/fs/btrfs/ioctl.c
@@ -777,16 +777,21 @@ static int create_snapshot(struct btrfs_root *root, struct inode *dir,
goto free_pending;
}
+ /*
+ * Flush dealloc writes before incrementing root->will_be_snapshotted to
+ * avoid as many nocow writes as possible to fallback to COW mode (which
+ * could run into ENOSPC).
+ */
+ ret = btrfs_start_delalloc_inodes(root);
+ if (ret)
+ goto dec_and_free;
+
atomic_inc(&root->will_be_snapshotted);
smp_mb__after_atomic();
/* wait for no snapshot writes */
wait_event(root->subv_writers->wait,
percpu_counter_sum(&root->subv_writers->counter) == 0);
- ret = btrfs_start_delalloc_inodes(root);
- if (ret)
- goto dec_and_free;
-
btrfs_wait_ordered_extents(root, U64_MAX, 0, (u64)-1);
btrfs_init_block_rsv(&pending_snapshot->block_rsv,