]> git.hungrycats.org Git - linux/commitdiff
Revert "btrfs: scrub: fix circular locking dependency warning"
authorZygo Blaxell <ce3g8jdj@umail.furryterror.org>
Wed, 27 Mar 2019 01:12:20 +0000 (21:12 -0400)
committerZygo Blaxell <ce3g8jdj@umail.furryterror.org>
Wed, 27 Mar 2019 01:12:20 +0000 (21:12 -0400)
This reverts commit b0c5526d59c4ccaa2ddc06e6e74148bde936d3e3.

fs/btrfs/scrub.c

index b6bda976152592dfc9d0bb5cda93a003d3c027ac..bbd1b36f4918f46b6a2c2bf36b9110e6e9833458 100644 (file)
@@ -3776,6 +3776,16 @@ fail_scrub_workers:
        return -ENOMEM;
 }
 
+static noinline_for_stack void scrub_workers_put(struct btrfs_fs_info *fs_info)
+{
+       if (--fs_info->scrub_workers_refcnt == 0) {
+               btrfs_destroy_workqueue(fs_info->scrub_workers);
+               btrfs_destroy_workqueue(fs_info->scrub_wr_completion_workers);
+               btrfs_destroy_workqueue(fs_info->scrub_parity_workers);
+       }
+       WARN_ON(fs_info->scrub_workers_refcnt < 0);
+}
+
 int btrfs_scrub_dev(struct btrfs_fs_info *fs_info, u64 devid, u64 start,
                    u64 end, struct btrfs_scrub_progress *progress,
                    int readonly, int is_dev_replace)
@@ -3784,9 +3794,6 @@ int btrfs_scrub_dev(struct btrfs_fs_info *fs_info, u64 devid, u64 start,
        int ret;
        struct btrfs_device *dev;
        unsigned int nofs_flag;
-       struct btrfs_workqueue *scrub_workers = NULL;
-       struct btrfs_workqueue *scrub_wr_comp = NULL;
-       struct btrfs_workqueue *scrub_parity = NULL;
 
        if (btrfs_fs_closing(fs_info))
                return -EINVAL;
@@ -3925,16 +3932,9 @@ int btrfs_scrub_dev(struct btrfs_fs_info *fs_info, u64 devid, u64 start,
 
        mutex_lock(&fs_info->scrub_lock);
        dev->scrub_ctx = NULL;
-       if (--fs_info->scrub_workers_refcnt == 0) {
-               scrub_workers = fs_info->scrub_workers;
-               scrub_wr_comp = fs_info->scrub_wr_completion_workers;
-               scrub_parity = fs_info->scrub_parity_workers;
-       }
+       scrub_workers_put(fs_info);
        mutex_unlock(&fs_info->scrub_lock);
 
-       btrfs_destroy_workqueue(scrub_workers);
-       btrfs_destroy_workqueue(scrub_wr_comp);
-       btrfs_destroy_workqueue(scrub_parity);
        scrub_put_ctx(sctx);
 
        return ret;