[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