[WIP] [PATCH v4 06/12] erofs-utils: fuse: get rid of erofs_vnode
Gao Xiang
hsiangkao at aol.com
Sun Nov 15 05:25:11 AEDT 2020
Signed-off-by: Gao Xiang <hsiangkao at 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
More information about the Linux-erofs
mailing list