[PATCH v2] erofs-utils: add I/O control for tarerofs stream via `erofs_vfile`

Gao Xiang hsiangkao at linux.alibaba.com
Tue Jun 11 20:55:59 AEST 2024



On 2024/6/11 17:53, Hongzhen Luo wrote:
> This adds I/O control for tarerofs stream.
> 
> Signed-off-by: Hongzhen Luo <hongzhen at linux.alibaba.com>
> ---
> v2: Add I/O control for tarerofs stream and move the function `erofs_read_from_fd` to io.c
> v1: https://lore.kernel.org/all/20240611075445.178659-1-hongzhen@linux.alibaba.com/
> ---
>   include/erofs/io.h  |  4 ++++
>   include/erofs/tar.h |  2 +-
>   lib/io.c            | 40 ++++++++++++++++++++++++++++++++++++++++
>   lib/tar.c           | 34 +++++-----------------------------
>   4 files changed, 50 insertions(+), 30 deletions(-)
> 
> diff --git a/include/erofs/io.h b/include/erofs/io.h
> index c82dfdf..01147d7 100644
> --- a/include/erofs/io.h
> +++ b/include/erofs/io.h
> @@ -30,6 +30,8 @@ struct erofs_vfops {
>   	int (*fsync)(struct erofs_vfile *vf);
>   	int (*fallocate)(struct erofs_vfile *vf, u64 offset, size_t len, bool pad);
>   	int (*ftruncate)(struct erofs_vfile *vf, u64 length);
> +	int (*read)(struct erofs_vfile *vf, void *buf, size_t len);
> +	u64 (*lseek)(struct erofs_vfile *vf, u64 offset, int whence);
>   };
>   
>   struct erofs_vfile {
> @@ -43,6 +45,8 @@ int erofs_io_fsync(struct erofs_vfile *vf);
>   int erofs_io_fallocate(struct erofs_vfile *vf, u64 offset, size_t len, bool pad);
>   int erofs_io_ftruncate(struct erofs_vfile *vf, u64 length);
>   int erofs_io_pread(struct erofs_vfile *vf, void *buf, u64 offset, size_t len);
> +int erofs_io_read(struct erofs_vfile *vf, void *buf, size_t len);
> +u64 erofs_io_lseek(struct erofs_vfile *vf, u64 offset, int whence);
>   
>   ssize_t erofs_copy_file_range(int fd_in, u64 *off_in, int fd_out, u64 *off_out,
>   			      size_t length);
> diff --git a/include/erofs/tar.h b/include/erofs/tar.h
> index b5c966b..e1de0df 100644
> --- a/include/erofs/tar.h
> +++ b/include/erofs/tar.h
> @@ -39,7 +39,7 @@ struct erofs_iostream_liblzma {
>   
>   struct erofs_iostream {
>   	union {
> -		int fd;			/* original fd */
> +		struct erofs_vfile vf;
>   		void *handler;
>   #ifdef HAVE_LIBLZMA
>   		struct erofs_iostream_liblzma *lzma;
> diff --git a/lib/io.c b/lib/io.c
> index 2db384c..0919951 100644
> --- a/lib/io.c
> +++ b/lib/io.c
> @@ -420,3 +420,43 @@ out:
>   #endif
>   	return __erofs_copy_file_range(fd_in, off_in, fd_out, off_out, length);
>   }
> +
> +s64 erofs_read_from_fd(int fd, void *buf, u64 bytes)

I guess we could fold this function into erofs_io_read().
Otherwise it looks good to me.

Thanks,
Gao Xiang

> +{
> +	s64 i = 0;
> +
> +	while (bytes) {
> +		int len = bytes > INT_MAX ? INT_MAX : bytes;
> +		int ret;
> +
> +		ret = read(fd, buf + i, len);
> +		if (ret < 1) {
> +			if (ret == 0) {
> +				break;
> +			} else if (errno != EINTR) {
> +				erofs_err("failed to read : %s\n",
> +					  strerror(errno));
> +				return -errno;
> +			}
> +		}
> +		bytes -= ret;
> +		i += ret;
> +        }
> +        return i;
> +}
> +
> +int erofs_io_read(struct erofs_vfile *vf, void *buf, size_t len)
> +{
> +	if (vf->ops)
> +		return vf->ops->read(vf, buf, len);
> +
> +	return erofs_read_from_fd(vf->fd, buf, len);
> +}
> +


More information about the Linux-erofs mailing list