From: Luis Henriques <luis@igalia.com>
To: Miklos Szeredi <miklos@szeredi.hu>,
Amir Goldstein <amir73il@gmail.com>,
Bernd Schubert <bschubert@ddn.com>,
Bernd Schubert <bernd@bsbernd.com>,
"Darrick J. Wong" <djwong@kernel.org>,
Horst Birthelmer <hbirthelmer@ddn.com>,
Joanne Koong <joannelkoong@gmail.com>, Kevin Chen <kchen@ddn.com>
Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org,
Matt Harvey <mharvey@jumptrading.com>,
kernel-dev@igalia.com, Luis Henriques <luis@igalia.com>
Subject: [RFC PATCH v3 5/8] fuse: extract helper functions from fuse_do_statx()
Date: Wed, 25 Feb 2026 11:24:36 +0000 [thread overview]
Message-ID: <20260225112439.27276-6-luis@igalia.com> (raw)
In-Reply-To: <20260225112439.27276-1-luis@igalia.com>
Split function fuse_do_statx(), so that we get two helper functions: one
to initialise the arguments and another to update the attributes and
statistics. This will allow compound operations to re-use these two helpers.
Signed-off-by: Luis Henriques <luis@igalia.com>
---
fs/fuse/dir.c | 88 +++++++++++++++++++++++++++++++--------------------
1 file changed, 53 insertions(+), 35 deletions(-)
diff --git a/fs/fuse/dir.c b/fs/fuse/dir.c
index 92c9ebfb4985..5c0f1364c392 100644
--- a/fs/fuse/dir.c
+++ b/fs/fuse/dir.c
@@ -1406,43 +1406,37 @@ static void fuse_statx_to_attr(struct fuse_statx *sx, struct fuse_attr *attr)
attr->blksize = sx->blksize;
}
-static int fuse_do_statx(struct mnt_idmap *idmap, struct inode *inode,
- struct file *file, struct kstat *stat)
+static void fuse_statx_init(struct fuse_args *args, struct fuse_statx_in *inarg,
+ u64 nodeid, struct fuse_file *ff,
+ struct fuse_statx_out *outarg)
{
- int err;
- struct fuse_attr attr;
- struct fuse_statx *sx;
- struct fuse_statx_in inarg;
- struct fuse_statx_out outarg;
- struct fuse_mount *fm = get_fuse_mount(inode);
- u64 attr_version = fuse_get_attr_version(fm->fc);
- FUSE_ARGS(args);
-
- memset(&inarg, 0, sizeof(inarg));
- memset(&outarg, 0, sizeof(outarg));
- /* Directories have separate file-handle space */
- if (file && S_ISREG(inode->i_mode)) {
- struct fuse_file *ff = file->private_data;
+ memset(inarg, 0, sizeof(*inarg));
+ memset(outarg, 0, sizeof(*outarg));
- inarg.getattr_flags |= FUSE_GETATTR_FH;
- inarg.fh = ff->fh;
+ if (ff) {
+ inarg->getattr_flags |= FUSE_GETATTR_FH;
+ inarg->fh = ff->fh;
}
/* For now leave sync hints as the default, request all stats. */
- inarg.sx_flags = 0;
- inarg.sx_mask = STATX_BASIC_STATS | STATX_BTIME;
- args.opcode = FUSE_STATX;
- args.nodeid = get_node_id(inode);
- args.in_numargs = 1;
- args.in_args[0].size = sizeof(inarg);
- args.in_args[0].value = &inarg;
- args.out_numargs = 1;
- args.out_args[0].size = sizeof(outarg);
- args.out_args[0].value = &outarg;
- err = fuse_simple_request(fm, &args);
- if (err)
- return err;
+ inarg->sx_flags = 0;
+ inarg->sx_mask = STATX_BASIC_STATS | STATX_BTIME;
+ args->opcode = FUSE_STATX;
+ args->nodeid = nodeid;
+ args->in_numargs = 1;
+ args->in_args[0].size = sizeof(*inarg);
+ args->in_args[0].value = inarg;
+ args->out_numargs = 1;
+ args->out_args[0].size = sizeof(*outarg);
+ args->out_args[0].value = outarg;
+}
+
+static int fuse_statx_update(struct mnt_idmap *idmap,
+ struct fuse_statx_out *outarg, struct inode *inode,
+ u64 attr_version, struct kstat *stat)
+{
+ struct fuse_statx *sx = &outarg->stat;
+ struct fuse_attr attr;
- sx = &outarg.stat;
if (((sx->mask & STATX_SIZE) && !fuse_valid_size(sx->size)) ||
((sx->mask & STATX_TYPE) && (!fuse_valid_type(sx->mode) ||
inode_wrong_type(inode, sx->mode)))) {
@@ -1450,10 +1444,10 @@ static int fuse_do_statx(struct mnt_idmap *idmap, struct inode *inode,
return -EIO;
}
- fuse_statx_to_attr(&outarg.stat, &attr);
+ fuse_statx_to_attr(sx, &attr);
if ((sx->mask & STATX_BASIC_STATS) == STATX_BASIC_STATS) {
- fuse_change_attributes(inode, &attr, &outarg.stat,
- ATTR_TIMEOUT(&outarg), attr_version);
+ fuse_change_attributes(inode, &attr, sx,
+ ATTR_TIMEOUT(outarg), attr_version);
}
if (stat) {
@@ -1467,6 +1461,30 @@ static int fuse_do_statx(struct mnt_idmap *idmap, struct inode *inode,
return 0;
}
+static int fuse_do_statx(struct mnt_idmap *idmap, struct inode *inode,
+ struct file *file, struct kstat *stat)
+{
+ int err;
+ struct fuse_statx_in inarg;
+ struct fuse_statx_out outarg;
+ struct fuse_mount *fm = get_fuse_mount(inode);
+ struct fuse_file *ff = NULL;
+ u64 attr_version = fuse_get_attr_version(fm->fc);
+ FUSE_ARGS(args);
+
+ /* Directories have separate file-handle space */
+ if (file && S_ISREG(inode->i_mode))
+ ff = file->private_data;
+
+ fuse_statx_init(&args, &inarg, get_node_id(inode), ff, &outarg);
+
+ err = fuse_simple_request(fm, &args);
+ if (err)
+ return err;
+
+ return fuse_statx_update(idmap, &outarg, inode, attr_version, stat);
+}
+
/*
* Helper function to initialize fuse_args for GETATTR operations
*/
next prev parent reply other threads:[~2026-02-25 11:25 UTC|newest]
Thread overview: 41+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-02-25 11:24 [RFC PATCH v3 0/8] fuse: LOOKUP_HANDLE operation Luis Henriques
2026-02-25 11:24 ` [RFC PATCH v3 1/8] fuse: simplify fuse_lookup_name() interface Luis Henriques
2026-02-27 15:46 ` Miklos Szeredi
2026-02-28 14:42 ` Luis Henriques
2026-02-25 11:24 ` [RFC PATCH v3 2/8] fuse: export extend_arg() and factor out fuse_ext_size() Luis Henriques
2026-02-25 11:24 ` [RFC PATCH v3 3/8] fuse: store index of the variable length argument Luis Henriques
2026-02-27 15:41 ` Miklos Szeredi
2026-02-28 14:50 ` Luis Henriques
2026-02-25 11:24 ` [RFC PATCH v3 4/8] fuse: drop unnecessary argument from fuse_lookup_init() Luis Henriques
2026-02-27 15:57 ` Miklos Szeredi
2026-02-25 11:24 ` Luis Henriques [this message]
2026-02-25 11:24 ` [RFC PATCH v3 6/8] fuse: implementation of lookup_handle+statx compound operation Luis Henriques
2026-02-25 18:06 ` Amir Goldstein
2026-02-26 9:54 ` Luis Henriques
2026-02-26 10:08 ` Amir Goldstein
2026-02-26 10:29 ` Miklos Szeredi
2026-02-26 15:06 ` Luis Henriques
2026-02-26 15:44 ` Miklos Szeredi
2026-02-26 16:17 ` Luis Henriques
2026-02-26 10:33 ` Luis Henriques
2026-04-07 17:43 ` Joanne Koong
2026-04-07 21:20 ` Luis Henriques
2026-04-07 23:06 ` Joanne Koong
2026-04-07 23:24 ` Joanne Koong
2026-04-07 23:38 ` Joanne Koong
2026-04-08 10:22 ` Luis Henriques
2026-04-08 15:15 ` Joanne Koong
2026-04-08 10:16 ` Luis Henriques
2026-04-08 15:05 ` Joanne Koong
2026-04-09 10:46 ` Luis Henriques
2026-04-09 2:27 ` Jingbo Xu
2026-04-09 11:10 ` Luis Henriques
2026-04-10 2:18 ` Jingbo Xu
2026-04-09 14:03 ` Amir Goldstein
2026-04-10 2:17 ` Jingbo Xu
2026-02-25 11:24 ` [RFC PATCH v3 7/8] fuse: export fuse_open_args_fill() helper function Luis Henriques
2026-02-25 11:24 ` [RFC PATCH v3 8/8] fuse: implementation of mkobj_handle+statx+open compound operation Luis Henriques
2026-02-25 15:08 ` Horst Birthelmer
2026-02-25 17:26 ` Luis Henriques
2026-02-25 15:14 ` [RFC PATCH v3 0/8] fuse: LOOKUP_HANDLE operation Horst Birthelmer
2026-02-25 17:06 ` Luis Henriques
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260225112439.27276-6-luis@igalia.com \
--to=luis@igalia.com \
--cc=amir73il@gmail.com \
--cc=bernd@bsbernd.com \
--cc=bschubert@ddn.com \
--cc=djwong@kernel.org \
--cc=hbirthelmer@ddn.com \
--cc=joannelkoong@gmail.com \
--cc=kchen@ddn.com \
--cc=kernel-dev@igalia.com \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mharvey@jumptrading.com \
--cc=miklos@szeredi.hu \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
Powered by JetHome