zonefs: introduce helper for zone management

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>
This commit is contained in:
Johannes Thumshirn 2020-09-11 17:56:48 +09:00 committed by Damien Le Moal
parent d012a7190f
commit 5498d5f932
1 changed files with 22 additions and 7 deletions

View File

@ -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);