btrfs: dev-replace: set result code of cancel by status of scrub
[ Upstream commit b47dda2ef6d793b67fd5979032dcd106e3f0a5c9 ] The device-replace needs to check the result code of the scrub workers in btrfs_dev_replace_cancel and distinguish if successful cancel operation and when the there was no operation running. If btrfs_scrub_cancel() fails, return BTRFS_IOCTL_DEV_REPLACE_RESULT_NOT_STARTED so that user can try to cancel the replace again. Signed-off-by: Anand Jain <anand.jain@oracle.com> Reviewed-by: David Sterba <dsterba@suse.com> [ update changelog ] Signed-off-by: David Sterba <dsterba@suse.com> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
37410d6a7e
commit
d87ca19cc5
@@ -810,16 +810,23 @@ int btrfs_dev_replace_cancel(struct btrfs_fs_info *fs_info)
|
|||||||
btrfs_dev_replace_write_unlock(dev_replace);
|
btrfs_dev_replace_write_unlock(dev_replace);
|
||||||
break;
|
break;
|
||||||
case BTRFS_IOCTL_DEV_REPLACE_STATE_STARTED:
|
case BTRFS_IOCTL_DEV_REPLACE_STATE_STARTED:
|
||||||
result = BTRFS_IOCTL_DEV_REPLACE_RESULT_NO_ERROR;
|
|
||||||
tgt_device = dev_replace->tgtdev;
|
tgt_device = dev_replace->tgtdev;
|
||||||
src_device = dev_replace->srcdev;
|
src_device = dev_replace->srcdev;
|
||||||
btrfs_dev_replace_write_unlock(dev_replace);
|
btrfs_dev_replace_write_unlock(dev_replace);
|
||||||
btrfs_scrub_cancel(fs_info);
|
ret = btrfs_scrub_cancel(fs_info);
|
||||||
/* btrfs_dev_replace_finishing() will handle the cleanup part */
|
if (ret < 0) {
|
||||||
|
result = BTRFS_IOCTL_DEV_REPLACE_RESULT_NOT_STARTED;
|
||||||
|
} else {
|
||||||
|
result = BTRFS_IOCTL_DEV_REPLACE_RESULT_NO_ERROR;
|
||||||
|
/*
|
||||||
|
* btrfs_dev_replace_finishing() will handle the
|
||||||
|
* cleanup part
|
||||||
|
*/
|
||||||
btrfs_info_in_rcu(fs_info,
|
btrfs_info_in_rcu(fs_info,
|
||||||
"dev_replace from %s (devid %llu) to %s canceled",
|
"dev_replace from %s (devid %llu) to %s canceled",
|
||||||
btrfs_dev_name(src_device), src_device->devid,
|
btrfs_dev_name(src_device), src_device->devid,
|
||||||
btrfs_dev_name(tgt_device));
|
btrfs_dev_name(tgt_device));
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case BTRFS_IOCTL_DEV_REPLACE_STATE_SUSPENDED:
|
case BTRFS_IOCTL_DEV_REPLACE_STATE_SUSPENDED:
|
||||||
/*
|
/*
|
||||||
|
|||||||
Reference in New Issue
Block a user