[Devel] [PATCH VZ9] dm-ploop: fix error handling in ploop_resize
Andrey Zhadchenko
andrey.zhadchenko at virtuozzo.com
Fri Jul 4 13:40:51 MSK 2025
LGTM
Reviewed-by: Andrey Zhadchenko <andrey.zhadchenko at virtuozzo.com>
On 7/4/25 09:36, Pavel Tikhomirov wrote:
> 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;
> }
More information about the Devel
mailing list