[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