zonefs: introduce helper for zone management
authorJohannes Thumshirn <johannes.thumshirn@wdc.com>
Fri, 11 Sep 2020 08:56:48 +0000 (17:56 +0900)
committerDamien Le Moal <damien.lemoal@wdc.com>
Tue, 15 Sep 2020 09:32:40 +0000 (18:32 +0900)
Introduce a helper function for sending zone management commands to the
block device.

As zone management commands can change a zone write pointer position
reflected in the size of the zone file, this function expects the truncate
mutex to be held.

Signed-off-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
Reviewed-by: Damien Le Moal <damien.lemoal@wdc.com>
Signed-off-by: Damien Le Moal <damien.lemoal@wdc.com>
fs/zonefs/super.c

index 8ec7c8f..6e13a51 100644 (file)
 
 #include "zonefs.h"
 
+static inline int zonefs_zone_mgmt(struct inode *inode,
+                                  enum req_opf op)
+{
+       struct zonefs_inode_info *zi = ZONEFS_I(inode);
+       int ret;
+
+       lockdep_assert_held(&zi->i_truncate_mutex);
+
+       ret = blkdev_zone_mgmt(inode->i_sb->s_bdev, op, zi->i_zsector,
+                              zi->i_zone_size >> SECTOR_SHIFT, GFP_NOFS);
+       if (ret) {
+               zonefs_err(inode->i_sb,
+                          "Zone management operation %s at %llu failed %d\n",
+                          blk_op_str(op), zi->i_zsector, ret);
+               return ret;
+       }
+
+       return 0;
+}
+
 static int zonefs_iomap_begin(struct inode *inode, loff_t offset, loff_t length,
                              unsigned int flags, struct iomap *iomap,
                              struct iomap *srcmap)
@@ -397,14 +417,9 @@ static int zonefs_file_truncate(struct inode *inode, loff_t isize)
        if (isize == old_isize)
                goto unlock;
 
-       ret = blkdev_zone_mgmt(inode->i_sb->s_bdev, op, zi->i_zsector,
-                              zi->i_zone_size >> SECTOR_SHIFT, GFP_NOFS);
-       if (ret) {
-               zonefs_err(inode->i_sb,
-                          "Zone management operation at %llu failed %d",
-                          zi->i_zsector, ret);
+       ret = zonefs_zone_mgmt(inode, op);
+       if (ret)
                goto unlock;
-       }
 
        zonefs_update_stats(inode, isize);
        truncate_setsize(inode, isize);