[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