btrfs-progs: zoned: introduce zoned support for device replace

This patch checks if the target file system is flagged as ZONED. If it is,
the device to be added is flagged PREP_DEVICE_ZONED.  Also add checks to
prevent mixing non-zoned devices and zoned devices.

Signed-off-by: Naohiro Aota <naohiro.aota@wdc.com>
Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
Naohiro Aota 2021-04-26 15:27:42 +09:00 committed by David Sterba
parent b8b9da2eab
commit 494c2ea467

View File

@ -122,12 +122,14 @@ static const char *const cmd_replace_start_usage[] = {
static int cmd_replace_start(const struct cmd_struct *cmd,
int argc, char **argv)
{
struct btrfs_ioctl_feature_flags feature_flags;
struct btrfs_ioctl_dev_replace_args start_args = {0};
struct btrfs_ioctl_dev_replace_args status_args = {0};
int ret;
int i;
int fdmnt = -1;
int fddstdev = -1;
int zoned;
char *path;
char *srcdev;
char *dstdev = NULL;
@ -182,6 +184,14 @@ static int cmd_replace_start(const struct cmd_struct *cmd,
if (fdmnt < 0)
goto leave_with_error;
ret = ioctl(fdmnt, BTRFS_IOC_GET_FEATURES, &feature_flags);
if (ret) {
error("zoned: ioctl(GET_FEATURES) on '%s' returns error: %m",
path);
goto leave_with_error;
}
zoned = (feature_flags.incompat_flags & BTRFS_FEATURE_INCOMPAT_ZONED);
/* check for possible errors before backgrounding */
status_args.cmd = BTRFS_IOCTL_DEV_REPLACE_CMD_STATUS;
status_args.result = BTRFS_IOCTL_DEV_REPLACE_RESULT_NO_RESULT;
@ -286,7 +296,8 @@ static int cmd_replace_start(const struct cmd_struct *cmd,
strncpy((char *)start_args.start.tgtdev_name, dstdev,
BTRFS_DEVICE_PATH_NAME_MAX);
ret = btrfs_prepare_device(fddstdev, dstdev, &dstdev_block_count, 0,
PREP_DEVICE_ZERO_END | PREP_DEVICE_VERBOSE);
PREP_DEVICE_ZERO_END | PREP_DEVICE_VERBOSE |
(zoned ? PREP_DEVICE_ZONED : 0));
if (ret)
goto leave_with_error;