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