diff options
| author | 2014-11-19 21:32:12 +1100 | |
|---|---|---|
| committer | 2014-11-19 21:32:12 +1100 | |
| commit | b10778a00d40b3d9fdaaf5891e802794781ff71c (patch) | |
| tree | 6ba4cbac86eecedc3f30650e7f764ecf00c83898 /fs/btrfs/scrub.c | |
| parent | integrity: do zero padding of the key id (diff) | |
| parent | Linux 3.17 (diff) | |
| download | wireguard-linux-b10778a00d40b3d9fdaaf5891e802794781ff71c.tar.xz wireguard-linux-b10778a00d40b3d9fdaaf5891e802794781ff71c.zip  | |
Merge commit 'v3.17' into next
Diffstat (limited to 'fs/btrfs/scrub.c')
| -rw-r--r-- | fs/btrfs/scrub.c | 25 | 
1 files changed, 19 insertions, 6 deletions
diff --git a/fs/btrfs/scrub.c b/fs/btrfs/scrub.c index b6d198f5181e..f4a41f37be22 100644 --- a/fs/btrfs/scrub.c +++ b/fs/btrfs/scrub.c @@ -428,8 +428,8 @@ struct scrub_ctx *scrub_setup_ctx(struct btrfs_device *dev, int is_dev_replace)  		sbio->index = i;  		sbio->sctx = sctx;  		sbio->page_count = 0; -		btrfs_init_work(&sbio->work, scrub_bio_end_io_worker, -				NULL, NULL); +		btrfs_init_work(&sbio->work, btrfs_scrub_helper, +				scrub_bio_end_io_worker, NULL, NULL);  		if (i != SCRUB_BIOS_PER_SCTX - 1)  			sctx->bios[i]->next_free = i + 1; @@ -999,8 +999,8 @@ nodatasum_case:  		fixup_nodatasum->root = fs_info->extent_root;  		fixup_nodatasum->mirror_num = failed_mirror_index + 1;  		scrub_pending_trans_workers_inc(sctx); -		btrfs_init_work(&fixup_nodatasum->work, scrub_fixup_nodatasum, -				NULL, NULL); +		btrfs_init_work(&fixup_nodatasum->work, btrfs_scrub_helper, +				scrub_fixup_nodatasum, NULL, NULL);  		btrfs_queue_work(fs_info->scrub_workers,  				 &fixup_nodatasum->work);  		goto out; @@ -1616,7 +1616,8 @@ static void scrub_wr_bio_end_io(struct bio *bio, int err)  	sbio->err = err;  	sbio->bio = bio; -	btrfs_init_work(&sbio->work, scrub_wr_bio_end_io_worker, NULL, NULL); +	btrfs_init_work(&sbio->work, btrfs_scrubwrc_helper, +			 scrub_wr_bio_end_io_worker, NULL, NULL);  	btrfs_queue_work(fs_info->scrub_wr_completion_workers, &sbio->work);  } @@ -2904,6 +2905,7 @@ int btrfs_scrub_dev(struct btrfs_fs_info *fs_info, u64 devid, u64 start,  	struct scrub_ctx *sctx;  	int ret;  	struct btrfs_device *dev; +	struct rcu_string *name;  	if (btrfs_fs_closing(fs_info))  		return -EINVAL; @@ -2965,6 +2967,16 @@ int btrfs_scrub_dev(struct btrfs_fs_info *fs_info, u64 devid, u64 start,  		return -ENODEV;  	} +	if (!is_dev_replace && !readonly && !dev->writeable) { +		mutex_unlock(&fs_info->fs_devices->device_list_mutex); +		rcu_read_lock(); +		name = rcu_dereference(dev->name); +		btrfs_err(fs_info, "scrub: device %s is not writable", +			  name->str); +		rcu_read_unlock(); +		return -EROFS; +	} +  	mutex_lock(&fs_info->scrub_lock);  	if (!dev->in_fs_metadata || dev->is_tgtdev_for_dev_replace) {  		mutex_unlock(&fs_info->scrub_lock); @@ -3203,7 +3215,8 @@ static int copy_nocow_pages(struct scrub_ctx *sctx, u64 logical, u64 len,  	nocow_ctx->len = len;  	nocow_ctx->mirror_num = mirror_num;  	nocow_ctx->physical_for_dev_replace = physical_for_dev_replace; -	btrfs_init_work(&nocow_ctx->work, copy_nocow_pages_worker, NULL, NULL); +	btrfs_init_work(&nocow_ctx->work, btrfs_scrubnc_helper, +			copy_nocow_pages_worker, NULL, NULL);  	INIT_LIST_HEAD(&nocow_ctx->inodes);  	btrfs_queue_work(fs_info->scrub_nocow_workers,  			 &nocow_ctx->work);  | 
