zbd: Support finishing zones on Android
[fio.git] / oslib / linux-blkzoned.c
index c3130d0e2a1b2d9d98a1914e80cb591969364e4b..722e09925b3d22e6b6ec654ea6104c8143c9b9bd 100644 (file)
@@ -22,6 +22,9 @@
 #include "zbd_types.h"
 
 #include <linux/blkzoned.h>
+#ifndef BLKFINISHZONE
+#define BLKFINISHZONE _IOW(0x12, 136, struct blk_zone_range)
+#endif
 
 /*
  * If the uapi headers installed on the system lacks zone capacity support,
@@ -312,7 +315,6 @@ int blkzoned_reset_wp(struct thread_data *td, struct fio_file *f,
 int blkzoned_finish_zone(struct thread_data *td, struct fio_file *f,
                         uint64_t offset, uint64_t length)
 {
-#ifdef BLKFINISHZONE
        struct blk_zone_range zr = {
                .sector         = offset >> 9,
                .nr_sectors     = length >> 9,
@@ -327,21 +329,19 @@ int blkzoned_finish_zone(struct thread_data *td, struct fio_file *f,
                        return -errno;
        }
 
-       if (ioctl(fd, BLKFINISHZONE, &zr) < 0)
+       if (ioctl(fd, BLKFINISHZONE, &zr) < 0) {
                ret = -errno;
+               /*
+                * Kernel versions older than 5.5 do not support BLKFINISHZONE
+                * and return the ENOTTY error code. These old kernels only
+                * support block devices that close zones automatically.
+                */
+               if (ret == ENOTTY)
+                       ret = 0;
+       }
 
        if (f->fd < 0)
                close(fd);
 
        return ret;
-#else
-       /*
-        * Kernel versions older than 5.5 does not support BLKFINISHZONE. These
-        * old kernels assumed zones are closed automatically at max_open_zones
-        * limit. Also they did not support max_active_zones limit. Then there
-        * was no need to finish zones to avoid errors caused by max_open_zones
-        * or max_active_zones. For those old versions, just do nothing.
-        */
-       return 0;
-#endif
 }