[dm-devel] [PATCH] kpartx: compare image filenames with backing files

Benjamin Marzinski bmarzins at redhat.com
Thu Jul 26 17:08:58 UTC 2018


On Mon, Jul 16, 2018 at 03:52:13PM +0300, Yuval Turgeman wrote:
> When running `kpartx -d`, find_loop_by_file tries to compare the image's
> realpath with the output from loopinfo.lo_name, which may hold only the
> basename of the image, making kpartx exit without finding the loopdev
> for the image.
> 
> In case the original comparison fails, this patch will check the image's
> realpath with the loop device's backing_file so that find_loop_by_file
> will return the correct value.

Looks good.

Reviewed-by: Benjamin Marzinski <bmarzins at redhat.com>

> 
> Signed-off-by: Yuval Turgeman <yturgema at redhat.com>
> ---
>  kpartx/lopart.c | 30 ++++++++++++++++++++++++++++++
>  1 file changed, 30 insertions(+)
> 
> diff --git a/kpartx/lopart.c b/kpartx/lopart.c
> index 69c1eda1..9b652554 100644
> --- a/kpartx/lopart.c
> +++ b/kpartx/lopart.c
> @@ -69,6 +69,8 @@ char *find_loop_by_file(const char *filename)
>  	struct loop_info loopinfo;
>  	const char VIRT_BLOCK[] = "/sys/devices/virtual/block";
>  	char path[PATH_MAX];
> +	char bf_path[PATH_MAX];
> +	char backing_file[PATH_MAX];
>  
>  	dir = opendir(VIRT_BLOCK);
>  	if (!dir)
> @@ -122,6 +124,34 @@ char *find_loop_by_file(const char *filename)
>  			found = realpath(path, NULL);
>  			break;
>  		}
> +
> +		/*
> +		 * filename is a realpath, while loopinfo.lo_name may hold just the
> +		 * basename.  If that's the case, try to match filename against the
> +		 * backing_file entry for this loop entry
> +		 */
> +		if (snprintf(bf_path, PATH_MAX, "%s/%s/loop/backing_file", VIRT_BLOCK,
> +					 dent->d_name) >= PATH_MAX)
> +			continue;
> +
> +		fd = open(bf_path, O_RDONLY);
> +		if (fd < 0)
> +			continue;
> +
> +		bytes_read = read(fd, backing_file, sizeof(backing_file) - 1);
> +		if (bytes_read <= 0) {
> +			close(fd);
> +			continue;
> +		}
> +
> +		close(fd);
> +
> +		backing_file[bytes_read-1] = '\0';
> +
> +		if (0 == strcmp(filename, backing_file)) {
> +			found = realpath(path, NULL);
> +			break;
> +		}
>  	}
>  	closedir(dir);
>  	return found;
> -- 
> 2.17.1
> 
> --
> dm-devel mailing list
> dm-devel at redhat.com
> https://www.redhat.com/mailman/listinfo/dm-devel




More information about the dm-devel mailing list