Signed-off-by: Gao Xiang <hsiang...@aol.com>
---
 fuse/main.c              |   7 ++-
 fuse/namei.c             | 110 +++++++++++++++------------------------
 fuse/namei.h             |   3 +-
 fuse/read.c              |  86 +++++-------------------------
 fuse/readir.c            |   9 ++--
 include/erofs/internal.h |  34 ------------
 6 files changed, 63 insertions(+), 186 deletions(-)

diff --git a/fuse/main.c b/fuse/main.c
index 563b2c378952..6176e836c2f1 100644
--- a/fuse/main.c
+++ b/fuse/main.c
@@ -131,12 +131,11 @@ int erofs_open(const char *path, struct fuse_file_info 
*fi)
 
 int erofs_getattr(const char *path, struct stat *stbuf)
 {
-       struct erofs_vnode v;
+       struct erofs_inode v = { 0 };
        int ret;
 
        erofs_dbg("getattr(%s)", path);
-       memset(&v, 0, sizeof(v));
-       ret = erofs_iget_by_path(path, &v);
+       ret = erofs_ilookup(path, &v);
        if (ret)
                return -ENOENT;
 
@@ -146,7 +145,7 @@ int erofs_getattr(const char *path, struct stat *stbuf)
        stbuf->st_blocks = stbuf->st_size / EROFS_BLKSIZ;
        stbuf->st_uid = v.i_uid;
        stbuf->st_gid = v.i_gid;
-       stbuf->st_rdev = v.i_rdev;
+       stbuf->st_rdev = v.u.i_rdev;
        stbuf->st_atime = sbi.build_time;
        stbuf->st_mtime = sbi.build_time;
        stbuf->st_ctime = sbi.build_time;
diff --git a/fuse/namei.c b/fuse/namei.c
index fd5ae7bfc410..326ea85809bb 100644
--- a/fuse/namei.c
+++ b/fuse/namei.c
@@ -13,7 +13,6 @@
 #include <sys/stat.h>
 #include <sys/sysmacros.h>
 
-#include "erofs/defs.h"
 #include "erofs/print.h"
 #include "erofs/io.h"
 
@@ -24,12 +23,12 @@ static inline dev_t new_decode_dev(u32 dev)
        return makedev(major, minor);
 }
 
-static int erofs_iget_by_nid(erofs_nid_t nid, struct erofs_vnode *vi)
+static int erofs_read_inode_from_disk(struct erofs_inode *vi)
 {
        int ret, ifmt;
        char buf[EROFS_BLKSIZ];
        struct erofs_inode_compact *v1;
-       const erofs_off_t addr = iloc(nid);
+       const erofs_off_t addr = iloc(vi->nid);
        const size_t size = EROFS_BLKSIZ - erofs_blkoff(addr);
 
        ret = dev_read(buf, addr, size);
@@ -50,41 +49,28 @@ static int erofs_iget_by_nid(erofs_nid_t nid, struct 
erofs_vnode *vi)
        vi->i_uid = le16_to_cpu(v1->i_uid);
        vi->i_gid = le16_to_cpu(v1->i_gid);
        vi->i_nlink = le16_to_cpu(v1->i_nlink);
-       vi->nid = nid;
 
        switch (vi->i_mode & S_IFMT) {
        case S_IFBLK:
        case S_IFCHR:
-               vi->i_rdev = new_decode_dev(le32_to_cpu(v1->i_u.rdev));
+               vi->u.i_rdev = new_decode_dev(le32_to_cpu(v1->i_u.rdev));
                break;
        case S_IFIFO:
        case S_IFSOCK:
-               vi->i_rdev = 0;
+               vi->u.i_rdev = 0;
                break;
        case S_IFREG:
        case S_IFLNK:
        case S_IFDIR:
-               vi->raw_blkaddr = le32_to_cpu(v1->i_u.raw_blkaddr);
+               vi->u.i_blkaddr = le32_to_cpu(v1->i_u.raw_blkaddr);
                break;
        default:
                return -EIO;
        }
 
-       vi->z_inited = false;
-       if (erofs_inode_is_data_compressed(vi->datalayout)) {
-               struct erofs_inode ei = { .datalayout = vi->datalayout };
-
-               z_erofs_fill_inode(&ei);
-
-               /* XXX: will be dropped after erofs_vnode is removed */
-               vi->z_advise = ei.z_advise;
-               vi->z_algorithmtype[0] = ei.z_algorithmtype[0];
-               vi->z_algorithmtype[1] = ei.z_algorithmtype[1];
-               vi->z_logical_clusterbits = ei.z_logical_clusterbits;
-               vi->z_physical_clusterbits[0] = ei.z_physical_clusterbits[0];
-               vi->z_physical_clusterbits[1] = ei.z_physical_clusterbits[1];
-               vi->z_inited = (ei.flags != 0);
-       }
+       vi->flags = 0;
+       if (erofs_inode_is_data_compressed(vi->datalayout))
+               z_erofs_fill_inode(vi);
        return 0;
 }
 
@@ -137,55 +123,42 @@ int erofs_namei(struct nameidata *nd,
        erofs_nid_t nid = nd->nid;
        int ret;
        char buf[EROFS_BLKSIZ];
-       struct erofs_vnode v;
+       struct erofs_inode vi = { .nid = nid };
+       erofs_off_t offset;
 
-       ret = erofs_iget_by_nid(nid, &v);
+       ret = erofs_read_inode_from_disk(&vi);
        if (ret)
                return ret;
 
-       {
-               unsigned int offset = 0;
-
-               struct erofs_inode tmp = {
-                       .u = {
-                               .i_blkaddr = v.raw_blkaddr,
-                       },
-                       .nid = nid,
-                       .i_size = v.i_size,
-                       .datalayout = v.datalayout,
-                       .inode_isize = v.inode_isize,
-                       .xattr_isize = v.xattr_isize,
-               };
-
-               while (offset < v.i_size) {
-                       int maxsize = min(v.i_size - offset, EROFS_BLKSIZ);
-                       struct erofs_dirent *de = (void *)buf;
-                       unsigned int nameoff;
-
-                       ret = erofs_read_raw_data(&tmp, buf, offset, maxsize);
-                       if (ret)
-                               return ret;
-
-                       nameoff = le16_to_cpu(de->nameoff);
-
-                       if (nameoff < sizeof(struct erofs_dirent) ||
-                           nameoff >= PAGE_SIZE) {
-                               erofs_err("invalid de[0].nameoff %u @ nid %llu",
-                                         nameoff, nid | 0ULL);
-                               return -EFSCORRUPTED;
-                       }
-
-                       de = find_target_dirent(nid, buf, name, len,
-                                               nameoff, maxsize);
-                       if (IS_ERR(de))
-                               return PTR_ERR(de);
-
-                       if (de) {
-                               nd->nid = le64_to_cpu(de->nid);
-                               return 0;
-                       }
-                       offset += maxsize;
+       offset = 0;
+       while (offset < vi.i_size) {
+               erofs_off_t maxsize = min_t(erofs_off_t,
+                                           vi.i_size - offset, EROFS_BLKSIZ);
+               struct erofs_dirent *de = (void *)buf;
+               unsigned int nameoff;
+
+               ret = erofs_read_raw_data(&vi, buf, offset, maxsize);
+               if (ret)
+                       return ret;
+
+               nameoff = le16_to_cpu(de->nameoff);
+               if (nameoff < sizeof(struct erofs_dirent) ||
+                   nameoff >= PAGE_SIZE) {
+                       erofs_err("invalid de[0].nameoff %u @ nid %llu",
+                                 nameoff, nid | 0ULL);
+                       return -EFSCORRUPTED;
+               }
+
+               de = find_target_dirent(nid, buf, name, len,
+                                       nameoff, maxsize);
+               if (IS_ERR(de))
+                       return PTR_ERR(de);
+
+               if (de) {
+                       nd->nid = le64_to_cpu(de->nid);
+                       return 0;
                }
+               offset += maxsize;
        }
        return -ENOENT;
 }
@@ -218,7 +191,7 @@ static int link_path_walk(const char *name, struct 
nameidata *nd)
        return 0;
 }
 
-int erofs_iget_by_path(const char *path, struct erofs_vnode *v)
+int erofs_ilookup(const char *path, struct erofs_inode *vi)
 {
        int ret;
        struct nameidata nd;
@@ -227,6 +200,7 @@ int erofs_iget_by_path(const char *path, struct erofs_vnode 
*v)
        if (ret)
                return ret;
 
-       return erofs_iget_by_nid(nd.nid, v);
+       vi->nid = nd.nid;
+       return erofs_read_inode_from_disk(vi);
 }
 
diff --git a/fuse/namei.h b/fuse/namei.h
index bd5adfda2969..730caf0085f7 100644
--- a/fuse/namei.h
+++ b/fuse/namei.h
@@ -8,8 +8,7 @@
 #define __INODE_H
 
 #include "erofs/internal.h"
-#include "erofs_fs.h"
 
-int erofs_iget_by_path(const char *path, struct erofs_vnode *v);
+int erofs_ilookup(const char *path, struct erofs_inode *vi);
 
 #endif
diff --git a/fuse/read.c b/fuse/read.c
index 21fbd2eea662..4e0058c01e81 100644
--- a/fuse/read.c
+++ b/fuse/read.c
@@ -18,105 +18,43 @@
 #include "erofs/io.h"
 #include "erofs/decompress.h"
 
-size_t erofs_read_data_wrapper(struct erofs_vnode *vnode, char *buffer,
-                              size_t size, off_t offset)
-{
-       struct erofs_inode tmp = {
-               .u = {
-                       .i_blkaddr = vnode->raw_blkaddr,
-               },
-               .nid = vnode->nid,
-               .i_size = vnode->i_size,
-               .datalayout = vnode->datalayout,
-               .inode_isize = vnode->inode_isize,
-               .xattr_isize = vnode->xattr_isize,
-       };
-
-       int ret = erofs_read_raw_data(&tmp, buffer, offset, size);
-       if (ret)
-               return ret;
-
-       erofs_info("nid:%llu size=%zd done", (unsigned long long)vnode->nid, 
size);
-       return size;
-}
-
-size_t erofs_read_data_compression(struct erofs_vnode *vnode, char *buffer,
-                                  erofs_off_t size, erofs_off_t offset)
-{
-       struct erofs_inode tmp = {
-               .nid = vnode->nid,
-               .i_size = vnode->i_size,
-               .datalayout = vnode->datalayout,
-               .inode_isize = vnode->inode_isize,
-               .xattr_isize = vnode->xattr_isize,
-               .z_advise = vnode->z_advise,
-               .z_algorithmtype = {
-                       [0] = vnode->z_algorithmtype[0],
-                       [1] = vnode->z_algorithmtype[1],
-               },
-               .z_logical_clusterbits = vnode->z_logical_clusterbits,
-               .z_physical_clusterbits = {
-                       [0] = vnode->z_physical_clusterbits[0],
-                       [1] = vnode->z_physical_clusterbits[1],
-               },
-       };
-
-       if (vnode->z_inited)
-               tmp.flags |= EROFS_I_Z_INITED;
-
-       int ret = z_erofs_read_data(&tmp, buffer, offset, size);
-       if (ret)
-               return ret;
-
-       return size;
-}
-
 int erofs_read(const char *path, char *buffer, size_t size, off_t offset,
               struct fuse_file_info *fi)
 {
        int ret;
-       struct erofs_vnode v;
+       struct erofs_inode vi;
 
        UNUSED(fi);
        erofs_info("path:%s size=%zd offset=%llu", path, size, (long 
long)offset);
 
-       ret = erofs_iget_by_path(path, &v);
+       ret = erofs_ilookup(path, &vi);
        if (ret)
                return ret;
 
-       erofs_info("path:%s nid=%llu mode=%u", path, v.nid | 0ULL, 
v.datalayout);
-       switch (v.datalayout) {
+       erofs_info("path:%s nid=%llu mode=%u", path, vi.nid | 0ULL, 
vi.datalayout);
+       switch (vi.datalayout) {
        case EROFS_INODE_FLAT_PLAIN:
        case EROFS_INODE_FLAT_INLINE:
-               return erofs_read_data_wrapper(&v, buffer, size, offset);
-
+               ret = erofs_read_raw_data(&vi, buffer, offset, size);
+               break;
        case EROFS_INODE_FLAT_COMPRESSION_LEGACY:
        case EROFS_INODE_FLAT_COMPRESSION:
-               return erofs_read_data_compression(&v, buffer, size, offset);
+               ret = z_erofs_read_data(&vi, buffer, offset, size);
+               break;
 
        default:
                return -EINVAL;
        }
+
+       return ret ? ret : size;
 }
 
 int erofs_readlink(const char *path, char *buffer, size_t size)
 {
-       int ret;
-       size_t lnksz;
-       struct erofs_vnode v;
+       int ret = erofs_read(path, buffer, size, 0, NULL);
 
-       ret = erofs_iget_by_path(path, &v);
-       if (ret)
+       if (ret < 0)
                return ret;
-
-       lnksz = min((size_t)v.i_size, size - 1);
-
-       ret = erofs_read(path, buffer, lnksz, 0, NULL);
-       buffer[lnksz] = '\0';
-       if (ret != (int)lnksz)
-               return ret;
-
-       erofs_info("path:%s link=%s size=%llu", path, buffer, (unsigned long 
long)lnksz);
        return 0;
 }
 
diff --git a/fuse/readir.c b/fuse/readir.c
index 1d28016a8900..510aa7ebaf11 100644
--- a/fuse/readir.c
+++ b/fuse/readir.c
@@ -66,14 +66,14 @@ int erofs_readdir(const char *path, void *buf, 
fuse_fill_dir_t filler,
                  off_t offset, struct fuse_file_info *fi)
 {
        int ret;
-       struct erofs_vnode v;
+       struct erofs_inode v;
        char dirsbuf[EROFS_BLKSIZ];
        uint32_t dir_nr, dir_off, nr_cnt;
 
        erofs_dbg("readdir:%s offset=%llu", path, (long long)offset);
        UNUSED(fi);
 
-       ret = erofs_iget_by_path(path, &v);
+       ret = erofs_ilookup(path, &v);
        if (ret)
                return ret;
 
@@ -89,11 +89,12 @@ int erofs_readdir(const char *path, void *buf, 
fuse_fill_dir_t filler,
        dir_off = erofs_blkoff(v.i_size);
        nr_cnt = 0;
 
-       erofs_dbg("dir_size=%u dir_nr = %u dir_off=%u", v.i_size, dir_nr, 
dir_off);
+       erofs_dbg("dir_size=%llu dir_nr = %u dir_off=%u",
+                 v.i_size | 0ULL, dir_nr, dir_off);
 
        while (nr_cnt < dir_nr) {
                memset(dirsbuf, 0, sizeof(dirsbuf));
-               ret = blk_read(dirsbuf, v.raw_blkaddr + nr_cnt, 1);
+               ret = blk_read(dirsbuf, v.u.i_blkaddr + nr_cnt, 1);
                if (ret < 0)
                        return -EIO;
                fill_dir(dirsbuf, filler, buf, EROFS_BLKSIZ);
diff --git a/include/erofs/internal.h b/include/erofs/internal.h
index 98e1263fa19c..573ebfc298b5 100644
--- a/include/erofs/internal.h
+++ b/include/erofs/internal.h
@@ -164,40 +164,6 @@ struct erofs_inode {
 #endif
 };
 
-struct erofs_vnode {
-       uint8_t datalayout;
-
-       uint32_t i_size;
-       /* inline size in bytes */
-       uint16_t inode_isize;
-       uint16_t xattr_isize;
-
-       uint16_t xattr_shared_count;
-       char *xattr_shared_xattrs;
-
-       union {
-               erofs_blk_t raw_blkaddr;
-               struct {
-                       uint16_t z_advise;
-                       uint8_t  z_algorithmtype[2];
-                       uint8_t  z_logical_clusterbits;
-                       uint8_t  z_physical_clusterbits[2];
-               };
-       };
-       erofs_nid_t nid;
-       uint32_t i_ino;
-
-       uint16_t i_mode;
-       uint16_t i_uid;
-       uint16_t i_gid;
-       uint16_t i_nlink;
-       uint32_t i_rdev;
-
-       bool z_inited;
-       /* if file is inline read inline data witch inode */
-       char *idata;
-};
-
 static inline bool is_inode_layout_compression(struct erofs_inode *inode)
 {
        return erofs_inode_is_data_compressed(inode->datalayout);
-- 
2.24.0

Reply via email to