mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-01-06 05:06:29 +00:00
zonefs fixes for 5.18-rc5
Two fixes for rc5: * Fix inode initialization to make sure that the inode flags are all cleared. * Use zone reset operation instead of close to make sure that the zone of an empty sequential file in never in an active state after closing the file. -----BEGIN PGP SIGNATURE----- iHUEABYKAB0WIQSRPv8tYSvhwAzJdzjdoc3SxdoYdgUCYmjSewAKCRDdoc3SxdoY dqd+APkBb/phIqK21E1x1KIXe51WTeL4mhkc0dwkQ6vRGcZOfAEA6cW++S7X1Sqo JqORCus5FZEfs59NhI6TBD6BtsIZ9wc= =hCgn -----END PGP SIGNATURE----- Merge tag 'zonefs-5.18-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/dlemoal/zonefs Pull zonefs fixes from Damien Le Moal: "Two fixes for rc5: - Fix inode initialization to make sure that the inode flags are all cleared. - Use zone reset operation instead of close to make sure that the zone of an empty sequential file in never in an active state after closing the file" * tag 'zonefs-5.18-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/dlemoal/zonefs: zonefs: Fix management of open zones zonefs: Clear inode information flags on inode creation
This commit is contained in:
commit
211ed5480a
@ -35,6 +35,17 @@ static inline int zonefs_zone_mgmt(struct inode *inode,
|
||||
|
||||
lockdep_assert_held(&zi->i_truncate_mutex);
|
||||
|
||||
/*
|
||||
* With ZNS drives, closing an explicitly open zone that has not been
|
||||
* written will change the zone state to "closed", that is, the zone
|
||||
* will remain active. Since this can then cause failure of explicit
|
||||
* open operation on other zones if the drive active zone resources
|
||||
* are exceeded, make sure that the zone does not remain active by
|
||||
* resetting it.
|
||||
*/
|
||||
if (op == REQ_OP_ZONE_CLOSE && !zi->i_wpoffset)
|
||||
op = REQ_OP_ZONE_RESET;
|
||||
|
||||
trace_zonefs_zone_mgmt(inode, op);
|
||||
ret = blkdev_zone_mgmt(inode->i_sb->s_bdev, op, zi->i_zsector,
|
||||
zi->i_zone_size >> SECTOR_SHIFT, GFP_NOFS);
|
||||
@ -1142,6 +1153,7 @@ static struct inode *zonefs_alloc_inode(struct super_block *sb)
|
||||
inode_init_once(&zi->i_vnode);
|
||||
mutex_init(&zi->i_truncate_mutex);
|
||||
zi->i_wr_refcnt = 0;
|
||||
zi->i_flags = 0;
|
||||
|
||||
return &zi->i_vnode;
|
||||
}
|
||||
@ -1293,12 +1305,13 @@ static void zonefs_init_dir_inode(struct inode *parent, struct inode *inode,
|
||||
inc_nlink(parent);
|
||||
}
|
||||
|
||||
static void zonefs_init_file_inode(struct inode *inode, struct blk_zone *zone,
|
||||
enum zonefs_ztype type)
|
||||
static int zonefs_init_file_inode(struct inode *inode, struct blk_zone *zone,
|
||||
enum zonefs_ztype type)
|
||||
{
|
||||
struct super_block *sb = inode->i_sb;
|
||||
struct zonefs_sb_info *sbi = ZONEFS_SB(sb);
|
||||
struct zonefs_inode_info *zi = ZONEFS_I(inode);
|
||||
int ret = 0;
|
||||
|
||||
inode->i_ino = zone->start >> sbi->s_zone_sectors_shift;
|
||||
inode->i_mode = S_IFREG | sbi->s_perm;
|
||||
@ -1323,6 +1336,22 @@ static void zonefs_init_file_inode(struct inode *inode, struct blk_zone *zone,
|
||||
sb->s_maxbytes = max(zi->i_max_size, sb->s_maxbytes);
|
||||
sbi->s_blocks += zi->i_max_size >> sb->s_blocksize_bits;
|
||||
sbi->s_used_blocks += zi->i_wpoffset >> sb->s_blocksize_bits;
|
||||
|
||||
/*
|
||||
* For sequential zones, make sure that any open zone is closed first
|
||||
* to ensure that the initial number of open zones is 0, in sync with
|
||||
* the open zone accounting done when the mount option
|
||||
* ZONEFS_MNTOPT_EXPLICIT_OPEN is used.
|
||||
*/
|
||||
if (type == ZONEFS_ZTYPE_SEQ &&
|
||||
(zone->cond == BLK_ZONE_COND_IMP_OPEN ||
|
||||
zone->cond == BLK_ZONE_COND_EXP_OPEN)) {
|
||||
mutex_lock(&zi->i_truncate_mutex);
|
||||
ret = zonefs_zone_mgmt(inode, REQ_OP_ZONE_CLOSE);
|
||||
mutex_unlock(&zi->i_truncate_mutex);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static struct dentry *zonefs_create_inode(struct dentry *parent,
|
||||
@ -1332,6 +1361,7 @@ static struct dentry *zonefs_create_inode(struct dentry *parent,
|
||||
struct inode *dir = d_inode(parent);
|
||||
struct dentry *dentry;
|
||||
struct inode *inode;
|
||||
int ret;
|
||||
|
||||
dentry = d_alloc_name(parent, name);
|
||||
if (!dentry)
|
||||
@ -1342,10 +1372,16 @@ static struct dentry *zonefs_create_inode(struct dentry *parent,
|
||||
goto dput;
|
||||
|
||||
inode->i_ctime = inode->i_mtime = inode->i_atime = dir->i_ctime;
|
||||
if (zone)
|
||||
zonefs_init_file_inode(inode, zone, type);
|
||||
else
|
||||
if (zone) {
|
||||
ret = zonefs_init_file_inode(inode, zone, type);
|
||||
if (ret) {
|
||||
iput(inode);
|
||||
goto dput;
|
||||
}
|
||||
} else {
|
||||
zonefs_init_dir_inode(dir, inode, type);
|
||||
}
|
||||
|
||||
d_add(dentry, inode);
|
||||
dir->i_size++;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user