summaryrefslogtreecommitdiffstats
path: root/fs/btrfs
diff options
context:
space:
mode:
Diffstat (limited to 'fs/btrfs')
-rw-r--r--fs/btrfs/ioctl.c21
1 files changed, 3 insertions, 18 deletions
diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c
index 1d4f8a7a128c..95bd5336e85b 100644
--- a/fs/btrfs/ioctl.c
+++ b/fs/btrfs/ioctl.c
@@ -609,23 +609,6 @@ fail_free:
609 return ret; 609 return ret;
610} 610}
611 611
612static void btrfs_wait_for_no_snapshotting_writes(struct btrfs_root *root)
613{
614 s64 writers;
615 DEFINE_WAIT(wait);
616
617 do {
618 prepare_to_wait(&root->subv_writers->wait, &wait,
619 TASK_UNINTERRUPTIBLE);
620
621 writers = percpu_counter_sum(&root->subv_writers->counter);
622 if (writers)
623 schedule();
624
625 } while (writers);
626 finish_wait(&root->subv_writers->wait, &wait);
627}
628
629static int create_snapshot(struct btrfs_root *root, struct inode *dir, 612static int create_snapshot(struct btrfs_root *root, struct inode *dir,
630 struct dentry *dentry, 613 struct dentry *dentry,
631 u64 *async_transid, bool readonly, 614 u64 *async_transid, bool readonly,
@@ -654,7 +637,9 @@ static int create_snapshot(struct btrfs_root *root, struct inode *dir,
654 637
655 atomic_inc(&root->will_be_snapshotted); 638 atomic_inc(&root->will_be_snapshotted);
656 smp_mb__after_atomic(); 639 smp_mb__after_atomic();
657 btrfs_wait_for_no_snapshotting_writes(root); 640 /* wait for no snapshot writes */
641 wait_event(root->subv_writers->wait,
642 percpu_counter_sum(&root->subv_writers->counter) == 0);
658 643
659 ret = btrfs_start_delalloc_inodes(root, 0); 644 ret = btrfs_start_delalloc_inodes(root, 0);
660 if (ret) 645 if (ret)