All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCHSET 2/6] fuse2fs: various filewide cleanups
@ 2025-05-21 22:34 Darrick J. Wong
  2025-05-21 22:42 ` [PATCH 1/3] fuse2fs: clean up open-coded ext2_inode_large -> ext2_inode casts Darrick J. Wong
                   ` (3 more replies)
  0 siblings, 4 replies; 5+ messages in thread
From: Darrick J. Wong @ 2025-05-21 22:34 UTC (permalink / raw)
  To: tytso; +Cc: linux-ext4

Hi all,

Clean up the inode reading and writing callsites and the opencoded unit
conversion code throughout the program.

If you're going to start using this code, I strongly recommend pulling
from my git trees, which are linked below.

Comments and questions are, as always, welcome.

e2fsprogs git tree:
https://git.kernel.org/cgit/linux/kernel/git/djwong/e2fsprogs.git/log/?h=fuse2fs-cleanups
---
Commits in this patchset:
 * fuse2fs: clean up open-coded ext2_inode_large -> ext2_inode casts
 * fuse2fs: simplify reading and writing inodes
 * fuse2fs: implement blocksize converters
---
 misc/fuse2fs.c |  269 +++++++++++++++++++++++++++-----------------------------
 1 file changed, 132 insertions(+), 137 deletions(-)


^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH 1/3] fuse2fs: clean up open-coded ext2_inode_large -> ext2_inode casts
  2025-05-21 22:34 [PATCHSET 2/6] fuse2fs: various filewide cleanups Darrick J. Wong
@ 2025-05-21 22:42 ` Darrick J. Wong
  2025-05-21 22:43 ` [PATCH 2/3] fuse2fs: simplify reading and writing inodes Darrick J. Wong
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 5+ messages in thread
From: Darrick J. Wong @ 2025-05-21 22:42 UTC (permalink / raw)
  To: tytso; +Cc: linux-ext4

From: Darrick J. Wong <djwong@kernel.org>

There's a typechecked helper for this now, so let's use it.

Signed-off-by: "Darrick J. Wong" <djwong@kernel.org>
---
 misc/fuse2fs.c |  102 ++++++++++++++++++++++++++++----------------------------
 1 file changed, 51 insertions(+), 51 deletions(-)


diff --git a/misc/fuse2fs.c b/misc/fuse2fs.c
index 7ec9c6d861fd80..6921e6dc0a356c 100644
--- a/misc/fuse2fs.c
+++ b/misc/fuse2fs.c
@@ -347,7 +347,7 @@ static int update_ctime(ext2_filsys fs, ext2_ino_t ino,
 
 	/* Otherwise we have to read-modify-write the inode */
 	memset(&inode, 0, sizeof(inode));
-	err = ext2fs_read_inode_full(fs, ino, (struct ext2_inode *)&inode,
+	err = ext2fs_read_inode_full(fs, ino, EXT2_INODE(&inode),
 				     sizeof(inode));
 	if (err)
 		return translate_error(fs, ino, err);
@@ -355,7 +355,7 @@ static int update_ctime(ext2_filsys fs, ext2_ino_t ino,
 	increment_version(&inode);
 	EXT4_INODE_SET_XTIME(i_ctime, &now, &inode);
 
-	err = ext2fs_write_inode_full(fs, ino, (struct ext2_inode *)&inode,
+	err = ext2fs_write_inode_full(fs, ino, EXT2_INODE(&inode),
 				      sizeof(inode));
 	if (err)
 		return translate_error(fs, ino, err);
@@ -372,7 +372,7 @@ static int update_atime(ext2_filsys fs, ext2_ino_t ino)
 	if (!(fs->flags & EXT2_FLAG_RW))
 		return 0;
 	memset(&inode, 0, sizeof(inode));
-	err = ext2fs_read_inode_full(fs, ino, (struct ext2_inode *)&inode,
+	err = ext2fs_read_inode_full(fs, ino, EXT2_INODE(&inode),
 				     sizeof(inode));
 	if (err)
 		return translate_error(fs, ino, err);
@@ -389,7 +389,7 @@ static int update_atime(ext2_filsys fs, ext2_ino_t ino)
 		return 0;
 	EXT4_INODE_SET_XTIME(i_atime, &now, &inode);
 
-	err = ext2fs_write_inode_full(fs, ino, (struct ext2_inode *)&inode,
+	err = ext2fs_write_inode_full(fs, ino, EXT2_INODE(&inode),
 				      sizeof(inode));
 	if (err)
 		return translate_error(fs, ino, err);
@@ -413,7 +413,7 @@ static int update_mtime(ext2_filsys fs, ext2_ino_t ino,
 	}
 
 	memset(&inode, 0, sizeof(inode));
-	err = ext2fs_read_inode_full(fs, ino, (struct ext2_inode *)&inode,
+	err = ext2fs_read_inode_full(fs, ino, EXT2_INODE(&inode),
 				     sizeof(inode));
 	if (err)
 		return translate_error(fs, ino, err);
@@ -423,7 +423,7 @@ static int update_mtime(ext2_filsys fs, ext2_ino_t ino,
 	EXT4_INODE_SET_XTIME(i_ctime, &now, &inode);
 	increment_version(&inode);
 
-	err = ext2fs_write_inode_full(fs, ino, (struct ext2_inode *)&inode,
+	err = ext2fs_write_inode_full(fs, ino, EXT2_INODE(&inode),
 				      sizeof(inode));
 	if (err)
 		return translate_error(fs, ino, err);
@@ -726,7 +726,7 @@ static int stat_inode(ext2_filsys fs, ext2_ino_t ino, struct stat *statbuf)
 	struct timespec tv;
 
 	memset(&inode, 0, sizeof(inode));
-	err = ext2fs_read_inode_full(fs, ino, (struct ext2_inode *)&inode,
+	err = ext2fs_read_inode_full(fs, ino, EXT2_INODE(&inode),
 				     sizeof(inode));
 	if (err)
 		return translate_error(fs, ino, err);
@@ -741,7 +741,7 @@ static int stat_inode(ext2_filsys fs, ext2_ino_t ino, struct stat *statbuf)
 	statbuf->st_size = EXT2_I_SIZE(&inode);
 	statbuf->st_blksize = fs->blocksize;
 	statbuf->st_blocks = ext2fs_get_stat_i_blocks(fs,
-						(struct ext2_inode *)&inode);
+						EXT2_INODE(&inode));
 	EXT4_INODE_GET_XTIME(i_atime, &tv, &inode);
 	statbuf->st_atime = tv.tv_sec;
 	statbuf->st_atim.tv_nsec = tv.tv_nsec;
@@ -1062,7 +1062,7 @@ static int op_mknod(const char *path, mode_t mode, dev_t dev)
 	inode.i_gid = ctxt->gid;
 	ext2fs_set_i_gid_high(inode, ctxt->gid >> 16);
 
-	err = ext2fs_write_new_inode(fs, child, (struct ext2_inode *)&inode);
+	err = ext2fs_write_new_inode(fs, child, EXT2_INODE(&inode));
 	if (err) {
 		ret = translate_error(fs, child, err);
 		goto out2;
@@ -1070,7 +1070,7 @@ static int op_mknod(const char *path, mode_t mode, dev_t dev)
 
 	inode.i_generation = ff->next_generation++;
 	init_times(&inode);
-	err = ext2fs_write_inode_full(fs, child, (struct ext2_inode *)&inode,
+	err = ext2fs_write_inode_full(fs, child, EXT2_INODE(&inode),
 				      sizeof(inode));
 	if (err) {
 		ret = translate_error(fs, child, err);
@@ -1139,7 +1139,7 @@ static int op_mkdir(const char *path, mode_t mode)
 		goto out2;
 
 	/* Is the parent dir sgid? */
-	err = ext2fs_read_inode_full(fs, parent, (struct ext2_inode *)&inode,
+	err = ext2fs_read_inode_full(fs, parent, EXT2_INODE(&inode),
 				     sizeof(inode));
 	if (err) {
 		ret = translate_error(fs, parent, err);
@@ -1179,7 +1179,7 @@ static int op_mkdir(const char *path, mode_t mode)
 		   node_name, parent);
 
 	memset(&inode, 0, sizeof(inode));
-	err = ext2fs_read_inode_full(fs, child, (struct ext2_inode *)&inode,
+	err = ext2fs_read_inode_full(fs, child, EXT2_INODE(&inode),
 				     sizeof(inode));
 	if (err) {
 		ret = translate_error(fs, child, err);
@@ -1195,7 +1195,7 @@ static int op_mkdir(const char *path, mode_t mode)
 	inode.i_generation = ff->next_generation++;
 	init_times(&inode);
 
-	err = ext2fs_write_inode_full(fs, child, (struct ext2_inode *)&inode,
+	err = ext2fs_write_inode_full(fs, child, EXT2_INODE(&inode),
 				      sizeof(inode));
 	if (err) {
 		ret = translate_error(fs, child, err);
@@ -1211,7 +1211,7 @@ static int op_mkdir(const char *path, mode_t mode)
 		ret = translate_error(fs, child, err);
 		goto out2;
 	}
-	err = ext2fs_bmap2(fs, child, (struct ext2_inode *)&inode, NULL, 0, 0,
+	err = ext2fs_bmap2(fs, child, EXT2_INODE(&inode), NULL, 0, 0,
 			   NULL, &blk);
 	if (err) {
 		ret = translate_error(fs, child, err);
@@ -1317,7 +1317,7 @@ static int remove_inode(struct fuse2fs *ff, ext2_ino_t ino)
 	int ret = 0;
 
 	memset(&inode, 0, sizeof(inode));
-	err = ext2fs_read_inode_full(fs, ino, (struct ext2_inode *)&inode,
+	err = ext2fs_read_inode_full(fs, ino, EXT2_INODE(&inode),
 				     sizeof(inode));
 	if (err) {
 		ret = translate_error(fs, ino, err);
@@ -1355,8 +1355,8 @@ static int remove_inode(struct fuse2fs *ff, ext2_ino_t ino)
 	if (err)
 		goto write_out;
 
-	if (ext2fs_inode_has_valid_blocks2(fs, (struct ext2_inode *)&inode)) {
-		err = ext2fs_punch(fs, ino, (struct ext2_inode *)&inode, NULL,
+	if (ext2fs_inode_has_valid_blocks2(fs, EXT2_INODE(&inode))) {
+		err = ext2fs_punch(fs, ino, EXT2_INODE(&inode), NULL,
 				   0, ~0ULL);
 		if (err) {
 			ret = translate_error(fs, ino, err);
@@ -1368,7 +1368,7 @@ static int remove_inode(struct fuse2fs *ff, ext2_ino_t ino)
 				  LINUX_S_ISDIR(inode.i_mode));
 
 write_out:
-	err = ext2fs_write_inode_full(fs, ino, (struct ext2_inode *)&inode,
+	err = ext2fs_write_inode_full(fs, ino, EXT2_INODE(&inode),
 				      sizeof(inode));
 	if (err) {
 		ret = translate_error(fs, ino, err);
@@ -1506,7 +1506,7 @@ static int __op_rmdir(struct fuse2fs *ff, const char *path)
 		dbg_printf(ff, "%s: decr dir=%d link count\n", __func__,
 			   rds.parent);
 		err = ext2fs_read_inode_full(fs, rds.parent,
-					     (struct ext2_inode *)&inode,
+					     EXT2_INODE(&inode),
 					     sizeof(inode));
 		if (err) {
 			ret = translate_error(fs, rds.parent, err);
@@ -1518,7 +1518,7 @@ static int __op_rmdir(struct fuse2fs *ff, const char *path)
 		if (ret)
 			goto out;
 		err = ext2fs_write_inode_full(fs, rds.parent,
-					      (struct ext2_inode *)&inode,
+					      EXT2_INODE(&inode),
 					      sizeof(inode));
 		if (err) {
 			ret = translate_error(fs, rds.parent, err);
@@ -1618,7 +1618,7 @@ static int op_symlink(const char *src, const char *dest)
 		   child, node_name, parent);
 
 	memset(&inode, 0, sizeof(inode));
-	err = ext2fs_read_inode_full(fs, child, (struct ext2_inode *)&inode,
+	err = ext2fs_read_inode_full(fs, child, EXT2_INODE(&inode),
 				     sizeof(inode));
 	if (err) {
 		ret = translate_error(fs, child, err);
@@ -1632,7 +1632,7 @@ static int op_symlink(const char *src, const char *dest)
 	inode.i_generation = ff->next_generation++;
 	init_times(&inode);
 
-	err = ext2fs_write_inode_full(fs, child, (struct ext2_inode *)&inode,
+	err = ext2fs_write_inode_full(fs, child, EXT2_INODE(&inode),
 				      sizeof(inode));
 	if (err) {
 		ret = translate_error(fs, child, err);
@@ -1967,7 +1967,7 @@ static int op_link(const char *src, const char *dest)
 	}
 
 	memset(&inode, 0, sizeof(inode));
-	err = ext2fs_read_inode_full(fs, ino, (struct ext2_inode *)&inode,
+	err = ext2fs_read_inode_full(fs, ino, EXT2_INODE(&inode),
 				     sizeof(inode));
 	if (err) {
 		ret = translate_error(fs, ino, err);
@@ -1983,7 +1983,7 @@ static int op_link(const char *src, const char *dest)
 	if (ret)
 		goto out2;
 
-	err = ext2fs_write_inode_full(fs, ino, (struct ext2_inode *)&inode,
+	err = ext2fs_write_inode_full(fs, ino, EXT2_INODE(&inode),
 				      sizeof(inode));
 	if (err) {
 		ret = translate_error(fs, ino, err);
@@ -2109,7 +2109,7 @@ static int op_chmod(const char *path, mode_t mode
 	dbg_printf(ff, "%s: path=%s mode=0%o ino=%d\n", __func__, path, mode, ino);
 
 	memset(&inode, 0, sizeof(inode));
-	err = ext2fs_read_inode_full(fs, ino, (struct ext2_inode *)&inode,
+	err = ext2fs_read_inode_full(fs, ino, EXT2_INODE(&inode),
 				     sizeof(inode));
 	if (err) {
 		ret = translate_error(fs, ino, err);
@@ -2149,7 +2149,7 @@ static int op_chmod(const char *path, mode_t mode
 	if (ret)
 		goto out;
 
-	err = ext2fs_write_inode_full(fs, ino, (struct ext2_inode *)&inode,
+	err = ext2fs_write_inode_full(fs, ino, EXT2_INODE(&inode),
 				      sizeof(inode));
 	if (err) {
 		ret = translate_error(fs, ino, err);
@@ -2187,7 +2187,7 @@ static int op_chown(const char *path, uid_t owner, gid_t group
 		   path, owner, group, ino);
 
 	memset(&inode, 0, sizeof(inode));
-	err = ext2fs_read_inode_full(fs, ino, (struct ext2_inode *)&inode,
+	err = ext2fs_read_inode_full(fs, ino, EXT2_INODE(&inode),
 				     sizeof(inode));
 	if (err) {
 		ret = translate_error(fs, ino, err);
@@ -2227,7 +2227,7 @@ static int op_chown(const char *path, uid_t owner, gid_t group
 	if (ret)
 		goto out;
 
-	err = ext2fs_write_inode_full(fs, ino, (struct ext2_inode *)&inode,
+	err = ext2fs_write_inode_full(fs, ino, EXT2_INODE(&inode),
 				      sizeof(inode));
 	if (err) {
 		ret = translate_error(fs, ino, err);
@@ -3282,13 +3282,13 @@ static int op_create(const char *path, mode_t mode, struct fuse_file_info *fp)
 
 		inode.i_flags &= ~EXT4_EXTENTS_FL;
 		ret = ext2fs_extent_open2(fs, child,
-					  (struct ext2_inode *)&inode, &handle);
+					  EXT2_INODE(&inode), &handle);
 		if (ret)
 			return ret;
 		ext2fs_extent_free(handle);
 	}
 
-	err = ext2fs_write_new_inode(fs, child, (struct ext2_inode *)&inode);
+	err = ext2fs_write_new_inode(fs, child, EXT2_INODE(&inode));
 	if (err) {
 		ret = translate_error(fs, child, err);
 		goto out2;
@@ -3296,7 +3296,7 @@ static int op_create(const char *path, mode_t mode, struct fuse_file_info *fp)
 
 	inode.i_generation = ff->next_generation++;
 	init_times(&inode);
-	err = ext2fs_write_inode_full(fs, child, (struct ext2_inode *)&inode,
+	err = ext2fs_write_inode_full(fs, child, EXT2_INODE(&inode),
 				      sizeof(inode));
 	if (err) {
 		ret = translate_error(fs, child, err);
@@ -3435,7 +3435,7 @@ static int op_utimens(const char *path, const struct timespec ctv[2]
 		goto out;
 
 	memset(&inode, 0, sizeof(inode));
-	err = ext2fs_read_inode_full(fs, ino, (struct ext2_inode *)&inode,
+	err = ext2fs_read_inode_full(fs, ino, EXT2_INODE(&inode),
 				     sizeof(inode));
 	if (err) {
 		ret = translate_error(fs, ino, err);
@@ -3460,7 +3460,7 @@ static int op_utimens(const char *path, const struct timespec ctv[2]
 	if (ret)
 		goto out;
 
-	err = ext2fs_write_inode_full(fs, ino, (struct ext2_inode *)&inode,
+	err = ext2fs_write_inode_full(fs, ino, EXT2_INODE(&inode),
 				      sizeof(inode));
 	if (err) {
 		ret = translate_error(fs, ino, err);
@@ -3497,7 +3497,7 @@ static int ioctl_getflags(struct fuse2fs *ff, struct fuse2fs_file_handle *fh,
 	FUSE2FS_CHECK_MAGIC(fs, fh, FUSE2FS_FILE_MAGIC);
 	dbg_printf(ff, "%s: ino=%d\n", __func__, fh->ino);
 	memset(&inode, 0, sizeof(inode));
-	err = ext2fs_read_inode_full(fs, fh->ino, (struct ext2_inode *)&inode,
+	err = ext2fs_read_inode_full(fs, fh->ino, EXT2_INODE(&inode),
 				     sizeof(inode));
 	if (err)
 		return translate_error(fs, fh->ino, err);
@@ -3519,7 +3519,7 @@ static int ioctl_setflags(struct fuse2fs *ff, struct fuse2fs_file_handle *fh,
 	FUSE2FS_CHECK_MAGIC(fs, fh, FUSE2FS_FILE_MAGIC);
 	dbg_printf(ff, "%s: ino=%d\n", __func__, fh->ino);
 	memset(&inode, 0, sizeof(inode));
-	err = ext2fs_read_inode_full(fs, fh->ino, (struct ext2_inode *)&inode,
+	err = ext2fs_read_inode_full(fs, fh->ino, EXT2_INODE(&inode),
 				     sizeof(inode));
 	if (err)
 		return translate_error(fs, fh->ino, err);
@@ -3535,7 +3535,7 @@ static int ioctl_setflags(struct fuse2fs *ff, struct fuse2fs_file_handle *fh,
 	if (ret)
 		return ret;
 
-	err = ext2fs_write_inode_full(fs, fh->ino, (struct ext2_inode *)&inode,
+	err = ext2fs_write_inode_full(fs, fh->ino, EXT2_INODE(&inode),
 				      sizeof(inode));
 	if (err)
 		return translate_error(fs, fh->ino, err);
@@ -3553,7 +3553,7 @@ static int ioctl_getversion(struct fuse2fs *ff, struct fuse2fs_file_handle *fh,
 	FUSE2FS_CHECK_MAGIC(fs, fh, FUSE2FS_FILE_MAGIC);
 	dbg_printf(ff, "%s: ino=%d\n", __func__, fh->ino);
 	memset(&inode, 0, sizeof(inode));
-	err = ext2fs_read_inode_full(fs, fh->ino, (struct ext2_inode *)&inode,
+	err = ext2fs_read_inode_full(fs, fh->ino, EXT2_INODE(&inode),
 				     sizeof(inode));
 	if (err)
 		return translate_error(fs, fh->ino, err);
@@ -3575,7 +3575,7 @@ static int ioctl_setversion(struct fuse2fs *ff, struct fuse2fs_file_handle *fh,
 	FUSE2FS_CHECK_MAGIC(fs, fh, FUSE2FS_FILE_MAGIC);
 	dbg_printf(ff, "%s: ino=%d\n", __func__, fh->ino);
 	memset(&inode, 0, sizeof(inode));
-	err = ext2fs_read_inode_full(fs, fh->ino, (struct ext2_inode *)&inode,
+	err = ext2fs_read_inode_full(fs, fh->ino, EXT2_INODE(&inode),
 				     sizeof(inode));
 	if (err)
 		return translate_error(fs, fh->ino, err);
@@ -3589,7 +3589,7 @@ static int ioctl_setversion(struct fuse2fs *ff, struct fuse2fs_file_handle *fh,
 	if (ret)
 		return ret;
 
-	err = ext2fs_write_inode_full(fs, fh->ino, (struct ext2_inode *)&inode,
+	err = ext2fs_write_inode_full(fs, fh->ino, EXT2_INODE(&inode),
 				      sizeof(inode));
 	if (err)
 		return translate_error(fs, fh->ino, err);
@@ -3632,7 +3632,7 @@ static int ioctl_fsgetxattr(struct fuse2fs *ff, struct fuse2fs_file_handle *fh,
 	FUSE2FS_CHECK_MAGIC(fs, fh, FUSE2FS_FILE_MAGIC);
 	dbg_printf(ff, "%s: ino=%d\n", __func__, fh->ino);
 	memset(&inode, 0, sizeof(inode));
-	err = ext2fs_read_inode_full(fs, fh->ino, (struct ext2_inode *)&inode,
+	err = ext2fs_read_inode_full(fs, fh->ino, EXT2_INODE(&inode),
 				     sizeof(inode));
 	if (err)
 		return translate_error(fs, fh->ino, err);
@@ -3681,7 +3681,7 @@ static int ioctl_fssetxattr(struct fuse2fs *ff, struct fuse2fs_file_handle *fh,
 	FUSE2FS_CHECK_MAGIC(fs, fh, FUSE2FS_FILE_MAGIC);
 	dbg_printf(ff, "%s: ino=%d\n", __func__, fh->ino);
 	memset(&inode, 0, sizeof(inode));
-	err = ext2fs_read_inode_full(fs, fh->ino, (struct ext2_inode *)&inode,
+	err = ext2fs_read_inode_full(fs, fh->ino, EXT2_INODE(&inode),
 				     sizeof(inode));
 	if (err)
 		return translate_error(fs, fh->ino, err);
@@ -3701,7 +3701,7 @@ static int ioctl_fssetxattr(struct fuse2fs *ff, struct fuse2fs_file_handle *fh,
 	if (ret)
 		return ret;
 
-	err = ext2fs_write_inode_full(fs, fh->ino, (struct ext2_inode *)&inode,
+	err = ext2fs_write_inode_full(fs, fh->ino, EXT2_INODE(&inode),
 				      sizeof(inode));
 	if (err)
 		return translate_error(fs, fh->ino, err);
@@ -3897,7 +3897,7 @@ static int fallocate_helper(struct fuse_file_info *fp, int mode, off_t offset,
 		return -ENOSPC;
 
 	memset(&inode, 0, sizeof(inode));
-	err = ext2fs_read_inode_full(fs, fh->ino, (struct ext2_inode *)&inode,
+	err = ext2fs_read_inode_full(fs, fh->ino, EXT2_INODE(&inode),
 				     sizeof(inode));
 	if (err)
 		return err;
@@ -3907,7 +3907,7 @@ static int fallocate_helper(struct fuse_file_info *fp, int mode, off_t offset,
 	flags = (mode & FL_KEEP_SIZE_FLAG ? 0 :
 			EXT2_FALLOCATE_INIT_BEYOND_EOF);
 	err = ext2fs_fallocate(fs, flags, fh->ino,
-			       (struct ext2_inode *)&inode,
+			       EXT2_INODE(&inode),
 			       ~0ULL, start, end - start + 1);
 	if (err && err != EXT2_ET_BLOCK_ALLOC_FAIL)
 		return translate_error(fs, fh->ino, err);
@@ -3916,7 +3916,7 @@ static int fallocate_helper(struct fuse_file_info *fp, int mode, off_t offset,
 	if (!(mode & FL_KEEP_SIZE_FLAG)) {
 		if ((__u64) offset + len > fsize) {
 			err = ext2fs_inode_size_set(fs,
-						(struct ext2_inode *)&inode,
+						EXT2_INODE(&inode),
 						offset + len);
 			if (err)
 				return translate_error(fs, fh->ino, err);
@@ -3927,7 +3927,7 @@ static int fallocate_helper(struct fuse_file_info *fp, int mode, off_t offset,
 	if (err)
 		return err;
 
-	err = ext2fs_write_inode_full(fs, fh->ino, (struct ext2_inode *)&inode,
+	err = ext2fs_write_inode_full(fs, fh->ino, EXT2_INODE(&inode),
 				      sizeof(inode));
 	if (err)
 		return translate_error(fs, fh->ino, err);
@@ -3954,7 +3954,7 @@ static errcode_t clean_block_middle(ext2_filsys fs, ext2_ino_t ino,
 			return err;
 	}
 
-	err = ext2fs_bmap2(fs, ino, (struct ext2_inode *)inode, *buf, 0,
+	err = ext2fs_bmap2(fs, ino, EXT2_INODE(inode), *buf, 0,
 			   offset / fs->blocksize, &retflags, &blk);
 	if (err)
 		return err;
@@ -3989,7 +3989,7 @@ static errcode_t clean_block_edge(ext2_filsys fs, ext2_ino_t ino,
 			return err;
 	}
 
-	err = ext2fs_bmap2(fs, ino, (struct ext2_inode *)inode, *buf, 0,
+	err = ext2fs_bmap2(fs, ino, EXT2_INODE(inode), *buf, 0,
 			   offset / fs->blocksize, &retflags, &blk);
 	if (err)
 		return err;
@@ -4037,7 +4037,7 @@ static int punch_helper(struct fuse_file_info *fp, int mode, off_t offset,
 		   fh->ino, mode, start, end);
 
 	memset(&inode, 0, sizeof(inode));
-	err = ext2fs_read_inode_full(fs, fh->ino, (struct ext2_inode *)&inode,
+	err = ext2fs_read_inode_full(fs, fh->ino, EXT2_INODE(&inode),
 				     sizeof(inode));
 	if (err)
 		return translate_error(fs, fh->ino, err);
@@ -4059,7 +4059,7 @@ static int punch_helper(struct fuse_file_info *fp, int mode, off_t offset,
 
 	/* Unmap full blocks in the middle */
 	if (start <= end) {
-		err = ext2fs_punch(fs, fh->ino, (struct ext2_inode *)&inode,
+		err = ext2fs_punch(fs, fh->ino, EXT2_INODE(&inode),
 				   NULL, start, end);
 		if (err)
 			return translate_error(fs, fh->ino, err);
@@ -4069,7 +4069,7 @@ static int punch_helper(struct fuse_file_info *fp, int mode, off_t offset,
 	if (err)
 		return err;
 
-	err = ext2fs_write_inode_full(fs, fh->ino, (struct ext2_inode *)&inode,
+	err = ext2fs_write_inode_full(fs, fh->ino, EXT2_INODE(&inode),
 				      sizeof(inode));
 	if (err)
 		return translate_error(fs, fh->ino, err);


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [PATCH 2/3] fuse2fs: simplify reading and writing inodes
  2025-05-21 22:34 [PATCHSET 2/6] fuse2fs: various filewide cleanups Darrick J. Wong
  2025-05-21 22:42 ` [PATCH 1/3] fuse2fs: clean up open-coded ext2_inode_large -> ext2_inode casts Darrick J. Wong
@ 2025-05-21 22:43 ` Darrick J. Wong
  2025-05-21 22:43 ` [PATCH 3/3] fuse2fs: implement blocksize converters Darrick J. Wong
  2025-05-23 14:28 ` [PATCHSET 2/6] fuse2fs: various filewide cleanups Theodore Ts'o
  3 siblings, 0 replies; 5+ messages in thread
From: Darrick J. Wong @ 2025-05-21 22:43 UTC (permalink / raw)
  To: tytso; +Cc: linux-ext4

From: Darrick J. Wong <djwong@kernel.org>

Wrap the inode read and write methods in a wrapper so that we don't have
to maintain all these silly casts and sizeof operators.

Signed-off-by: "Darrick J. Wong" <djwong@kernel.org>
---
 misc/fuse2fs.c |  153 ++++++++++++++++++++------------------------------------
 1 file changed, 54 insertions(+), 99 deletions(-)


diff --git a/misc/fuse2fs.c b/misc/fuse2fs.c
index 6921e6dc0a356c..a89ba115bf6f42 100644
--- a/misc/fuse2fs.c
+++ b/misc/fuse2fs.c
@@ -293,6 +293,21 @@ do {									       \
 		(timespec)->tv_nsec = 0;				       \
 } while (0)
 
+static inline errcode_t fuse2fs_read_inode(ext2_filsys fs, ext2_ino_t ino,
+					   struct ext2_inode_large *inode)
+{
+	memset(inode, 0, sizeof(*inode));
+	return ext2fs_read_inode_full(fs, ino, EXT2_INODE(inode),
+				      sizeof(*inode));
+}
+
+static inline errcode_t fuse2fs_write_inode(ext2_filsys fs, ext2_ino_t ino,
+					    struct ext2_inode_large *inode)
+{
+	return ext2fs_write_inode_full(fs, ino, EXT2_INODE(inode),
+				       sizeof(*inode));
+}
+
 static void get_now(struct timespec *now)
 {
 #ifdef CLOCK_REALTIME
@@ -346,17 +361,14 @@ static int update_ctime(ext2_filsys fs, ext2_ino_t ino,
 	}
 
 	/* Otherwise we have to read-modify-write the inode */
-	memset(&inode, 0, sizeof(inode));
-	err = ext2fs_read_inode_full(fs, ino, EXT2_INODE(&inode),
-				     sizeof(inode));
+	err = fuse2fs_read_inode(fs, ino, &inode);
 	if (err)
 		return translate_error(fs, ino, err);
 
 	increment_version(&inode);
 	EXT4_INODE_SET_XTIME(i_ctime, &now, &inode);
 
-	err = ext2fs_write_inode_full(fs, ino, EXT2_INODE(&inode),
-				      sizeof(inode));
+	err = fuse2fs_write_inode(fs, ino, &inode);
 	if (err)
 		return translate_error(fs, ino, err);
 
@@ -371,9 +383,7 @@ static int update_atime(ext2_filsys fs, ext2_ino_t ino)
 
 	if (!(fs->flags & EXT2_FLAG_RW))
 		return 0;
-	memset(&inode, 0, sizeof(inode));
-	err = ext2fs_read_inode_full(fs, ino, EXT2_INODE(&inode),
-				     sizeof(inode));
+	err = fuse2fs_read_inode(fs, ino, &inode);
 	if (err)
 		return translate_error(fs, ino, err);
 
@@ -389,8 +399,7 @@ static int update_atime(ext2_filsys fs, ext2_ino_t ino)
 		return 0;
 	EXT4_INODE_SET_XTIME(i_atime, &now, &inode);
 
-	err = ext2fs_write_inode_full(fs, ino, EXT2_INODE(&inode),
-				      sizeof(inode));
+	err = fuse2fs_write_inode(fs, ino, &inode);
 	if (err)
 		return translate_error(fs, ino, err);
 
@@ -412,9 +421,7 @@ static int update_mtime(ext2_filsys fs, ext2_ino_t ino,
 		return 0;
 	}
 
-	memset(&inode, 0, sizeof(inode));
-	err = ext2fs_read_inode_full(fs, ino, EXT2_INODE(&inode),
-				     sizeof(inode));
+	err = fuse2fs_read_inode(fs, ino, &inode);
 	if (err)
 		return translate_error(fs, ino, err);
 
@@ -423,8 +430,7 @@ static int update_mtime(ext2_filsys fs, ext2_ino_t ino,
 	EXT4_INODE_SET_XTIME(i_ctime, &now, &inode);
 	increment_version(&inode);
 
-	err = ext2fs_write_inode_full(fs, ino, EXT2_INODE(&inode),
-				      sizeof(inode));
+	err = fuse2fs_write_inode(fs, ino, &inode);
 	if (err)
 		return translate_error(fs, ino, err);
 
@@ -725,9 +731,7 @@ static int stat_inode(ext2_filsys fs, ext2_ino_t ino, struct stat *statbuf)
 	int ret = 0;
 	struct timespec tv;
 
-	memset(&inode, 0, sizeof(inode));
-	err = ext2fs_read_inode_full(fs, ino, EXT2_INODE(&inode),
-				     sizeof(inode));
+	err = fuse2fs_read_inode(fs, ino, &inode);
 	if (err)
 		return translate_error(fs, ino, err);
 
@@ -1070,8 +1074,7 @@ static int op_mknod(const char *path, mode_t mode, dev_t dev)
 
 	inode.i_generation = ff->next_generation++;
 	init_times(&inode);
-	err = ext2fs_write_inode_full(fs, child, EXT2_INODE(&inode),
-				      sizeof(inode));
+	err = fuse2fs_write_inode(fs, child, &inode);
 	if (err) {
 		ret = translate_error(fs, child, err);
 		goto out2;
@@ -1139,8 +1142,7 @@ static int op_mkdir(const char *path, mode_t mode)
 		goto out2;
 
 	/* Is the parent dir sgid? */
-	err = ext2fs_read_inode_full(fs, parent, EXT2_INODE(&inode),
-				     sizeof(inode));
+	err = fuse2fs_read_inode(fs, parent, &inode);
 	if (err) {
 		ret = translate_error(fs, parent, err);
 		goto out2;
@@ -1178,9 +1180,7 @@ static int op_mkdir(const char *path, mode_t mode)
 	dbg_printf(ff, "%s: created ino=%d/path=%s in dir=%d\n", __func__, child,
 		   node_name, parent);
 
-	memset(&inode, 0, sizeof(inode));
-	err = ext2fs_read_inode_full(fs, child, EXT2_INODE(&inode),
-				     sizeof(inode));
+	err = fuse2fs_read_inode(fs, child, &inode);
 	if (err) {
 		ret = translate_error(fs, child, err);
 		goto out2;
@@ -1195,8 +1195,7 @@ static int op_mkdir(const char *path, mode_t mode)
 	inode.i_generation = ff->next_generation++;
 	init_times(&inode);
 
-	err = ext2fs_write_inode_full(fs, child, EXT2_INODE(&inode),
-				      sizeof(inode));
+	err = fuse2fs_write_inode(fs, child, &inode);
 	if (err) {
 		ret = translate_error(fs, child, err);
 		goto out2;
@@ -1316,9 +1315,7 @@ static int remove_inode(struct fuse2fs *ff, ext2_ino_t ino)
 	struct ext2_inode_large inode;
 	int ret = 0;
 
-	memset(&inode, 0, sizeof(inode));
-	err = ext2fs_read_inode_full(fs, ino, EXT2_INODE(&inode),
-				     sizeof(inode));
+	err = fuse2fs_read_inode(fs, ino, &inode);
 	if (err) {
 		ret = translate_error(fs, ino, err);
 		goto out;
@@ -1368,8 +1365,7 @@ static int remove_inode(struct fuse2fs *ff, ext2_ino_t ino)
 				  LINUX_S_ISDIR(inode.i_mode));
 
 write_out:
-	err = ext2fs_write_inode_full(fs, ino, EXT2_INODE(&inode),
-				      sizeof(inode));
+	err = fuse2fs_write_inode(fs, ino, &inode);
 	if (err) {
 		ret = translate_error(fs, ino, err);
 		goto out;
@@ -1505,9 +1501,7 @@ static int __op_rmdir(struct fuse2fs *ff, const char *path)
 	if (rds.parent) {
 		dbg_printf(ff, "%s: decr dir=%d link count\n", __func__,
 			   rds.parent);
-		err = ext2fs_read_inode_full(fs, rds.parent,
-					     EXT2_INODE(&inode),
-					     sizeof(inode));
+		err = fuse2fs_read_inode(fs, rds.parent, &inode);
 		if (err) {
 			ret = translate_error(fs, rds.parent, err);
 			goto out;
@@ -1517,9 +1511,7 @@ static int __op_rmdir(struct fuse2fs *ff, const char *path)
 		ret = update_mtime(fs, rds.parent, &inode);
 		if (ret)
 			goto out;
-		err = ext2fs_write_inode_full(fs, rds.parent,
-					      EXT2_INODE(&inode),
-					      sizeof(inode));
+		err = fuse2fs_write_inode(fs, rds.parent, &inode);
 		if (err) {
 			ret = translate_error(fs, rds.parent, err);
 			goto out;
@@ -1617,9 +1609,7 @@ static int op_symlink(const char *src, const char *dest)
 	dbg_printf(ff, "%s: symlinking ino=%d/name=%s to dir=%d\n", __func__,
 		   child, node_name, parent);
 
-	memset(&inode, 0, sizeof(inode));
-	err = ext2fs_read_inode_full(fs, child, EXT2_INODE(&inode),
-				     sizeof(inode));
+	err = fuse2fs_read_inode(fs, child, &inode);
 	if (err) {
 		ret = translate_error(fs, child, err);
 		goto out2;
@@ -1632,8 +1622,7 @@ static int op_symlink(const char *src, const char *dest)
 	inode.i_generation = ff->next_generation++;
 	init_times(&inode);
 
-	err = ext2fs_write_inode_full(fs, child, EXT2_INODE(&inode),
-				      sizeof(inode));
+	err = fuse2fs_write_inode(fs, child, &inode);
 	if (err) {
 		ret = translate_error(fs, child, err);
 		goto out2;
@@ -1966,9 +1955,7 @@ static int op_link(const char *src, const char *dest)
 		goto out2;
 	}
 
-	memset(&inode, 0, sizeof(inode));
-	err = ext2fs_read_inode_full(fs, ino, EXT2_INODE(&inode),
-				     sizeof(inode));
+	err = fuse2fs_read_inode(fs, ino, &inode);
 	if (err) {
 		ret = translate_error(fs, ino, err);
 		goto out2;
@@ -1983,8 +1970,7 @@ static int op_link(const char *src, const char *dest)
 	if (ret)
 		goto out2;
 
-	err = ext2fs_write_inode_full(fs, ino, EXT2_INODE(&inode),
-				      sizeof(inode));
+	err = fuse2fs_write_inode(fs, ino, &inode);
 	if (err) {
 		ret = translate_error(fs, ino, err);
 		goto out2;
@@ -2108,9 +2094,7 @@ static int op_chmod(const char *path, mode_t mode
 	}
 	dbg_printf(ff, "%s: path=%s mode=0%o ino=%d\n", __func__, path, mode, ino);
 
-	memset(&inode, 0, sizeof(inode));
-	err = ext2fs_read_inode_full(fs, ino, EXT2_INODE(&inode),
-				     sizeof(inode));
+	err = fuse2fs_read_inode(fs, ino, &inode);
 	if (err) {
 		ret = translate_error(fs, ino, err);
 		goto out;
@@ -2149,8 +2133,7 @@ static int op_chmod(const char *path, mode_t mode
 	if (ret)
 		goto out;
 
-	err = ext2fs_write_inode_full(fs, ino, EXT2_INODE(&inode),
-				      sizeof(inode));
+	err = fuse2fs_write_inode(fs, ino, &inode);
 	if (err) {
 		ret = translate_error(fs, ino, err);
 		goto out;
@@ -2186,9 +2169,7 @@ static int op_chown(const char *path, uid_t owner, gid_t group
 	dbg_printf(ff, "%s: path=%s owner=%d group=%d ino=%d\n", __func__,
 		   path, owner, group, ino);
 
-	memset(&inode, 0, sizeof(inode));
-	err = ext2fs_read_inode_full(fs, ino, EXT2_INODE(&inode),
-				     sizeof(inode));
+	err = fuse2fs_read_inode(fs, ino, &inode);
 	if (err) {
 		ret = translate_error(fs, ino, err);
 		goto out;
@@ -2227,8 +2208,7 @@ static int op_chown(const char *path, uid_t owner, gid_t group
 	if (ret)
 		goto out;
 
-	err = ext2fs_write_inode_full(fs, ino, EXT2_INODE(&inode),
-				      sizeof(inode));
+	err = fuse2fs_write_inode(fs, ino, &inode);
 	if (err) {
 		ret = translate_error(fs, ino, err);
 		goto out;
@@ -3296,8 +3276,7 @@ static int op_create(const char *path, mode_t mode, struct fuse_file_info *fp)
 
 	inode.i_generation = ff->next_generation++;
 	init_times(&inode);
-	err = ext2fs_write_inode_full(fs, child, EXT2_INODE(&inode),
-				      sizeof(inode));
+	err = fuse2fs_write_inode(fs, child, &inode);
 	if (err) {
 		ret = translate_error(fs, child, err);
 		goto out2;
@@ -3434,9 +3413,7 @@ static int op_utimens(const char *path, const struct timespec ctv[2]
 	if (ret)
 		goto out;
 
-	memset(&inode, 0, sizeof(inode));
-	err = ext2fs_read_inode_full(fs, ino, EXT2_INODE(&inode),
-				     sizeof(inode));
+	err = fuse2fs_read_inode(fs, ino, &inode);
 	if (err) {
 		ret = translate_error(fs, ino, err);
 		goto out;
@@ -3460,8 +3437,7 @@ static int op_utimens(const char *path, const struct timespec ctv[2]
 	if (ret)
 		goto out;
 
-	err = ext2fs_write_inode_full(fs, ino, EXT2_INODE(&inode),
-				      sizeof(inode));
+	err = fuse2fs_write_inode(fs, ino, &inode);
 	if (err) {
 		ret = translate_error(fs, ino, err);
 		goto out;
@@ -3496,9 +3472,7 @@ static int ioctl_getflags(struct fuse2fs *ff, struct fuse2fs_file_handle *fh,
 
 	FUSE2FS_CHECK_MAGIC(fs, fh, FUSE2FS_FILE_MAGIC);
 	dbg_printf(ff, "%s: ino=%d\n", __func__, fh->ino);
-	memset(&inode, 0, sizeof(inode));
-	err = ext2fs_read_inode_full(fs, fh->ino, EXT2_INODE(&inode),
-				     sizeof(inode));
+	err = fuse2fs_read_inode(fs, fh->ino, &inode);
 	if (err)
 		return translate_error(fs, fh->ino, err);
 
@@ -3518,9 +3492,7 @@ static int ioctl_setflags(struct fuse2fs *ff, struct fuse2fs_file_handle *fh,
 
 	FUSE2FS_CHECK_MAGIC(fs, fh, FUSE2FS_FILE_MAGIC);
 	dbg_printf(ff, "%s: ino=%d\n", __func__, fh->ino);
-	memset(&inode, 0, sizeof(inode));
-	err = ext2fs_read_inode_full(fs, fh->ino, EXT2_INODE(&inode),
-				     sizeof(inode));
+	err = fuse2fs_read_inode(fs, fh->ino, &inode);
 	if (err)
 		return translate_error(fs, fh->ino, err);
 
@@ -3535,8 +3507,7 @@ static int ioctl_setflags(struct fuse2fs *ff, struct fuse2fs_file_handle *fh,
 	if (ret)
 		return ret;
 
-	err = ext2fs_write_inode_full(fs, fh->ino, EXT2_INODE(&inode),
-				      sizeof(inode));
+	err = fuse2fs_write_inode(fs, fh->ino, &inode);
 	if (err)
 		return translate_error(fs, fh->ino, err);
 
@@ -3552,9 +3523,7 @@ static int ioctl_getversion(struct fuse2fs *ff, struct fuse2fs_file_handle *fh,
 
 	FUSE2FS_CHECK_MAGIC(fs, fh, FUSE2FS_FILE_MAGIC);
 	dbg_printf(ff, "%s: ino=%d\n", __func__, fh->ino);
-	memset(&inode, 0, sizeof(inode));
-	err = ext2fs_read_inode_full(fs, fh->ino, EXT2_INODE(&inode),
-				     sizeof(inode));
+	err = fuse2fs_read_inode(fs, fh->ino, &inode);
 	if (err)
 		return translate_error(fs, fh->ino, err);
 
@@ -3574,9 +3543,7 @@ static int ioctl_setversion(struct fuse2fs *ff, struct fuse2fs_file_handle *fh,
 
 	FUSE2FS_CHECK_MAGIC(fs, fh, FUSE2FS_FILE_MAGIC);
 	dbg_printf(ff, "%s: ino=%d\n", __func__, fh->ino);
-	memset(&inode, 0, sizeof(inode));
-	err = ext2fs_read_inode_full(fs, fh->ino, EXT2_INODE(&inode),
-				     sizeof(inode));
+	err = fuse2fs_read_inode(fs, fh->ino, &inode);
 	if (err)
 		return translate_error(fs, fh->ino, err);
 
@@ -3589,8 +3556,7 @@ static int ioctl_setversion(struct fuse2fs *ff, struct fuse2fs_file_handle *fh,
 	if (ret)
 		return ret;
 
-	err = ext2fs_write_inode_full(fs, fh->ino, EXT2_INODE(&inode),
-				      sizeof(inode));
+	err = fuse2fs_write_inode(fs, fh->ino, &inode);
 	if (err)
 		return translate_error(fs, fh->ino, err);
 
@@ -3631,9 +3597,7 @@ static int ioctl_fsgetxattr(struct fuse2fs *ff, struct fuse2fs_file_handle *fh,
 
 	FUSE2FS_CHECK_MAGIC(fs, fh, FUSE2FS_FILE_MAGIC);
 	dbg_printf(ff, "%s: ino=%d\n", __func__, fh->ino);
-	memset(&inode, 0, sizeof(inode));
-	err = ext2fs_read_inode_full(fs, fh->ino, EXT2_INODE(&inode),
-				     sizeof(inode));
+	err = fuse2fs_read_inode(fs, fh->ino, &inode);
 	if (err)
 		return translate_error(fs, fh->ino, err);
 
@@ -3680,9 +3644,7 @@ static int ioctl_fssetxattr(struct fuse2fs *ff, struct fuse2fs_file_handle *fh,
 
 	FUSE2FS_CHECK_MAGIC(fs, fh, FUSE2FS_FILE_MAGIC);
 	dbg_printf(ff, "%s: ino=%d\n", __func__, fh->ino);
-	memset(&inode, 0, sizeof(inode));
-	err = ext2fs_read_inode_full(fs, fh->ino, EXT2_INODE(&inode),
-				     sizeof(inode));
+	err = fuse2fs_read_inode(fs, fh->ino, &inode);
 	if (err)
 		return translate_error(fs, fh->ino, err);
 
@@ -3701,8 +3663,7 @@ static int ioctl_fssetxattr(struct fuse2fs *ff, struct fuse2fs_file_handle *fh,
 	if (ret)
 		return ret;
 
-	err = ext2fs_write_inode_full(fs, fh->ino, EXT2_INODE(&inode),
-				      sizeof(inode));
+	err = fuse2fs_write_inode(fs, fh->ino, &inode);
 	if (err)
 		return translate_error(fs, fh->ino, err);
 
@@ -3896,9 +3857,7 @@ static int fallocate_helper(struct fuse_file_info *fp, int mode, off_t offset,
 	if (!fs_can_allocate(ff, len / fs->blocksize))
 		return -ENOSPC;
 
-	memset(&inode, 0, sizeof(inode));
-	err = ext2fs_read_inode_full(fs, fh->ino, EXT2_INODE(&inode),
-				     sizeof(inode));
+	err = fuse2fs_read_inode(fs, fh->ino, &inode);
 	if (err)
 		return err;
 	fsize = EXT2_I_SIZE(&inode);
@@ -3927,8 +3886,7 @@ static int fallocate_helper(struct fuse_file_info *fp, int mode, off_t offset,
 	if (err)
 		return err;
 
-	err = ext2fs_write_inode_full(fs, fh->ino, EXT2_INODE(&inode),
-				      sizeof(inode));
+	err = fuse2fs_write_inode(fs, fh->ino, &inode);
 	if (err)
 		return translate_error(fs, fh->ino, err);
 
@@ -4036,9 +3994,7 @@ static int punch_helper(struct fuse_file_info *fp, int mode, off_t offset,
 	dbg_printf(ff, "%s: ino=%d mode=0x%x start=%llu end=%llu\n", __func__,
 		   fh->ino, mode, start, end);
 
-	memset(&inode, 0, sizeof(inode));
-	err = ext2fs_read_inode_full(fs, fh->ino, EXT2_INODE(&inode),
-				     sizeof(inode));
+	err = fuse2fs_read_inode(fs, fh->ino, &inode);
 	if (err)
 		return translate_error(fs, fh->ino, err);
 
@@ -4069,8 +4025,7 @@ static int punch_helper(struct fuse_file_info *fp, int mode, off_t offset,
 	if (err)
 		return err;
 
-	err = ext2fs_write_inode_full(fs, fh->ino, EXT2_INODE(&inode),
-				      sizeof(inode));
+	err = fuse2fs_write_inode(fs, fh->ino, &inode);
 	if (err)
 		return translate_error(fs, fh->ino, err);
 


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [PATCH 3/3] fuse2fs: implement blocksize converters
  2025-05-21 22:34 [PATCHSET 2/6] fuse2fs: various filewide cleanups Darrick J. Wong
  2025-05-21 22:42 ` [PATCH 1/3] fuse2fs: clean up open-coded ext2_inode_large -> ext2_inode casts Darrick J. Wong
  2025-05-21 22:43 ` [PATCH 2/3] fuse2fs: simplify reading and writing inodes Darrick J. Wong
@ 2025-05-21 22:43 ` Darrick J. Wong
  2025-05-23 14:28 ` [PATCHSET 2/6] fuse2fs: various filewide cleanups Theodore Ts'o
  3 siblings, 0 replies; 5+ messages in thread
From: Darrick J. Wong @ 2025-05-21 22:43 UTC (permalink / raw)
  To: tytso; +Cc: linux-ext4

From: Darrick J. Wong <djwong@kernel.org>

Before we implement iomap, add some helpers to convert bytes to fsblocks
and back.

Signed-off-by: "Darrick J. Wong" <djwong@kernel.org>
---
 misc/fuse2fs.c |   92 ++++++++++++++++++++++++++++++++++++++++----------------
 1 file changed, 66 insertions(+), 26 deletions(-)


diff --git a/misc/fuse2fs.c b/misc/fuse2fs.c
index a89ba115bf6f42..9c1e5b00703bbe 100644
--- a/misc/fuse2fs.c
+++ b/misc/fuse2fs.c
@@ -162,6 +162,9 @@ struct fuse2fs {
 	uint8_t kernel;
 	uint8_t directio;
 	uint8_t acl;
+
+	int blocklog;
+	unsigned int blockmask;
 	unsigned long offset;
 	unsigned int next_generation;
 	unsigned long long cache_size;
@@ -189,6 +192,39 @@ static int __translate_error(ext2_filsys fs, ext2_ino_t ino, errcode_t err,
 #  define R_OK 4
 #endif
 
+static inline int u_log2(unsigned int arg)
+{
+	int	l = 0;
+
+	arg >>= 1;
+	while (arg) {
+		l++;
+		arg >>= 1;
+	}
+	return l;
+}
+
+static inline blk64_t FUSE2FS_B_TO_FSBT(const struct fuse2fs *ff, off_t pos)
+{
+	return pos >> ff->blocklog;
+}
+
+static inline blk64_t FUSE2FS_B_TO_FSB(const struct fuse2fs *ff, off_t pos)
+{
+	return (pos + ff->blockmask) >> ff->blocklog;
+}
+
+static inline unsigned int FUSE2FS_OFF_IN_FSB(const struct fuse2fs *ff,
+					      off_t pos)
+{
+	return pos & ff->blockmask;
+}
+
+static inline off_t FUSE2FS_FSB_TO_B(const struct fuse2fs *ff, blk64_t bno)
+{
+	return bno << ff->blocklog;
+}
+
 #define EXT4_EPOCH_BITS 2
 #define EXT4_EPOCH_MASK ((1 << EXT4_EPOCH_BITS) - 1)
 #define EXT4_NSEC_MASK  (~0UL << EXT4_EPOCH_BITS)
@@ -2223,7 +2259,7 @@ static int punch_posteof(struct fuse2fs *ff, ext2_ino_t ino, off_t new_size)
 {
 	ext2_filsys fs = ff->fs;
 	struct ext2_inode_large inode;
-	blk64_t truncate_block = (new_size + fs->blocksize - 1) / fs->blocksize;
+	blk64_t truncate_block = FUSE2FS_B_TO_FSB(ff, new_size);
 	errcode_t err;
 
 	err = fuse2fs_read_inode(fs, ino, &inode);
@@ -2525,7 +2561,7 @@ static int op_write(const char *path EXT2FS_ATTR((unused)),
 		goto out;
 	}
 
-	if (!fs_can_allocate(ff, len / fs->blocksize)) {
+	if (!fs_can_allocate(ff, FUSE2FS_B_TO_FSB(ff, len))) {
 		ret = -ENOSPC;
 		goto out;
 	}
@@ -3684,9 +3720,9 @@ static int ioctl_fitrim(struct fuse2fs *ff, struct fuse2fs_file_handle *fh,
 	if (!fs_writeable(fs))
 		return -EROFS;
 
-	start = fr->start / fs->blocksize;
-	end = (fr->start + fr->len - 1) / fs->blocksize;
-	minlen = fr->minlen / fs->blocksize;
+	start = FUSE2FS_B_TO_FSBT(ff, fr->start);
+	end = FUSE2FS_B_TO_FSBT(ff, fr->start + fr->len - 1);
+	minlen = FUSE2FS_B_TO_FSBT(ff, fr->minlen);
 
 	if (EXT2FS_NUM_B2C(fs, minlen) > EXT2_CLUSTERS_PER_GROUP(fs->super) ||
 	    start >= max_blks ||
@@ -3705,7 +3741,7 @@ static int ioctl_fitrim(struct fuse2fs *ff, struct fuse2fs_file_handle *fh,
 		end = ext2fs_blocks_count(fs->super) - 1;
 
 	cleared = 0;
-	max_blocks = 2048ULL * 1024 * 1024 / fs->blocksize;
+	max_blocks = FUSE2FS_B_TO_FSBT(ff, 2048ULL * 1024 * 1024);
 
 	fr->len = 0;
 	while (start <= end) {
@@ -3732,7 +3768,7 @@ static int ioctl_fitrim(struct fuse2fs *ff, struct fuse2fs_file_handle *fh,
 			if (err)
 				return translate_error(fs, fh->ino, err);
 			cleared += b - start;
-			fr->len = cleared * fs->blocksize;
+			fr->len = FUSE2FS_FSB_TO_B(ff, cleared);
 		}
 		start = b + 1;
 	}
@@ -3850,11 +3886,11 @@ static int fallocate_helper(struct fuse_file_info *fp, int mode, off_t offset,
 	FUSE2FS_CHECK_CONTEXT(ff);
 	fs = ff->fs;
 	FUSE2FS_CHECK_MAGIC(fs, fh, FUSE2FS_FILE_MAGIC);
-	start = offset / fs->blocksize;
-	end = (offset + len - 1) / fs->blocksize;
-	dbg_printf(ff, "%s: ino=%d mode=0x%x start=%jd end=%llu\n", __func__,
-		   fh->ino, mode, offset / fs->blocksize, end);
-	if (!fs_can_allocate(ff, len / fs->blocksize))
+	start = FUSE2FS_B_TO_FSBT(ff, offset);
+	end = FUSE2FS_B_TO_FSBT(ff, offset + len - 1);
+	dbg_printf(ff, "%s: ino=%d mode=0x%x start=%llu end=%llu\n", __func__,
+		   fh->ino, mode, start, end);
+	if (!fs_can_allocate(ff, FUSE2FS_B_TO_FSB(ff, len)))
 		return -ENOSPC;
 
 	err = fuse2fs_read_inode(fs, fh->ino, &inode);
@@ -3893,16 +3929,17 @@ static int fallocate_helper(struct fuse_file_info *fp, int mode, off_t offset,
 	return err;
 }
 
-static errcode_t clean_block_middle(ext2_filsys fs, ext2_ino_t ino,
-				  struct ext2_inode_large *inode, off_t offset,
-				  off_t len, char **buf)
+static errcode_t clean_block_middle(struct fuse2fs *ff, ext2_ino_t ino,
+				    struct ext2_inode_large *inode,
+				    off_t offset, off_t len, char **buf)
 {
+	ext2_filsys fs = ff->fs;
 	blk64_t blk;
 	off_t residue;
 	int retflags;
 	errcode_t err;
 
-	residue = offset % fs->blocksize;
+	residue = FUSE2FS_OFF_IN_FSB(ff, offset);
 	if (residue == 0)
 		return 0;
 
@@ -3913,7 +3950,7 @@ static errcode_t clean_block_middle(ext2_filsys fs, ext2_ino_t ino,
 	}
 
 	err = ext2fs_bmap2(fs, ino, EXT2_INODE(inode), *buf, 0,
-			   offset / fs->blocksize, &retflags, &blk);
+			   FUSE2FS_B_TO_FSBT(ff, offset), &retflags, &blk);
 	if (err)
 		return err;
 	if (!blk || (retflags & BMAP_RET_UNINIT))
@@ -3928,16 +3965,17 @@ static errcode_t clean_block_middle(ext2_filsys fs, ext2_ino_t ino,
 	return io_channel_write_blk(fs->io, blk, 1, *buf);
 }
 
-static errcode_t clean_block_edge(ext2_filsys fs, ext2_ino_t ino,
+static errcode_t clean_block_edge(struct fuse2fs *ff, ext2_ino_t ino,
 				  struct ext2_inode_large *inode, off_t offset,
 				  int clean_before, char **buf)
 {
+	ext2_filsys fs = ff->fs;
 	blk64_t blk;
 	int retflags;
 	off_t residue;
 	errcode_t err;
 
-	residue = offset % fs->blocksize;
+	residue = FUSE2FS_OFF_IN_FSB(ff, offset);
 	if (residue == 0)
 		return 0;
 
@@ -3948,7 +3986,7 @@ static errcode_t clean_block_edge(ext2_filsys fs, ext2_ino_t ino,
 	}
 
 	err = ext2fs_bmap2(fs, ino, EXT2_INODE(inode), *buf, 0,
-			   offset / fs->blocksize, &retflags, &blk);
+			   FUSE2FS_B_TO_FSBT(ff, offset), &retflags, &blk);
 	if (err)
 		return err;
 
@@ -3989,7 +4027,7 @@ static int punch_helper(struct fuse_file_info *fp, int mode, off_t offset,
 		return -EINVAL;
 
 	/* Punch out a bunch of blocks */
-	start = (offset + fs->blocksize - 1) / fs->blocksize;
+	start = FUSE2FS_B_TO_FSB(ff, offset);
 	end = (offset + len - fs->blocksize) / fs->blocksize;
 	dbg_printf(ff, "%s: ino=%d mode=0x%x start=%llu end=%llu\n", __func__,
 		   fh->ino, mode, start, end);
@@ -3999,13 +4037,13 @@ static int punch_helper(struct fuse_file_info *fp, int mode, off_t offset,
 		return translate_error(fs, fh->ino, err);
 
 	/* Zero everything before the first block and after the last block */
-	if ((offset / fs->blocksize) == ((offset + len) / fs->blocksize))
-		err = clean_block_middle(fs, fh->ino, &inode, offset,
+	if (FUSE2FS_B_TO_FSBT(ff, offset) == FUSE2FS_B_TO_FSBT(ff, offset + len))
+		err = clean_block_middle(ff, fh->ino, &inode, offset,
 					 len, &buf);
 	else {
-		err = clean_block_edge(fs, fh->ino, &inode, offset, 0, &buf);
+		err = clean_block_edge(ff, fh->ino, &inode, offset, 0, &buf);
 		if (!err)
-			err = clean_block_edge(fs, fh->ino, &inode,
+			err = clean_block_edge(ff, fh->ino, &inode,
 					       offset + len, 1, &buf);
 	}
 	if (buf)
@@ -4379,6 +4417,8 @@ int main(int argc, char *argv[])
 	}
 	fctx.fs = global_fs;
 	global_fs->priv_data = &fctx;
+	fctx.blocklog = u_log2(fctx.fs->blocksize);
+	fctx.blockmask = fctx.fs->blocksize - 1;
 
 	if (!fctx.cache_size)
 		fctx.cache_size = default_cache_size();
@@ -4386,7 +4426,7 @@ int main(int argc, char *argv[])
 		char buf[55];
 
 		snprintf(buf, sizeof(buf), "cache_blocks=%llu",
-				fctx.cache_size / global_fs->blocksize);
+			 FUSE2FS_B_TO_FSBT(&fctx, fctx.cache_size));
 		err = io_channel_set_options(global_fs->io, buf);
 		if (err) {
 			err_printf(&fctx, "%s %lluk: %s\n",


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [PATCHSET 2/6] fuse2fs: various filewide cleanups
  2025-05-21 22:34 [PATCHSET 2/6] fuse2fs: various filewide cleanups Darrick J. Wong
                   ` (2 preceding siblings ...)
  2025-05-21 22:43 ` [PATCH 3/3] fuse2fs: implement blocksize converters Darrick J. Wong
@ 2025-05-23 14:28 ` Theodore Ts'o
  3 siblings, 0 replies; 5+ messages in thread
From: Theodore Ts'o @ 2025-05-23 14:28 UTC (permalink / raw)
  To: Darrick J. Wong; +Cc: linux-ext4

On Wed, May 21, 2025 at 03:34:42PM -0700, Darrick J. Wong wrote:
> Hi all,
> 
> Clean up the inode reading and writing callsites and the opencoded unit
> conversion code throughout the program.
> 
> If you're going to start using this code, I strongly recommend pulling
> from my git trees, which are linked below.
> 
> Comments and questions are, as always, welcome.

Thanks, applied.  For more details/comments see

https://lore.kernel.org/r/20250523140344.GA1414791@mit.edu

						- Ted

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2025-05-23 14:28 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-05-21 22:34 [PATCHSET 2/6] fuse2fs: various filewide cleanups Darrick J. Wong
2025-05-21 22:42 ` [PATCH 1/3] fuse2fs: clean up open-coded ext2_inode_large -> ext2_inode casts Darrick J. Wong
2025-05-21 22:43 ` [PATCH 2/3] fuse2fs: simplify reading and writing inodes Darrick J. Wong
2025-05-21 22:43 ` [PATCH 3/3] fuse2fs: implement blocksize converters Darrick J. Wong
2025-05-23 14:28 ` [PATCHSET 2/6] fuse2fs: various filewide cleanups Theodore Ts'o

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.