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

Signed-off-by: Naohiro Aota <naohiro.a...@wdc.com>
---
 cmds-device.c | 29 +++++++++++++++++++++++++++--
 1 file changed, 27 insertions(+), 2 deletions(-)

diff --git a/cmds-device.c b/cmds-device.c
index e3e30b6d5ded..86ffb1a2a5c2 100644
--- a/cmds-device.c
+++ b/cmds-device.c
@@ -57,6 +57,9 @@ static int cmd_device_add(int argc, char **argv)
        int discard = 1;
        int force = 0;
        int last_dev;
+       int res;
+       int hmzoned;
+       struct btrfs_ioctl_feature_flags feature_flags;
 
        optind = 0;
        while (1) {
@@ -92,12 +95,33 @@ static int cmd_device_add(int argc, char **argv)
        if (fdmnt < 0)
                return 1;
 
+       res = ioctl(fdmnt, BTRFS_IOC_GET_FEATURES, &feature_flags);
+       if (res) {
+               error("error getting feature flags '%s': %m", mntpnt);
+               return 1;
+       }
+       hmzoned = feature_flags.incompat_flags & BTRFS_FEATURE_INCOMPAT_HMZONED;
+
        for (i = optind; i < last_dev; i++){
                struct btrfs_ioctl_vol_args ioctl_args;
-               int     devfd, res;
+               int     devfd;
                u64 dev_block_count = 0;
                char *path;
 
+               if (hmzoned && zoned_model(argv[i]) == ZONED_NONE) {
+                       error("cannot add non-zoned device to HMZONED file 
system '%s'",
+                             argv[i]);
+                       ret++;
+                       continue;
+               }
+
+               if (!hmzoned && zoned_model(argv[i]) == ZONED_HOST_MANAGED) {
+                       error("cannot add host managed zoned device to 
non-HMZONED file system '%s'",
+                             argv[i]);
+                       ret++;
+                       continue;
+               }
+
                res = test_dev_for_mkfs(argv[i], force);
                if (res) {
                        ret++;
@@ -113,7 +137,8 @@ static int cmd_device_add(int argc, char **argv)
 
                res = btrfs_prepare_device(devfd, argv[i], &dev_block_count, 0,
                                PREP_DEVICE_ZERO_END | PREP_DEVICE_VERBOSE |
-                               (discard ? PREP_DEVICE_DISCARD : 0));
+                               (discard ? PREP_DEVICE_DISCARD : 0) |
+                               (hmzoned ? PREP_DEVICE_HMZONED : 0));
                close(devfd);
                if (res) {
                        ret++;
-- 
2.21.0

Reply via email to