Skip to content

Commit b525545

Browse files
asjkdave
authored andcommitted
btrfs: refactor btrfs_dev_replace_start for reuse
A refactor patch, and avoids user input verification in the btrfs_dev_replace_start(), and so this function can be reused. Signed-off-by: Anand Jain <[email protected]> Signed-off-by: David Sterba <[email protected]>
1 parent fc23c24 commit b525545

File tree

3 files changed

+41
-23
lines changed

3 files changed

+41
-23
lines changed

fs/btrfs/dev-replace.c

Lines changed: 37 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -302,8 +302,8 @@ void btrfs_after_dev_replace_commit(struct btrfs_fs_info *fs_info)
302302
dev_replace->cursor_left_last_write_of_item;
303303
}
304304

305-
int btrfs_dev_replace_start(struct btrfs_root *root,
306-
struct btrfs_ioctl_dev_replace_args *args)
305+
int btrfs_dev_replace_start(struct btrfs_root *root, char *tgtdev_name,
306+
u64 srcdevid, char *srcdev_name, int read_src)
307307
{
308308
struct btrfs_trans_handle *trans;
309309
struct btrfs_fs_info *fs_info = root->fs_info;
@@ -312,25 +312,16 @@ int btrfs_dev_replace_start(struct btrfs_root *root,
312312
struct btrfs_device *tgt_device = NULL;
313313
struct btrfs_device *src_device = NULL;
314314

315-
switch (args->start.cont_reading_from_srcdev_mode) {
316-
case BTRFS_IOCTL_DEV_REPLACE_CONT_READING_FROM_SRCDEV_MODE_ALWAYS:
317-
case BTRFS_IOCTL_DEV_REPLACE_CONT_READING_FROM_SRCDEV_MODE_AVOID:
318-
break;
319-
default:
320-
return -EINVAL;
321-
}
322-
323315
/* the disk copy procedure reuses the scrub code */
324316
mutex_lock(&fs_info->volume_mutex);
325-
ret = btrfs_find_device_by_devspec(root, args->start.srcdevid,
326-
args->start.srcdev_name,
327-
&src_device);
317+
ret = btrfs_find_device_by_devspec(root, srcdevid,
318+
srcdev_name, &src_device);
328319
if (ret) {
329320
mutex_unlock(&fs_info->volume_mutex);
330321
return ret;
331322
}
332323

333-
ret = btrfs_init_dev_replace_tgtdev(root, args->start.tgtdev_name,
324+
ret = btrfs_init_dev_replace_tgtdev(root, tgtdev_name,
334325
src_device, &tgt_device);
335326
mutex_unlock(&fs_info->volume_mutex);
336327
if (ret)
@@ -357,12 +348,11 @@ int btrfs_dev_replace_start(struct btrfs_root *root,
357348
break;
358349
case BTRFS_IOCTL_DEV_REPLACE_STATE_STARTED:
359350
case BTRFS_IOCTL_DEV_REPLACE_STATE_SUSPENDED:
360-
args->result = BTRFS_IOCTL_DEV_REPLACE_RESULT_ALREADY_STARTED;
351+
ret = BTRFS_IOCTL_DEV_REPLACE_RESULT_ALREADY_STARTED;
361352
goto leave;
362353
}
363354

364-
dev_replace->cont_reading_from_srcdev_mode =
365-
args->start.cont_reading_from_srcdev_mode;
355+
dev_replace->cont_reading_from_srcdev_mode = read_src;
366356
WARN_ON(!src_device);
367357
dev_replace->srcdev = src_device;
368358
WARN_ON(!tgt_device);
@@ -389,7 +379,6 @@ int btrfs_dev_replace_start(struct btrfs_root *root,
389379
dev_replace->item_needs_writeback = 1;
390380
atomic64_set(&dev_replace->num_write_errors, 0);
391381
atomic64_set(&dev_replace->num_uncorrectable_read_errors, 0);
392-
args->result = BTRFS_IOCTL_DEV_REPLACE_RESULT_NO_ERROR;
393382
btrfs_dev_replace_unlock(dev_replace, 1);
394383

395384
ret = btrfs_sysfs_add_device_link(tgt_device->fs_devices, tgt_device);
@@ -415,10 +404,8 @@ int btrfs_dev_replace_start(struct btrfs_root *root,
415404
&dev_replace->scrub_progress, 0, 1);
416405

417406
ret = btrfs_dev_replace_finishing(fs_info, ret);
418-
/* don't warn if EINPROGRESS, someone else might be running scrub */
419407
if (ret == -EINPROGRESS) {
420-
args->result = BTRFS_IOCTL_DEV_REPLACE_RESULT_SCRUB_INPROGRESS;
421-
ret = 0;
408+
ret = BTRFS_IOCTL_DEV_REPLACE_RESULT_SCRUB_INPROGRESS;
422409
} else {
423410
WARN_ON(ret);
424411
}
@@ -433,6 +420,35 @@ int btrfs_dev_replace_start(struct btrfs_root *root,
433420
return ret;
434421
}
435422

423+
int btrfs_dev_replace_by_ioctl(struct btrfs_root *root,
424+
struct btrfs_ioctl_dev_replace_args *args)
425+
{
426+
int ret;
427+
428+
switch (args->start.cont_reading_from_srcdev_mode) {
429+
case BTRFS_IOCTL_DEV_REPLACE_CONT_READING_FROM_SRCDEV_MODE_ALWAYS:
430+
case BTRFS_IOCTL_DEV_REPLACE_CONT_READING_FROM_SRCDEV_MODE_AVOID:
431+
break;
432+
default:
433+
return -EINVAL;
434+
}
435+
436+
if ((args->start.srcdevid == 0 && args->start.srcdev_name[0] == '\0') ||
437+
args->start.tgtdev_name[0] == '\0')
438+
return -EINVAL;
439+
440+
ret = btrfs_dev_replace_start(root, args->start.tgtdev_name,
441+
args->start.srcdevid,
442+
args->start.srcdev_name,
443+
args->start.cont_reading_from_srcdev_mode);
444+
args->result = ret;
445+
/* don't warn if EINPROGRESS, someone else might be running scrub */
446+
if (ret == BTRFS_IOCTL_DEV_REPLACE_RESULT_SCRUB_INPROGRESS)
447+
ret = 0;
448+
449+
return ret;
450+
}
451+
436452
/*
437453
* blocked until all flighting bios are finished.
438454
*/

fs/btrfs/dev-replace.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,10 @@ int btrfs_init_dev_replace(struct btrfs_fs_info *fs_info);
2525
int btrfs_run_dev_replace(struct btrfs_trans_handle *trans,
2626
struct btrfs_fs_info *fs_info);
2727
void btrfs_after_dev_replace_commit(struct btrfs_fs_info *fs_info);
28-
int btrfs_dev_replace_start(struct btrfs_root *root,
28+
int btrfs_dev_replace_by_ioctl(struct btrfs_root *root,
2929
struct btrfs_ioctl_dev_replace_args *args);
30+
int btrfs_dev_replace_start(struct btrfs_root *root, char *tgtdev_name,
31+
u64 srcdevid, char *srcdev_name, int read_src);
3032
void btrfs_dev_replace_status(struct btrfs_fs_info *fs_info,
3133
struct btrfs_ioctl_dev_replace_args *args);
3234
int btrfs_dev_replace_cancel(struct btrfs_fs_info *fs_info,

fs/btrfs/ioctl.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4430,7 +4430,7 @@ static long btrfs_ioctl_dev_replace(struct btrfs_root *root, void __user *arg)
44304430
1)) {
44314431
ret = BTRFS_ERROR_DEV_EXCL_RUN_IN_PROGRESS;
44324432
} else {
4433-
ret = btrfs_dev_replace_start(root, p);
4433+
ret = btrfs_dev_replace_by_ioctl(root, p);
44344434
atomic_set(
44354435
&root->fs_info->mutually_exclusive_operation_running,
44364436
0);

0 commit comments

Comments
 (0)