Btrfs: use wait_event instead of a single function
authorLiu Bo <bo.li.liu@oracle.com>
Fri, 1 Sep 2017 22:14:29 +0000 (16:14 -0600)
committerDavid Sterba <dsterba@suse.com>
Mon, 30 Oct 2017 11:27:55 +0000 (12:27 +0100)
Since TASK_UNINTERRUPTIBLE has been used here, wait_event() can do the
same job.

Signed-off-by: Liu Bo <bo.li.liu@oracle.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/ioctl.c

index 1d4f8a7a128c912c71a5e053161785e637ea9ea2..95bd5336e85ba022c81891fa4af4e816a1f8afb7 100644 (file)
@@ -609,23 +609,6 @@ fail_free:
        return ret;
 }
 
-static void btrfs_wait_for_no_snapshotting_writes(struct btrfs_root *root)
-{
-       s64 writers;
-       DEFINE_WAIT(wait);
-
-       do {
-               prepare_to_wait(&root->subv_writers->wait, &wait,
-                               TASK_UNINTERRUPTIBLE);
-
-               writers = percpu_counter_sum(&root->subv_writers->counter);
-               if (writers)
-                       schedule();
-
-       } while (writers);
-       finish_wait(&root->subv_writers->wait, &wait);
-}
-
 static int create_snapshot(struct btrfs_root *root, struct inode *dir,
                           struct dentry *dentry,
                           u64 *async_transid, bool readonly,
@@ -654,7 +637,9 @@ static int create_snapshot(struct btrfs_root *root, struct inode *dir,
 
        atomic_inc(&root->will_be_snapshotted);
        smp_mb__after_atomic();
-       btrfs_wait_for_no_snapshotting_writes(root);
+       /* 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, 0);
        if (ret)