mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-01-23 16:53:58 -05: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
2 changed files with 27 additions and 15 deletions
|
@ -478,14 +478,22 @@ static void __zonefs_io_error(struct inode *inode, bool write)
|
||||||
struct super_block *sb = inode->i_sb;
|
struct super_block *sb = inode->i_sb;
|
||||||
struct zonefs_sb_info *sbi = ZONEFS_SB(sb);
|
struct zonefs_sb_info *sbi = ZONEFS_SB(sb);
|
||||||
unsigned int noio_flag;
|
unsigned int noio_flag;
|
||||||
unsigned int nr_zones =
|
unsigned int nr_zones = 1;
|
||||||
zi->i_zone_size >> (sbi->s_zone_sectors_shift + SECTOR_SHIFT);
|
|
||||||
struct zonefs_ioerr_data err = {
|
struct zonefs_ioerr_data err = {
|
||||||
.inode = inode,
|
.inode = inode,
|
||||||
.write = write,
|
.write = write,
|
||||||
};
|
};
|
||||||
int ret;
|
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
|
* Memory allocations in blkdev_report_zones() can trigger a memory
|
||||||
* reclaim which may in turn cause a recursion into zonefs as well as
|
* 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_ztype = type;
|
||||||
zi->i_zsector = zone->start;
|
zi->i_zsector = zone->start;
|
||||||
zi->i_zone_size = zone->len << SECTOR_SHIFT;
|
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,
|
zi->i_max_size = min_t(loff_t, MAX_LFS_FILESIZE,
|
||||||
zone->capacity << SECTOR_SHIFT);
|
zone->capacity << SECTOR_SHIFT);
|
||||||
|
@ -1456,11 +1472,11 @@ static struct dentry *zonefs_create_inode(struct dentry *parent,
|
||||||
struct inode *dir = d_inode(parent);
|
struct inode *dir = d_inode(parent);
|
||||||
struct dentry *dentry;
|
struct dentry *dentry;
|
||||||
struct inode *inode;
|
struct inode *inode;
|
||||||
int ret;
|
int ret = -ENOMEM;
|
||||||
|
|
||||||
dentry = d_alloc_name(parent, name);
|
dentry = d_alloc_name(parent, name);
|
||||||
if (!dentry)
|
if (!dentry)
|
||||||
return NULL;
|
return ERR_PTR(ret);
|
||||||
|
|
||||||
inode = new_inode(parent->d_sb);
|
inode = new_inode(parent->d_sb);
|
||||||
if (!inode)
|
if (!inode)
|
||||||
|
@ -1485,7 +1501,7 @@ static struct dentry *zonefs_create_inode(struct dentry *parent,
|
||||||
dput:
|
dput:
|
||||||
dput(dentry);
|
dput(dentry);
|
||||||
|
|
||||||
return NULL;
|
return ERR_PTR(ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct zonefs_zone_data {
|
struct zonefs_zone_data {
|
||||||
|
@ -1505,7 +1521,7 @@ static int zonefs_create_zgroup(struct zonefs_zone_data *zd,
|
||||||
struct blk_zone *zone, *next, *end;
|
struct blk_zone *zone, *next, *end;
|
||||||
const char *zgroup_name;
|
const char *zgroup_name;
|
||||||
char *file_name;
|
char *file_name;
|
||||||
struct dentry *dir;
|
struct dentry *dir, *dent;
|
||||||
unsigned int n = 0;
|
unsigned int n = 0;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
@ -1523,8 +1539,8 @@ static int zonefs_create_zgroup(struct zonefs_zone_data *zd,
|
||||||
zgroup_name = "seq";
|
zgroup_name = "seq";
|
||||||
|
|
||||||
dir = zonefs_create_inode(sb->s_root, zgroup_name, NULL, type);
|
dir = zonefs_create_inode(sb->s_root, zgroup_name, NULL, type);
|
||||||
if (!dir) {
|
if (IS_ERR(dir)) {
|
||||||
ret = -ENOMEM;
|
ret = PTR_ERR(dir);
|
||||||
goto free;
|
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.
|
* Use the file number within its group as file name.
|
||||||
*/
|
*/
|
||||||
snprintf(file_name, ZONEFS_NAME_MAX - 1, "%u", n);
|
snprintf(file_name, ZONEFS_NAME_MAX - 1, "%u", n);
|
||||||
if (!zonefs_create_inode(dir, file_name, zone, type)) {
|
dent = zonefs_create_inode(dir, file_name, zone, type);
|
||||||
ret = -ENOMEM;
|
if (IS_ERR(dent)) {
|
||||||
|
ret = PTR_ERR(dent);
|
||||||
goto free;
|
goto free;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -15,11 +15,6 @@ struct zonefs_sysfs_attr {
|
||||||
ssize_t (*show)(struct zonefs_sb_info *sbi, char *buf);
|
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) \
|
#define ZONEFS_SYSFS_ATTR_RO(name) \
|
||||||
static struct zonefs_sysfs_attr zonefs_sysfs_attr_##name = __ATTR_RO(name)
|
static struct zonefs_sysfs_attr zonefs_sysfs_attr_##name = __ATTR_RO(name)
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue