On 2024/6/11 17:53, Hongzhen Luo wrote:
This adds I/O control for tarerofs stream.

Signed-off-by: Hongzhen Luo <hongz...@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-hongz...@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);
+}
+

Reply via email to