0d8d9bd342
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
97 lines
3.3 KiB
Diff
97 lines
3.3 KiB
Diff
From 1eba7b686a41c71f24f60f8adcd51ddf1882686d Mon Sep 17 00:00:00 2001
|
|
From: Hanna Czenczek <hreitz@redhat.com>
|
|
Date: Thu, 24 Aug 2023 17:53:40 +0200
|
|
Subject: [PATCH 09/13] file-posix: Clear bs->bl.zoned on error
|
|
|
|
RH-Author: Hanna Czenczek <hreitz@redhat.com>
|
|
RH-MergeRequest: 202: file-posix: Fix zone update in I/O error path
|
|
RH-Jira: RHEL-7360
|
|
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
|
RH-Commit: [1/5] 3e2419b64b35afdfa45f70c5eb61478321de5233 (hreitz/qemu-kvm-c-9-s)
|
|
|
|
bs->bl.zoned is what indicates whether the zone information is present
|
|
and valid; it is the only thing that raw_refresh_zoned_limits() sets if
|
|
CONFIG_BLKZONED is not defined, and it is also the only thing that it
|
|
sets if CONFIG_BLKZONED is defined, but there are no zones.
|
|
|
|
Make sure that it is always set to BLK_Z_NONE if there is an error
|
|
anywhere in raw_refresh_zoned_limits() so that we do not accidentally
|
|
announce zones while our information is incomplete or invalid.
|
|
|
|
This also fixes a memory leak in the last error path in
|
|
raw_refresh_zoned_limits().
|
|
|
|
Signed-off-by: Hanna Czenczek <hreitz@redhat.com>
|
|
Message-Id: <20230824155345.109765-2-hreitz@redhat.com>
|
|
Reviewed-by: Sam Li <faithilikerun@gmail.com>
|
|
(cherry picked from commit 56d1a022a77ea2125564913665eeadf3e303a671)
|
|
Signed-off-by: Hanna Czenczek <hreitz@redhat.com>
|
|
---
|
|
block/file-posix.c | 21 ++++++++++++---------
|
|
1 file changed, 12 insertions(+), 9 deletions(-)
|
|
|
|
diff --git a/block/file-posix.c b/block/file-posix.c
|
|
index b16e9c21a1..2b88b9eefa 100644
|
|
--- a/block/file-posix.c
|
|
+++ b/block/file-posix.c
|
|
@@ -1412,11 +1412,9 @@ static void raw_refresh_zoned_limits(BlockDriverState *bs, struct stat *st,
|
|
BlockZoneModel zoned;
|
|
int ret;
|
|
|
|
- bs->bl.zoned = BLK_Z_NONE;
|
|
-
|
|
ret = get_sysfs_zoned_model(st, &zoned);
|
|
if (ret < 0 || zoned == BLK_Z_NONE) {
|
|
- return;
|
|
+ goto no_zoned;
|
|
}
|
|
bs->bl.zoned = zoned;
|
|
|
|
@@ -1437,10 +1435,10 @@ static void raw_refresh_zoned_limits(BlockDriverState *bs, struct stat *st,
|
|
if (ret < 0) {
|
|
error_setg_errno(errp, -ret, "Unable to read chunk_sectors "
|
|
"sysfs attribute");
|
|
- return;
|
|
+ goto no_zoned;
|
|
} else if (!ret) {
|
|
error_setg(errp, "Read 0 from chunk_sectors sysfs attribute");
|
|
- return;
|
|
+ goto no_zoned;
|
|
}
|
|
bs->bl.zone_size = ret << BDRV_SECTOR_BITS;
|
|
|
|
@@ -1448,10 +1446,10 @@ static void raw_refresh_zoned_limits(BlockDriverState *bs, struct stat *st,
|
|
if (ret < 0) {
|
|
error_setg_errno(errp, -ret, "Unable to read nr_zones "
|
|
"sysfs attribute");
|
|
- return;
|
|
+ goto no_zoned;
|
|
} else if (!ret) {
|
|
error_setg(errp, "Read 0 from nr_zones sysfs attribute");
|
|
- return;
|
|
+ goto no_zoned;
|
|
}
|
|
bs->bl.nr_zones = ret;
|
|
|
|
@@ -1472,10 +1470,15 @@ static void raw_refresh_zoned_limits(BlockDriverState *bs, struct stat *st,
|
|
ret = get_zones_wp(bs, s->fd, 0, bs->bl.nr_zones, 0);
|
|
if (ret < 0) {
|
|
error_setg_errno(errp, -ret, "report wps failed");
|
|
- bs->wps = NULL;
|
|
- return;
|
|
+ goto no_zoned;
|
|
}
|
|
qemu_co_mutex_init(&bs->wps->colock);
|
|
+ return;
|
|
+
|
|
+no_zoned:
|
|
+ bs->bl.zoned = BLK_Z_NONE;
|
|
+ g_free(bs->wps);
|
|
+ bs->wps = NULL;
|
|
}
|
|
#else /* !defined(CONFIG_BLKZONED) */
|
|
static void raw_refresh_zoned_limits(BlockDriverState *bs, struct stat *st,
|
|
--
|
|
2.39.3
|
|
|