mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-01-19 11:43:40 +00:00
zonefs fixes for 6.1-rc6
- Fix the IO error recovery path for failures happening in the last zone of device, and that zone is a "runt" zone (smaller than the other zone). The current code was failing to properly obtain a zone report in that case. - Remove the unused to_attr() function as it is unused, causing compilation warnings with clang. -----BEGIN PGP SIGNATURE----- iHUEABYKAB0WIQSRPv8tYSvhwAzJdzjdoc3SxdoYdgUCY3gofwAKCRDdoc3SxdoY dpUlAQDa1mHGQzT0Lrg7y+4HILKsX1dmzJ6wIWTKaFg1f68GNgD/cjZB/jp3UKEi nmXAv/dGVx6ZBtIEybLDb522i1xccAg= =gAqT -----END PGP SIGNATURE----- Merge tag 'zonefs-6.1-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/dlemoal/zonefs Pull zonefs fixes from Damien Le Moal: - Fix the IO error recovery path for failures happening in the last zone of device, and that zone is a "runt" zone (smaller than the other zone). The current code was failing to properly obtain a zone report in that case. - Remove the unused to_attr() function as it is unused, causing compilation warnings with clang. * tag 'zonefs-6.1-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/dlemoal/zonefs: zonefs: Remove to_attr() helper function zonefs: fix zone report size in __zonefs_io_error()
This commit is contained in:
commit
bf5003a0dc
@ -478,14 +478,22 @@ static void __zonefs_io_error(struct inode *inode, bool write)
|
||||
struct super_block *sb = inode->i_sb;
|
||||
struct zonefs_sb_info *sbi = ZONEFS_SB(sb);
|
||||
unsigned int noio_flag;
|
||||
unsigned int nr_zones =
|
||||
zi->i_zone_size >> (sbi->s_zone_sectors_shift + SECTOR_SHIFT);
|
||||
unsigned int nr_zones = 1;
|
||||
struct zonefs_ioerr_data err = {
|
||||
.inode = inode,
|
||||
.write = write,
|
||||
};
|
||||
int ret;
|
||||
|
||||
/*
|
||||
* The only files that have more than one zone are conventional zone
|
||||
* files with aggregated conventional zones, for which the inode zone
|
||||
* size is always larger than the device zone size.
|
||||
*/
|
||||
if (zi->i_zone_size > bdev_zone_sectors(sb->s_bdev))
|
||||
nr_zones = zi->i_zone_size >>
|
||||
(sbi->s_zone_sectors_shift + SECTOR_SHIFT);
|
||||
|
||||
/*
|
||||
* Memory allocations in blkdev_report_zones() can trigger a memory
|
||||
* reclaim which may in turn cause a recursion into zonefs as well as
|
||||
@ -1407,6 +1415,14 @@ static int zonefs_init_file_inode(struct inode *inode, struct blk_zone *zone,
|
||||
zi->i_ztype = type;
|
||||
zi->i_zsector = zone->start;
|
||||
zi->i_zone_size = zone->len << SECTOR_SHIFT;
|
||||
if (zi->i_zone_size > bdev_zone_sectors(sb->s_bdev) << SECTOR_SHIFT &&
|
||||
!(sbi->s_features & ZONEFS_F_AGGRCNV)) {
|
||||
zonefs_err(sb,
|
||||
"zone size %llu doesn't match device's zone sectors %llu\n",
|
||||
zi->i_zone_size,
|
||||
bdev_zone_sectors(sb->s_bdev) << SECTOR_SHIFT);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
zi->i_max_size = min_t(loff_t, MAX_LFS_FILESIZE,
|
||||
zone->capacity << SECTOR_SHIFT);
|
||||
@ -1456,11 +1472,11 @@ static struct dentry *zonefs_create_inode(struct dentry *parent,
|
||||
struct inode *dir = d_inode(parent);
|
||||
struct dentry *dentry;
|
||||
struct inode *inode;
|
||||
int ret;
|
||||
int ret = -ENOMEM;
|
||||
|
||||
dentry = d_alloc_name(parent, name);
|
||||
if (!dentry)
|
||||
return NULL;
|
||||
return ERR_PTR(ret);
|
||||
|
||||
inode = new_inode(parent->d_sb);
|
||||
if (!inode)
|
||||
@ -1485,7 +1501,7 @@ static struct dentry *zonefs_create_inode(struct dentry *parent,
|
||||
dput:
|
||||
dput(dentry);
|
||||
|
||||
return NULL;
|
||||
return ERR_PTR(ret);
|
||||
}
|
||||
|
||||
struct zonefs_zone_data {
|
||||
@ -1505,7 +1521,7 @@ static int zonefs_create_zgroup(struct zonefs_zone_data *zd,
|
||||
struct blk_zone *zone, *next, *end;
|
||||
const char *zgroup_name;
|
||||
char *file_name;
|
||||
struct dentry *dir;
|
||||
struct dentry *dir, *dent;
|
||||
unsigned int n = 0;
|
||||
int ret;
|
||||
|
||||
@ -1523,8 +1539,8 @@ static int zonefs_create_zgroup(struct zonefs_zone_data *zd,
|
||||
zgroup_name = "seq";
|
||||
|
||||
dir = zonefs_create_inode(sb->s_root, zgroup_name, NULL, type);
|
||||
if (!dir) {
|
||||
ret = -ENOMEM;
|
||||
if (IS_ERR(dir)) {
|
||||
ret = PTR_ERR(dir);
|
||||
goto free;
|
||||
}
|
||||
|
||||
@ -1570,8 +1586,9 @@ static int zonefs_create_zgroup(struct zonefs_zone_data *zd,
|
||||
* Use the file number within its group as file name.
|
||||
*/
|
||||
snprintf(file_name, ZONEFS_NAME_MAX - 1, "%u", n);
|
||||
if (!zonefs_create_inode(dir, file_name, zone, type)) {
|
||||
ret = -ENOMEM;
|
||||
dent = zonefs_create_inode(dir, file_name, zone, type);
|
||||
if (IS_ERR(dent)) {
|
||||
ret = PTR_ERR(dent);
|
||||
goto free;
|
||||
}
|
||||
|
||||
|
@ -15,11 +15,6 @@ struct zonefs_sysfs_attr {
|
||||
ssize_t (*show)(struct zonefs_sb_info *sbi, char *buf);
|
||||
};
|
||||
|
||||
static inline struct zonefs_sysfs_attr *to_attr(struct attribute *attr)
|
||||
{
|
||||
return container_of(attr, struct zonefs_sysfs_attr, attr);
|
||||
}
|
||||
|
||||
#define ZONEFS_SYSFS_ATTR_RO(name) \
|
||||
static struct zonefs_sysfs_attr zonefs_sysfs_attr_##name = __ATTR_RO(name)
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user