diff options
author | Anand Jain <anand.jain@oracle.com> | 2018-11-11 09:22:20 -0500 |
---|---|---|
committer | David Sterba <dsterba@suse.com> | 2018-12-17 08:51:35 -0500 |
commit | b47dda2ef6d793b67fd5979032dcd106e3f0a5c9 (patch) | |
tree | 47982c73533db45975fedbee41d9b72a3a4879e2 /fs/btrfs/dev-replace.c | |
parent | d189dd70e2556181732598956d808ea53cc8774e (diff) |
btrfs: dev-replace: set result code of cancel by status of scrub
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>
Diffstat (limited to 'fs/btrfs/dev-replace.c')
-rw-r--r-- | fs/btrfs/dev-replace.c | 21 |
1 files changed, 14 insertions, 7 deletions
diff --git a/fs/btrfs/dev-replace.c b/fs/btrfs/dev-replace.c index 08092d329f66..c0878ff8185a 100644 --- a/fs/btrfs/dev-replace.c +++ b/fs/btrfs/dev-replace.c | |||
@@ -805,16 +805,23 @@ int btrfs_dev_replace_cancel(struct btrfs_fs_info *fs_info) | |||
805 | btrfs_dev_replace_write_unlock(dev_replace); | 805 | btrfs_dev_replace_write_unlock(dev_replace); |
806 | break; | 806 | break; |
807 | case BTRFS_IOCTL_DEV_REPLACE_STATE_STARTED: | 807 | case BTRFS_IOCTL_DEV_REPLACE_STATE_STARTED: |
808 | result = BTRFS_IOCTL_DEV_REPLACE_RESULT_NO_ERROR; | ||
809 | tgt_device = dev_replace->tgtdev; | 808 | tgt_device = dev_replace->tgtdev; |
810 | src_device = dev_replace->srcdev; | 809 | src_device = dev_replace->srcdev; |
811 | btrfs_dev_replace_write_unlock(dev_replace); | 810 | btrfs_dev_replace_write_unlock(dev_replace); |
812 | btrfs_scrub_cancel(fs_info); | 811 | ret = btrfs_scrub_cancel(fs_info); |
813 | /* btrfs_dev_replace_finishing() will handle the cleanup part */ | 812 | if (ret < 0) { |
814 | btrfs_info_in_rcu(fs_info, | 813 | result = BTRFS_IOCTL_DEV_REPLACE_RESULT_NOT_STARTED; |
815 | "dev_replace from %s (devid %llu) to %s canceled", | 814 | } else { |
816 | btrfs_dev_name(src_device), src_device->devid, | 815 | result = BTRFS_IOCTL_DEV_REPLACE_RESULT_NO_ERROR; |
817 | btrfs_dev_name(tgt_device)); | 816 | /* |
817 | * btrfs_dev_replace_finishing() will handle the | ||
818 | * cleanup part | ||
819 | */ | ||
820 | btrfs_info_in_rcu(fs_info, | ||
821 | "dev_replace from %s (devid %llu) to %s canceled", | ||
822 | btrfs_dev_name(src_device), src_device->devid, | ||
823 | btrfs_dev_name(tgt_device)); | ||
824 | } | ||
818 | break; | 825 | break; |
819 | case BTRFS_IOCTL_DEV_REPLACE_STATE_SUSPENDED: | 826 | case BTRFS_IOCTL_DEV_REPLACE_STATE_SUSPENDED: |
820 | /* | 827 | /* |