From: Sasha Levin <sashal@kernel.org>
To: linux-kernel@vger.kernel.org, stable@vger.kernel.org
Cc: Damien Le Moal <damien.lemoal@opensource.wdc.com>,
Johannes Thumshirn <johannes.thumshirn@wdc.com>,
Sasha Levin <sashal@kernel.org>,
naohiro.aota@wdc.com, linux-fsdevel@vger.kernel.org
Subject: [PATCH AUTOSEL 5.15 18/31] zonefs: fix zone report size in __zonefs_io_error()
Date: Wed, 23 Nov 2022 07:42:19 -0500 [thread overview]
Message-ID: <20221123124234.265396-18-sashal@kernel.org> (raw)
In-Reply-To: <20221123124234.265396-1-sashal@kernel.org>
From: Damien Le Moal <damien.lemoal@opensource.wdc.com>
[ Upstream commit 7dd12d65ac646046a3fe0bbf9a4e86f4514207b3 ]
When an IO error occurs, the function __zonefs_io_error() is used to
issue a zone report to obtain the latest zone information from the
device. This function gets a zone report for all zones used as storage
for a file, which is always 1 zone except for files representing
aggregated conventional zones.
The number of zones of a zone report for a file is calculated in
__zonefs_io_error() by doing a bit-shift of the inode i_zone_size field,
which is equal to or larger than the device zone size. However, this
calculation does not take into account that the last zone of a zoned
device may be smaller than the zone size reported by bdev_zone_sectors()
(which is used to set the bit shift size). As a result, if an error
occurs for an IO targetting such last smaller zone, the zone report will
ask for 0 zones, leading to an invalid zone report.
Fix this by using the fact that all files require a 1 zone report,
except if the inode i_zone_size field indicates a zone size larger than
the device zone size. This exception case corresponds to a mount with
aggregated conventional zones.
A check for this exception is added to the file inode initialization
during mount. If an invalid setup is detected, emit an error and fail
the mount (check contributed by Johannes Thumshirn).
Signed-off-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
Signed-off-by: Damien Le Moal <damien.lemoal@opensource.wdc.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
---
fs/zonefs/super.c | 37 +++++++++++++++++++++++++++----------
1 file changed, 27 insertions(+), 10 deletions(-)
diff --git a/fs/zonefs/super.c b/fs/zonefs/super.c
index f8feaed0b54d..85a98590b6ef 100644
--- a/fs/zonefs/super.c
+++ b/fs/zonefs/super.c
@@ -448,14 +448,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
@@ -1354,6 +1362,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);
@@ -1396,11 +1412,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)
@@ -1425,7 +1441,7 @@ static struct dentry *zonefs_create_inode(struct dentry *parent,
dput:
dput(dentry);
- return NULL;
+ return ERR_PTR(ret);
}
struct zonefs_zone_data {
@@ -1445,7 +1461,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;
@@ -1463,8 +1479,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;
}
@@ -1510,8 +1526,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;
}
--
2.35.1
next prev parent reply other threads:[~2022-11-23 12:48 UTC|newest]
Thread overview: 35+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-11-23 12:42 [PATCH AUTOSEL 5.15 01/31] Input: synaptics - switch touchpad on HP Laptop 15-da3001TU to RMI mode Sasha Levin
2022-11-23 12:42 ` [PATCH AUTOSEL 5.15 02/31] dt-bindings: input: touchscreen: Add compatible for Goodix GT7986U chip Sasha Levin
2022-11-23 12:42 ` [PATCH AUTOSEL 5.15 03/31] ASoC: Intel: bytcht_es8316: Add quirk for the Nanote UMPC-01 Sasha Levin
2022-11-23 12:42 ` [PATCH AUTOSEL 5.15 04/31] ASoC: Intel: soc-acpi: add ES83x6 support to IceLake Sasha Levin
2022-11-23 12:42 ` [PATCH AUTOSEL 5.15 05/31] tools: iio: iio_generic_buffer: Fix read size Sasha Levin
2022-11-23 12:42 ` [PATCH AUTOSEL 5.15 06/31] ASoC: hda: intel-dsp-config: add ES83x6 quirk for IceLake Sasha Levin
2022-11-23 12:42 ` [PATCH AUTOSEL 5.15 07/31] serial: 8250: 8250_omap: Avoid RS485 RTS glitch on ->set_termios() Sasha Levin
2022-11-23 12:42 ` [PATCH AUTOSEL 5.15 08/31] Input: goodix - try resetting the controller when no config is set Sasha Levin
2022-11-23 12:42 ` [PATCH AUTOSEL 5.15 09/31] Input: soc_button_array - add use_low_level_irq module parameter Sasha Levin
2022-11-23 12:42 ` [PATCH AUTOSEL 5.15 10/31] Input: soc_button_array - add Acer Switch V 10 to dmi_use_low_level_irq[] Sasha Levin
2022-11-23 12:42 ` [PATCH AUTOSEL 5.15 11/31] Input: i8042 - apply probe defer to more ASUS ZenBook models Sasha Levin
2022-11-23 12:42 ` [PATCH AUTOSEL 5.15 12/31] ASoC: stm32: dfsdm: manage cb buffers cleanup Sasha Levin
2022-11-23 12:42 ` [PATCH AUTOSEL 5.15 13/31] xen-pciback: Allow setting PCI_MSIX_FLAGS_MASKALL too Sasha Levin
2022-11-23 12:42 ` [PATCH AUTOSEL 5.15 14/31] xen/platform-pci: add missing free_irq() in error path Sasha Levin
2022-11-23 12:42 ` [PATCH AUTOSEL 5.15 15/31] platform/x86: asus-wmi: add missing pci_dev_put() in asus_wmi_set_xusb2pr() Sasha Levin
2022-11-23 12:42 ` [PATCH AUTOSEL 5.15 16/31] platform/x86: acer-wmi: Enable SW_TABLET_MODE on Switch V 10 (SW5-017) Sasha Levin
2022-11-23 12:42 ` [PATCH AUTOSEL 5.15 17/31] drm/amdgpu: disable BACO support on more cards Sasha Levin
2022-11-23 12:42 ` Sasha Levin [this message]
2022-11-23 12:42 ` [PATCH AUTOSEL 5.15 19/31] platform/surface: aggregator_registry: Add support for Surface Laptop 5 Sasha Levin
2022-11-23 12:42 ` [PATCH AUTOSEL 5.15 20/31] platform/x86: hp-wmi: Ignore Smart Experience App event Sasha Levin
2022-11-23 12:42 ` [PATCH AUTOSEL 5.15 21/31] platform/x86: ideapad-laptop: Fix interrupt storm on fn-lock toggle on some Yoga laptops Sasha Levin
2022-11-23 12:42 ` [PATCH AUTOSEL 5.15 22/31] tcp: configurable source port perturb table size Sasha Levin
2022-11-23 12:42 ` [PATCH AUTOSEL 5.15 23/31] block: make blk_set_default_limits() private Sasha Levin
2022-11-23 13:44 ` Jens Axboe
2022-11-30 11:05 ` Sasha Levin
2022-11-23 12:42 ` [PATCH AUTOSEL 5.15 24/31] dm-integrity: set dma_alignment limit in io_hints Sasha Levin
2022-11-23 12:42 ` [PATCH AUTOSEL 5.15 25/31] dm-log-writes: " Sasha Levin
2022-11-23 15:04 ` Keith Busch
2022-11-30 11:06 ` Sasha Levin
2022-11-23 12:42 ` [PATCH AUTOSEL 5.15 26/31] net: usb: qmi_wwan: add Telit 0x103a composition Sasha Levin
2022-11-23 12:42 ` [PATCH AUTOSEL 5.15 27/31] scsi: mpi3mr: Suppress command reply debug prints Sasha Levin
2022-11-23 12:42 ` [PATCH AUTOSEL 5.15 28/31] scsi: iscsi: Fix possible memory leak when device_register() failed Sasha Levin
2022-11-23 12:42 ` [PATCH AUTOSEL 5.15 29/31] gpu: host1x: Avoid trying to use GART on Tegra20 Sasha Levin
2022-11-23 12:42 ` [PATCH AUTOSEL 5.15 30/31] dm integrity: flush the journal on suspend Sasha Levin
2022-11-23 12:42 ` [PATCH AUTOSEL 5.15 31/31] dm integrity: clear " Sasha Levin
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20221123124234.265396-18-sashal@kernel.org \
--to=sashal@kernel.org \
--cc=damien.lemoal@opensource.wdc.com \
--cc=johannes.thumshirn@wdc.com \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=naohiro.aota@wdc.com \
--cc=stable@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).