diff mbox series

[v3,1/3] zonefs: introduce helper for zone management

Message ID 20200910075957.7307-2-johannes.thumshirn@wdc.com (mailing list archive)
State New, archived
Headers show
Series zonefs: introduce -o explicit-open mount option | expand

Commit Message

Johannes Thumshirn Sept. 10, 2020, 7:59 a.m. UTC
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>

---
Changes to v2:
- add missing '\n'

Changes to v1:
- centralize failure logging
---
 fs/zonefs/super.c | 29 ++++++++++++++++++++++-------
 1 file changed, 22 insertions(+), 7 deletions(-)

Comments

Damien Le Moal Sept. 10, 2020, 8:21 a.m. UTC | #1
On 2020/09/10 17:00, Johannes Thumshirn wrote:
> 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>
> 
> ---
> Changes to v2:
> - add missing '\n'
> 
> Changes to v1:
> - centralize failure logging
> ---
>  fs/zonefs/super.c | 29 ++++++++++++++++++++++-------
>  1 file changed, 22 insertions(+), 7 deletions(-)
> 
> diff --git a/fs/zonefs/super.c b/fs/zonefs/super.c
> index 8ec7c8f109d7..6e13a5127b01 100644
> --- a/fs/zonefs/super.c
> +++ b/fs/zonefs/super.c
> @@ -24,6 +24,26 @@
>  
>  #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);
> 

Looks good.

Reviewed-by: Damien Le Moal <damien.lemoal@wdc.com>
diff mbox series

Patch

diff --git a/fs/zonefs/super.c b/fs/zonefs/super.c
index 8ec7c8f109d7..6e13a5127b01 100644
--- a/fs/zonefs/super.c
+++ b/fs/zonefs/super.c
@@ -24,6 +24,26 @@ 
 
 #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);