diff options
Diffstat (limited to 'fs/btrfs/scrub.c')
| -rw-r--r-- | fs/btrfs/scrub.c | 22 | 
1 files changed, 11 insertions, 11 deletions
diff --git a/fs/btrfs/scrub.c b/fs/btrfs/scrub.c index 33f2793bdee0..f2f0be7864b8 100644 --- a/fs/btrfs/scrub.c +++ b/fs/btrfs/scrub.c @@ -3770,16 +3770,6 @@ 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) @@ -3788,6 +3778,9 @@ 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; @@ -3932,9 +3925,16 @@ int btrfs_scrub_dev(struct btrfs_fs_info *fs_info, u64 devid, u64 start,  	mutex_lock(&fs_info->scrub_lock);  	dev->scrub_ctx = NULL; -	scrub_workers_put(fs_info); +	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; +	}  	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;  | 
