Return an error if an unknown zoned model is reported for a device or
if parsing of the device zoned model fails. Also add comments to
briefly explain the zone models and what to do in the absence of a
kernel reported zoned model for a device.

Signed-off-by: Damien Le Moal <damien.lem...@wdc.com>
---
 include/f2fs_fs.h   |  2 +-
 lib/libf2fs.c       |  8 ++++++--
 lib/libf2fs_zoned.c | 38 ++++++++++++++++++++++++++------------
 3 files changed, 33 insertions(+), 15 deletions(-)

diff --git a/include/f2fs_fs.h b/include/f2fs_fs.h
index e073723..97ad774 100644
--- a/include/f2fs_fs.h
+++ b/include/f2fs_fs.h
@@ -1257,7 +1257,7 @@ blk_zone_cond_str(struct blk_zone *blkz)
 
 #endif
 
-extern void f2fs_get_zoned_model(int);
+extern int f2fs_get_zoned_model(int);
 extern int f2fs_get_zone_blocks(int);
 extern int f2fs_check_zones(int);
 extern int f2fs_reset_zones(int);
diff --git a/lib/libf2fs.c b/lib/libf2fs.c
index 60b84e0..5ca1bb0 100644
--- a/lib/libf2fs.c
+++ b/lib/libf2fs.c
@@ -925,8 +925,12 @@ int get_device_info(int i)
        }
 
 #if !defined(WITH_ANDROID) && defined(__linux__)
-       if (S_ISBLK(stat_buf->st_mode))
-               f2fs_get_zoned_model(i);
+       if (S_ISBLK(stat_buf->st_mode)) {
+               if (f2fs_get_zoned_model(i) < 0) {
+                       free(stat_buf);
+                       return -1;
+                }
+       }
 
        if (dev->zoned_model != F2FS_ZONED_NONE) {
                if (dev->zoned_model == F2FS_ZONED_HM)
diff --git a/lib/libf2fs_zoned.c b/lib/libf2fs_zoned.c
index 6e32f32..e396a95 100644
--- a/lib/libf2fs_zoned.c
+++ b/lib/libf2fs_zoned.c
@@ -24,7 +24,7 @@
 
 #ifdef HAVE_LINUX_BLKZONED_H
 
-void f2fs_get_zoned_model(int i)
+int f2fs_get_zoned_model(int i)
 {
        struct device_info *dev = c.devices + i;
        char str[128];
@@ -36,27 +36,41 @@ void f2fs_get_zoned_model(int i)
                 "/sys/block/%s/queue/zoned",
                 basename(dev->path));
        file = fopen(str, "r");
-       if (!file)
-               goto not_zoned;
+       if (!file) {
+               /*
+                * The kernel does not support zoned block devices, but we have
+                * a block device file. This means that the device is not zoned
+                * or is zoned but can be randomly written (i.e. host-aware
+                * zoned model). Treat the device as a regular block device.
+                */
+               dev->zoned_model = F2FS_ZONED_NONE;
+               return 0;
+       }
 
        memset(str, 0, sizeof(str));
        res = fscanf(file, "%s", str);
        fclose(file);
 
-       if (res != 1)
-               goto not_zoned;
+       if (res != 1) {
+               MSG(0, "\tError: Failed to parse the device zoned model\n");
+               return -1;
+       }
 
-       if (strcmp(str, "host-aware") == 0) {
+       if (strcmp(str, "none") == 0) {
+               /* Regular block device */
+               dev->zoned_model = F2FS_ZONED_NONE;
+       } else if (strcmp(str, "host-aware") == 0) {
+               /* Host-aware zoned block device: can be randomly written */
                dev->zoned_model = F2FS_ZONED_HA;
-               return;
-       }
-       if (strcmp(str, "host-managed") == 0) {
+       } else if (strcmp(str, "host-managed") == 0) {
+               /* Host-managed zoned block device: sequential writes needed */
                dev->zoned_model = F2FS_ZONED_HM;
-               return;
+       } else {
+               MSG(0, "\tError: Unsupported device zoned model\n");
+               return -1;
        }
 
-not_zoned:
-       dev->zoned_model = F2FS_ZONED_NONE;
+       return 0;
 }
 
 int f2fs_get_zone_blocks(int i)
-- 
2.20.1



_______________________________________________
Linux-f2fs-devel mailing list
Linux-f2fs-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel

Reply via email to