[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <175798064131.349283.6923537020395101120.stgit@frogsfrogsfrogs>
Date: Mon, 15 Sep 2025 16:59:34 -0700
From: "Darrick J. Wong" <djwong@...nel.org>
To: tytso@....edu
Cc: linux-ext4@...r.kernel.org
Subject: [PATCH 2/9] fuse2fs: rework checking file handles
From: Darrick J. Wong <djwong@...nel.org>
We only use FUSE2FS_CHECK_MAGIC for one thing -- to check the magic
number of file handles. Make the whole macro more specific to file
handles, and move it to the top of each function so that we don't take
locks or any other silly stuff like that.
Signed-off-by: "Darrick J. Wong" <djwong@...nel.org>
---
misc/fuse2fs.c | 43 +++++++++++++++++++++++++------------------
1 file changed, 25 insertions(+), 18 deletions(-)
diff --git a/misc/fuse2fs.c b/misc/fuse2fs.c
index 462ec8558567ee..178d0fd6e20263 100644
--- a/misc/fuse2fs.c
+++ b/misc/fuse2fs.c
@@ -242,9 +242,16 @@ struct fuse2fs {
char *lockfile;
};
-#define FUSE2FS_CHECK_MAGIC(fs, ptr, num) do {if ((ptr)->magic != (num)) \
- return translate_error((fs), 0, EXT2_ET_FILESYSTEM_CORRUPTED); \
-} while (0)
+#define FUSE2FS_CHECK_HANDLE(ff, fh) \
+ do { \
+ if ((fh) == NULL || (fh)->magic != FUSE2FS_FILE_MAGIC) { \
+ fprintf(stderr, \
+ "FUSE2FS: Corrupt in-memory file handle at %s:%d!\n", \
+ __func__, __LINE__); \
+ fflush(stderr); \
+ return -EUCLEAN; \
+ } \
+ } while (0)
#define __FUSE2FS_CHECK_CONTEXT(ff, retcode) \
do { \
@@ -2881,8 +2888,8 @@ static int op_read(const char *path EXT2FS_ATTR((unused)), char *buf,
int ret = 0;
FUSE2FS_CHECK_CONTEXT(ff);
+ FUSE2FS_CHECK_HANDLE(ff, fh);
fs = ff->fs;
- FUSE2FS_CHECK_MAGIC(fs, fh, FUSE2FS_FILE_MAGIC);
dbg_printf(ff, "%s: ino=%d off=%jd len=%jd\n", __func__, fh->ino,
(intmax_t) offset, len);
pthread_mutex_lock(&ff->bfl);
@@ -2938,8 +2945,8 @@ static int op_write(const char *path EXT2FS_ATTR((unused)),
int ret = 0;
FUSE2FS_CHECK_CONTEXT(ff);
+ FUSE2FS_CHECK_HANDLE(ff, fh);
fs = ff->fs;
- FUSE2FS_CHECK_MAGIC(fs, fh, FUSE2FS_FILE_MAGIC);
dbg_printf(ff, "%s: ino=%d off=%jd len=%jd\n", __func__, fh->ino,
(intmax_t) offset, (intmax_t) len);
pthread_mutex_lock(&ff->bfl);
@@ -3008,8 +3015,8 @@ static int op_release(const char *path EXT2FS_ATTR((unused)),
int ret = 0;
FUSE2FS_CHECK_CONTEXT(ff);
+ FUSE2FS_CHECK_HANDLE(ff, fh);
fs = ff->fs;
- FUSE2FS_CHECK_MAGIC(fs, fh, FUSE2FS_FILE_MAGIC);
dbg_printf(ff, "%s: ino=%d\n", __func__, fh->ino);
pthread_mutex_lock(&ff->bfl);
@@ -3042,8 +3049,8 @@ static int op_fsync(const char *path EXT2FS_ATTR((unused)),
int ret = 0;
FUSE2FS_CHECK_CONTEXT(ff);
+ FUSE2FS_CHECK_HANDLE(ff, fh);
fs = ff->fs;
- FUSE2FS_CHECK_MAGIC(fs, fh, FUSE2FS_FILE_MAGIC);
dbg_printf(ff, "%s: ino=%d\n", __func__, fh->ino);
/* For now, flush everything, even if it's slow */
pthread_mutex_lock(&ff->bfl);
@@ -3584,8 +3591,8 @@ static int op_readdir(const char *path EXT2FS_ATTR((unused)),
int ret = 0;
FUSE2FS_CHECK_CONTEXT(ff);
+ FUSE2FS_CHECK_HANDLE(ff, fh);
i.fs = ff->fs;
- FUSE2FS_CHECK_MAGIC(i.fs, fh, FUSE2FS_FILE_MAGIC);
dbg_printf(ff, "%s: ino=%d offset=%llu\n", __func__, fh->ino,
(unsigned long long)offset);
pthread_mutex_lock(&ff->bfl);
@@ -3780,8 +3787,8 @@ static int op_ftruncate(const char *path EXT2FS_ATTR((unused)),
int ret = 0;
FUSE2FS_CHECK_CONTEXT(ff);
+ FUSE2FS_CHECK_HANDLE(ff, fh);
fs = ff->fs;
- FUSE2FS_CHECK_MAGIC(fs, fh, FUSE2FS_FILE_MAGIC);
dbg_printf(ff, "%s: ino=%d len=%jd\n", __func__, fh->ino,
(intmax_t) len);
pthread_mutex_lock(&ff->bfl);
@@ -3832,8 +3839,8 @@ static int op_fgetattr(const char *path EXT2FS_ATTR((unused)),
int ret = 0;
FUSE2FS_CHECK_CONTEXT(ff);
+ FUSE2FS_CHECK_HANDLE(ff, fh);
fs = ff->fs;
- FUSE2FS_CHECK_MAGIC(fs, fh, FUSE2FS_FILE_MAGIC);
dbg_printf(ff, "%s: ino=%d\n", __func__, fh->ino);
pthread_mutex_lock(&ff->bfl);
ret = stat_inode(fs, fh->ino, statbuf);
@@ -3937,7 +3944,7 @@ static int ioctl_getflags(struct fuse2fs *ff, struct fuse2fs_file_handle *fh,
errcode_t err;
struct ext2_inode_large inode;
- FUSE2FS_CHECK_MAGIC(fs, fh, FUSE2FS_FILE_MAGIC);
+ FUSE2FS_CHECK_HANDLE(ff, fh);
dbg_printf(ff, "%s: ino=%d\n", __func__, fh->ino);
err = fuse2fs_read_inode(fs, fh->ino, &inode);
if (err)
@@ -3957,7 +3964,7 @@ static int ioctl_setflags(struct fuse2fs *ff, struct fuse2fs_file_handle *fh,
__u32 flags = *(__u32 *)data;
struct fuse_context *ctxt = fuse_get_context();
- FUSE2FS_CHECK_MAGIC(fs, fh, FUSE2FS_FILE_MAGIC);
+ FUSE2FS_CHECK_HANDLE(ff, fh);
dbg_printf(ff, "%s: ino=%d\n", __func__, fh->ino);
err = fuse2fs_read_inode(fs, fh->ino, &inode);
if (err)
@@ -3988,7 +3995,7 @@ static int ioctl_getversion(struct fuse2fs *ff, struct fuse2fs_file_handle *fh,
errcode_t err;
struct ext2_inode_large inode;
- FUSE2FS_CHECK_MAGIC(fs, fh, FUSE2FS_FILE_MAGIC);
+ FUSE2FS_CHECK_HANDLE(ff, fh);
dbg_printf(ff, "%s: ino=%d\n", __func__, fh->ino);
err = fuse2fs_read_inode(fs, fh->ino, &inode);
if (err)
@@ -4008,7 +4015,7 @@ static int ioctl_setversion(struct fuse2fs *ff, struct fuse2fs_file_handle *fh,
__u32 generation = *(__u32 *)data;
struct fuse_context *ctxt = fuse_get_context();
- FUSE2FS_CHECK_MAGIC(fs, fh, FUSE2FS_FILE_MAGIC);
+ FUSE2FS_CHECK_HANDLE(ff, fh);
dbg_printf(ff, "%s: ino=%d\n", __func__, fh->ino);
err = fuse2fs_read_inode(fs, fh->ino, &inode);
if (err)
@@ -4062,7 +4069,7 @@ static int ioctl_fsgetxattr(struct fuse2fs *ff, struct fuse2fs_file_handle *fh,
struct fsxattr *fsx = data;
unsigned int inode_size;
- FUSE2FS_CHECK_MAGIC(fs, fh, FUSE2FS_FILE_MAGIC);
+ FUSE2FS_CHECK_HANDLE(ff, fh);
dbg_printf(ff, "%s: ino=%d\n", __func__, fh->ino);
err = fuse2fs_read_inode(fs, fh->ino, &inode);
if (err)
@@ -4135,7 +4142,7 @@ static int ioctl_fssetxattr(struct fuse2fs *ff, struct fuse2fs_file_handle *fh,
struct fsxattr *fsx = data;
unsigned int inode_size;
- FUSE2FS_CHECK_MAGIC(fs, fh, FUSE2FS_FILE_MAGIC);
+ FUSE2FS_CHECK_HANDLE(ff, fh);
dbg_printf(ff, "%s: ino=%d\n", __func__, fh->ino);
err = fuse2fs_read_inode(fs, fh->ino, &inode);
if (err)
@@ -4365,8 +4372,8 @@ static int fallocate_helper(struct fuse_file_info *fp, int mode, off_t offset,
int flags;
FUSE2FS_CHECK_CONTEXT(ff);
+ FUSE2FS_CHECK_HANDLE(ff, fh);
fs = ff->fs;
- FUSE2FS_CHECK_MAGIC(fs, fh, FUSE2FS_FILE_MAGIC);
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__,
@@ -4499,8 +4506,8 @@ static int punch_helper(struct fuse_file_info *fp, int mode, off_t offset,
char *buf = NULL;
FUSE2FS_CHECK_CONTEXT(ff);
+ FUSE2FS_CHECK_HANDLE(ff, fh);
fs = ff->fs;
- FUSE2FS_CHECK_MAGIC(fs, fh, FUSE2FS_FILE_MAGIC);
dbg_printf(ff, "%s: offset=%jd len=%jd\n", __func__,
(intmax_t) offset, (intmax_t) len);
Powered by blists - more mailing lists