[Devel] [PATCH VZ9] dm-ploop: fix error handling in ploop_resize
Pavel Tikhomirov
ptikhomirov at virtuozzo.com
Fri Jul 4 10:36:58 MSK 2025
1) Do not use goto when simple return is enough.
2) Propagate error code from ploop_prealloc_md_pages().
3) Only cleanup what was acquired and make label names self-descriptive.
4) Fix unhandled ploop_suspend_submitting_pios errors.
https://virtuozzo.atlassian.net/browse/VSTOR-108540
Signed-off-by: Pavel Tikhomirov <ptikhomirov at virtuozzo.com>
---
drivers/md/dm-ploop-cmd.c | 32 ++++++++++++++++++++------------
1 file changed, 20 insertions(+), 12 deletions(-)
diff --git a/drivers/md/dm-ploop-cmd.c b/drivers/md/dm-ploop-cmd.c
index 691eefd0b9f6..8a9e86bd028b 100644
--- a/drivers/md/dm-ploop-cmd.c
+++ b/drivers/md/dm-ploop-cmd.c
@@ -567,7 +567,7 @@ static int ploop_resize(struct ploop *ploop, sector_t new_sectors)
struct ploop_pvd_header *hdr;
sector_t old_sectors;
struct md_page *md0;
- int ret = -ENOMEM;
+ int ret;
if (ploop->maintaince)
return -EBUSY;
@@ -596,9 +596,10 @@ static int ploop_resize(struct ploop *ploop, sector_t new_sectors)
nr_bat_entries = SEC_TO_CLU(ploop, new_sectors);
/* Memory for new md pages */
- if (ploop_prealloc_md_pages(&cmd.resize.md_pages_root,
- ploop->nr_bat_entries, nr_bat_entries) < 0)
- goto err;
+ ret = ploop_prealloc_md_pages(&cmd.resize.md_pages_root,
+ ploop->nr_bat_entries, nr_bat_entries);
+ if (ret)
+ return ret;
size = (PLOOP_MAP_OFFSET + nr_bat_entries) * sizeof(map_index_t);
nr_bat_clusters = DIV_ROUND_UP(size, CLU_SIZE(ploop));
@@ -610,16 +611,20 @@ static int ploop_resize(struct ploop *ploop, sector_t new_sectors)
ploop->nr_bat_entries);
/* Memory for holes_bitmap */
cmd.resize.holes_bitmap = kvmalloc(size, GFP_KERNEL);
- if (!cmd.resize.holes_bitmap)
- goto err;
+ if (!cmd.resize.holes_bitmap) {
+ ret = -ENOMEM;
+ goto err_free_md_pages;
+ }
/* Mark all new bitmap memory as holes */
old_size = DIV_ROUND_UP(ploop->hb_nr, 8);
memset(cmd.resize.holes_bitmap + old_size, 0xff, size - old_size);
cmd.resize.pio = ploop_alloc_pio_with_pages(ploop);
- if (!cmd.resize.pio)
- goto err;
+ if (!cmd.resize.pio) {
+ ret = -ENOMEM;
+ goto err_free_holes_bitmap;
+ }
cmd.resize.clu = UINT_MAX;
cmd.resize.dst_clu = nr_old_bat_clusters;
@@ -630,13 +635,16 @@ static int ploop_resize(struct ploop *ploop, sector_t new_sectors)
cmd.resize.new_sectors = new_sectors;
cmd.resize.md0 = md0;
- ploop_suspend_submitting_pios(ploop);
+ ret = ploop_suspend_submitting_pios(ploop);
+ if (ret)
+ goto err_free_pio;
ret = ploop_process_resize_cmd(ploop, &cmd);
ploop_resume_submitting_pios(ploop);
-err:
- if (cmd.resize.pio)
- ploop_free_pio_with_pages(ploop, cmd.resize.pio);
+err_free_pio:
+ ploop_free_pio_with_pages(ploop, cmd.resize.pio);
+err_free_holes_bitmap:
kvfree(cmd.resize.holes_bitmap);
+err_free_md_pages:
ploop_free_md_pages_tree(&cmd.resize.md_pages_root);
return ret;
}
--
2.49.0
More information about the Devel
mailing list