* [PATCH v2] fuse: Send FORGET over io_uring when ring is ready
@ 2026-04-03 3:57 Li Wang
2026-04-03 19:00 ` Joanne Koong
` (4 more replies)
0 siblings, 5 replies; 6+ messages in thread
From: Li Wang @ 2026-04-03 3:57 UTC (permalink / raw)
To: Miklos Szeredi, Bernd Schubert; +Cc: linux-fsdevel, linux-kernel, Li Wang
Once the FUSE io_uring is registered and marked ready, most request
types are delivered through io_uring, while FORGET notifications were still
queued with fuse_dev_queue_forget() and only consumed through the legacy
path on /dev/fuse.
Deliver single FORGET operations through fuse_uring_queue_fuse_req() when
the ring is ready. Otherwise, fall back to the legacy forget list path so
behavior matches the previous implementation.
Benefits:
- While io-uring is active, the daemon can handle forgets in the same
commit/fetch loop as other opcodes instead of also draining a separate
/dev/fuse read path for forget traffic.
- Reduces split-brain transport for high-volume forgets (eviction,
unmount) when the ring is already the primary channel, which simplifies
userspace and keeps teardown forgets on the same completion path as
other uring-backed work.
- Reuses the same per-queue io-uring machinery and noreply/force request
setup (creds, FR_WAITING/FR_FORCE, etc.) already used for similar
kernel-initiated traffic.
Signed-off-by: Li Wang <liwang@kylinos.cn>
---
Changes since v1:
- Single forget enqueue entry: fuse_io_uring_ops.send_forget stays
fuse_dev_queue_forget(); when fuse_uring_ready() call
fuse_io_uring_send_forget(), else use the legacy list. v1 wired
send_forget to fuse_io_uring_send_forget() directly.
- Move fuse_io_uring_send_forget() and fuse_forget_uring_data from dev.c
to dev_uring.c; declare fuse_request_alloc, fuse_adjust_compat,
fuse_force_creds, fuse_args_to_req, fuse_drop_waiting in fuse_dev_i.h.
- Split list-only enqueue into fuse_dev_queue_forget_list(); use it on
fallback paths inside fuse_io_uring_send_forget() to avoid recursion.
fs/fuse/dev.c | 28 +++++++++++----
fs/fuse/dev_uring.c | 83 ++++++++++++++++++++++++++++++++++++++++++++
fs/fuse/fuse_dev_i.h | 15 ++++++++
3 files changed, 119 insertions(+), 7 deletions(-)
diff --git a/fs/fuse/dev.c b/fs/fuse/dev.c
index b212565a78cf..558c05862f68 100644
--- a/fs/fuse/dev.c
+++ b/fs/fuse/dev.c
@@ -137,7 +137,7 @@ static void fuse_request_init(struct fuse_mount *fm, struct fuse_req *req)
req->create_time = jiffies;
}
-static struct fuse_req *fuse_request_alloc(struct fuse_mount *fm, gfp_t flags)
+struct fuse_req *fuse_request_alloc(struct fuse_mount *fm, gfp_t flags)
{
struct fuse_req *req = kmem_cache_zalloc(fuse_req_cachep, flags);
if (req)
@@ -175,7 +175,7 @@ static bool fuse_block_alloc(struct fuse_conn *fc, bool for_background)
(fc->io_uring && fc->connected && !fuse_uring_ready(fc));
}
-static void fuse_drop_waiting(struct fuse_conn *fc)
+void fuse_drop_waiting(struct fuse_conn *fc)
{
/*
* lockess check of fc->connected is okay, because atomic_dec_and_test()
@@ -335,8 +335,8 @@ __releases(fiq->lock)
spin_unlock(&fiq->lock);
}
-void fuse_dev_queue_forget(struct fuse_iqueue *fiq,
- struct fuse_forget_link *forget)
+void fuse_dev_queue_forget_list(struct fuse_iqueue *fiq,
+ struct fuse_forget_link *forget)
{
spin_lock(&fiq->lock);
if (fiq->connected) {
@@ -349,6 +349,20 @@ void fuse_dev_queue_forget(struct fuse_iqueue *fiq,
}
}
+void fuse_dev_queue_forget(struct fuse_iqueue *fiq,
+ struct fuse_forget_link *forget)
+{
+#ifdef CONFIG_FUSE_IO_URING
+ struct fuse_conn *fc = container_of(fiq, struct fuse_conn, iq);
+
+ if (fuse_uring_ready(fc)) {
+ fuse_io_uring_send_forget(fiq, forget);
+ return;
+ }
+#endif
+ fuse_dev_queue_forget_list(fiq, forget);
+}
+
void fuse_dev_queue_interrupt(struct fuse_iqueue *fiq, struct fuse_req *req)
{
spin_lock(&fiq->lock);
@@ -606,7 +620,7 @@ static void __fuse_request_send(struct fuse_req *req)
smp_rmb();
}
-static void fuse_adjust_compat(struct fuse_conn *fc, struct fuse_args *args)
+void fuse_adjust_compat(struct fuse_conn *fc, struct fuse_args *args)
{
if (fc->minor < 4 && args->opcode == FUSE_STATFS)
args->out_args[0].size = FUSE_COMPAT_STATFS_SIZE;
@@ -639,7 +653,7 @@ static void fuse_adjust_compat(struct fuse_conn *fc, struct fuse_args *args)
}
}
-static void fuse_force_creds(struct fuse_req *req)
+void fuse_force_creds(struct fuse_req *req)
{
struct fuse_conn *fc = req->fm->fc;
@@ -654,7 +668,7 @@ static void fuse_force_creds(struct fuse_req *req)
req->in.h.pid = pid_nr_ns(task_pid(current), fc->pid_ns);
}
-static void fuse_args_to_req(struct fuse_req *req, struct fuse_args *args)
+void fuse_args_to_req(struct fuse_req *req, struct fuse_args *args)
{
req->in.h.opcode = args->opcode;
req->in.h.nodeid = args->nodeid;
diff --git a/fs/fuse/dev_uring.c b/fs/fuse/dev_uring.c
index 7b9822e8837b..75579e488937 100644
--- a/fs/fuse/dev_uring.c
+++ b/fs/fuse/dev_uring.c
@@ -1358,6 +1358,89 @@ bool fuse_uring_remove_pending_req(struct fuse_req *req)
return fuse_remove_pending_req(req, &queue->lock);
}
+struct fuse_forget_uring_data {
+ struct fuse_args args;
+ struct fuse_forget_in inarg;
+};
+
+static void fuse_forget_uring_free(struct fuse_mount *fm, struct fuse_args *args,
+ int error)
+{
+ struct fuse_forget_uring_data *d =
+ container_of(args, struct fuse_forget_uring_data, args);
+
+ kfree(d);
+}
+
+/*
+ * Send FUSE_FORGET through the io-uring ring when active; same payload as
+ * fuse_read_single_forget(), with userspace committing like any other request.
+ * Called from fuse_dev_queue_forget() when fuse_uring_ready().
+ */
+void fuse_io_uring_send_forget(struct fuse_iqueue *fiq,
+ struct fuse_forget_link *forget)
+{
+ struct fuse_conn *fc = container_of(fiq, struct fuse_conn, iq);
+ struct fuse_mount *fm;
+ struct fuse_req *req;
+ struct fuse_forget_uring_data *d;
+
+ if (!fuse_uring_ready(fc)) {
+ fuse_dev_queue_forget_list(fiq, forget);
+ return;
+ }
+
+ down_read(&fc->killsb);
+ if (list_empty(&fc->mounts)) {
+ up_read(&fc->killsb);
+ fuse_dev_queue_forget_list(fiq, forget);
+ return;
+ }
+ fm = list_first_entry(&fc->mounts, struct fuse_mount, fc_entry);
+ up_read(&fc->killsb);
+
+ d = kmalloc(sizeof(*d), GFP_KERNEL);
+ if (!d)
+ goto fallback;
+
+ atomic_inc(&fc->num_waiting);
+ req = fuse_request_alloc(fm, GFP_KERNEL);
+ if (!req) {
+ kfree(d);
+ fuse_drop_waiting(fc);
+ goto fallback;
+ }
+
+ memset(&d->args, 0, sizeof(d->args));
+ d->inarg.nlookup = forget->forget_one.nlookup;
+ d->args.opcode = FUSE_FORGET;
+ d->args.nodeid = forget->forget_one.nodeid;
+ d->args.in_numargs = 1;
+ d->args.in_args[0].size = sizeof(d->inarg);
+ d->args.in_args[0].value = &d->inarg;
+ d->args.force = true;
+ d->args.noreply = true;
+ d->args.end = fuse_forget_uring_free;
+
+ kfree(forget);
+
+ fuse_force_creds(req);
+ __set_bit(FR_WAITING, &req->flags);
+ if (!d->args.abort_on_kill)
+ __set_bit(FR_FORCE, &req->flags);
+ fuse_adjust_compat(fc, &d->args);
+ fuse_args_to_req(req, &d->args);
+ req->in.h.len = sizeof(struct fuse_in_header) +
+ fuse_len_args(req->args->in_numargs,
+ (struct fuse_arg *)req->args->in_args);
+
+ fuse_uring_queue_fuse_req(fiq, req);
+ return;
+
+fallback:
+ fuse_dev_queue_forget_list(fiq, forget);
+}
+
static const struct fuse_iqueue_ops fuse_io_uring_ops = {
/* should be send over io-uring as enhancement */
.send_forget = fuse_dev_queue_forget,
diff --git a/fs/fuse/fuse_dev_i.h b/fs/fuse/fuse_dev_i.h
index 134bf44aff0d..0e6bd08c421f 100644
--- a/fs/fuse/fuse_dev_i.h
+++ b/fs/fuse/fuse_dev_i.h
@@ -68,8 +68,23 @@ int fuse_copy_args(struct fuse_copy_state *cs, unsigned int numargs,
int zeroing);
int fuse_copy_out_args(struct fuse_copy_state *cs, struct fuse_args *args,
unsigned int nbytes);
+struct fuse_mount;
+struct fuse_conn;
+
+struct fuse_req *fuse_request_alloc(struct fuse_mount *fm, gfp_t flags);
+void fuse_adjust_compat(struct fuse_conn *fc, struct fuse_args *args);
+void fuse_force_creds(struct fuse_req *req);
+void fuse_args_to_req(struct fuse_req *req, struct fuse_args *args);
+void fuse_drop_waiting(struct fuse_conn *fc);
+
+void fuse_dev_queue_forget_list(struct fuse_iqueue *fiq,
+ struct fuse_forget_link *forget);
void fuse_dev_queue_forget(struct fuse_iqueue *fiq,
struct fuse_forget_link *forget);
+#ifdef CONFIG_FUSE_IO_URING
+void fuse_io_uring_send_forget(struct fuse_iqueue *fiq,
+ struct fuse_forget_link *forget);
+#endif
void fuse_dev_queue_interrupt(struct fuse_iqueue *fiq, struct fuse_req *req);
bool fuse_remove_pending_req(struct fuse_req *req, spinlock_t *lock);
--
2.34.1
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH v2] fuse: Send FORGET over io_uring when ring is ready
2026-04-03 3:57 [PATCH v2] fuse: Send FORGET over io_uring when ring is ready Li Wang
@ 2026-04-03 19:00 ` Joanne Koong
2026-04-08 1:08 ` kernel test robot
` (3 subsequent siblings)
4 siblings, 0 replies; 6+ messages in thread
From: Joanne Koong @ 2026-04-03 19:00 UTC (permalink / raw)
To: Li Wang; +Cc: Miklos Szeredi, Bernd Schubert, linux-fsdevel, linux-kernel
On Thu, Apr 2, 2026 at 8:58 PM Li Wang <liwang@kylinos.cn> wrote:
>
Hi Li,
Thanks for your work on this.
> Once the FUSE io_uring is registered and marked ready, most request
> types are delivered through io_uring, while FORGET notifications were still
> queued with fuse_dev_queue_forget() and only consumed through the legacy
> path on /dev/fuse.
>
> Deliver single FORGET operations through fuse_uring_queue_fuse_req() when
> the ring is ready. Otherwise, fall back to the legacy forget list path so
> behavior matches the previous implementation.
I don't think routing forgets through fuse_uring_queue_fuse_req()
alone is sufficient. Forgets are one-way and the server does not reply
to them, which is a problem for fuse over io-uring because the server
must submit a completion sqe to reuse the ring entry for future
requests. To support forget requests, I think you will also have to
add
a) on the libfuse side, submit completion sqes for forget requests
b) on the kernel side, keep forget requests on the processing queue
instead of ending them immediately so that when the kernel gets the
completion sqe for the forget request, it can find the corresponding
entry for it and recycle the entry back to the available queue so it
can be used for future requests
c) gate this behind a feature or config flag to resolve any
incompatibilities between older versions of libfuse and newer versions
of the kernel
For c) I think it's cleaner to pass this as a flag during registration
time, but it'd be imo preferable if there was just one generic flag
for requests that had no-op reply expectations, so I think it'd be
ideal if the code for sending interrupts over io-uring was also
included in this series so they could land together and be gated on
the same flag.
Forgets are also prioritized over regular pending requests for
dispatching to the server, so this priority should ideally be
preserved in the fuse io-uring path as well.
Thanks,
Joanne
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v2] fuse: Send FORGET over io_uring when ring is ready
2026-04-03 3:57 [PATCH v2] fuse: Send FORGET over io_uring when ring is ready Li Wang
2026-04-03 19:00 ` Joanne Koong
@ 2026-04-08 1:08 ` kernel test robot
2026-04-08 5:03 ` kernel test robot
` (2 subsequent siblings)
4 siblings, 0 replies; 6+ messages in thread
From: kernel test robot @ 2026-04-08 1:08 UTC (permalink / raw)
To: Li Wang, Miklos Szeredi, Bernd Schubert
Cc: oe-kbuild-all, linux-fsdevel, linux-kernel, Li Wang
Hi Li,
kernel test robot noticed the following build errors:
[auto build test ERROR on v7.0-rc7]
[also build test ERROR on linus/master]
[cannot apply to mszeredi-fuse/for-next next-20260407]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Li-Wang/fuse-Send-FORGET-over-io_uring-when-ring-is-ready/20260408-015226
base: v7.0-rc7
patch link: https://lore.kernel.org/r/20260403035752.20206-1-liwang%40kylinos.cn
patch subject: [PATCH v2] fuse: Send FORGET over io_uring when ring is ready
config: i386-randconfig-141-20260408 (https://download.01.org/0day-ci/archive/20260408/202604080826.6cW9hWuX-lkp@intel.com/config)
compiler: clang version 20.1.8 (https://github.com/llvm/llvm-project 87f0227cb60147a26a1eeb4fb06e3b505e9c7261)
smatch: v0.5.0-9004-gb810ac53
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20260408/202604080826.6cW9hWuX-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202604080826.6cW9hWuX-lkp@intel.com/
All errors (new ones prefixed by >>):
>> fs/fuse/dev_uring.c:1433:15: error: no member named 'abort_on_kill' in 'struct fuse_args'
1433 | if (!d->args.abort_on_kill)
| ~~~~~~~ ^
1 error generated.
vim +1433 fs/fuse/dev_uring.c
1378
1379 /*
1380 * Send FUSE_FORGET through the io-uring ring when active; same payload as
1381 * fuse_read_single_forget(), with userspace committing like any other request.
1382 * Called from fuse_dev_queue_forget() when fuse_uring_ready().
1383 */
1384 void fuse_io_uring_send_forget(struct fuse_iqueue *fiq,
1385 struct fuse_forget_link *forget)
1386 {
1387 struct fuse_conn *fc = container_of(fiq, struct fuse_conn, iq);
1388 struct fuse_mount *fm;
1389 struct fuse_req *req;
1390 struct fuse_forget_uring_data *d;
1391
1392 if (!fuse_uring_ready(fc)) {
1393 fuse_dev_queue_forget_list(fiq, forget);
1394 return;
1395 }
1396
1397 down_read(&fc->killsb);
1398 if (list_empty(&fc->mounts)) {
1399 up_read(&fc->killsb);
1400 fuse_dev_queue_forget_list(fiq, forget);
1401 return;
1402 }
1403 fm = list_first_entry(&fc->mounts, struct fuse_mount, fc_entry);
1404 up_read(&fc->killsb);
1405
1406 d = kmalloc(sizeof(*d), GFP_KERNEL);
1407 if (!d)
1408 goto fallback;
1409
1410 atomic_inc(&fc->num_waiting);
1411 req = fuse_request_alloc(fm, GFP_KERNEL);
1412 if (!req) {
1413 kfree(d);
1414 fuse_drop_waiting(fc);
1415 goto fallback;
1416 }
1417
1418 memset(&d->args, 0, sizeof(d->args));
1419 d->inarg.nlookup = forget->forget_one.nlookup;
1420 d->args.opcode = FUSE_FORGET;
1421 d->args.nodeid = forget->forget_one.nodeid;
1422 d->args.in_numargs = 1;
1423 d->args.in_args[0].size = sizeof(d->inarg);
1424 d->args.in_args[0].value = &d->inarg;
1425 d->args.force = true;
1426 d->args.noreply = true;
1427 d->args.end = fuse_forget_uring_free;
1428
1429 kfree(forget);
1430
1431 fuse_force_creds(req);
1432 __set_bit(FR_WAITING, &req->flags);
> 1433 if (!d->args.abort_on_kill)
1434 __set_bit(FR_FORCE, &req->flags);
1435 fuse_adjust_compat(fc, &d->args);
1436 fuse_args_to_req(req, &d->args);
1437 req->in.h.len = sizeof(struct fuse_in_header) +
1438 fuse_len_args(req->args->in_numargs,
1439 (struct fuse_arg *)req->args->in_args);
1440
1441 fuse_uring_queue_fuse_req(fiq, req);
1442 return;
1443
1444 fallback:
1445 fuse_dev_queue_forget_list(fiq, forget);
1446 }
1447
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v2] fuse: Send FORGET over io_uring when ring is ready
2026-04-03 3:57 [PATCH v2] fuse: Send FORGET over io_uring when ring is ready Li Wang
2026-04-03 19:00 ` Joanne Koong
2026-04-08 1:08 ` kernel test robot
@ 2026-04-08 5:03 ` kernel test robot
2026-04-08 5:06 ` kernel test robot
2026-04-08 5:06 ` kernel test robot
4 siblings, 0 replies; 6+ messages in thread
From: kernel test robot @ 2026-04-08 5:03 UTC (permalink / raw)
To: Li Wang, Miklos Szeredi, Bernd Schubert
Cc: oe-kbuild-all, linux-fsdevel, linux-kernel, Li Wang
Hi Li,
kernel test robot noticed the following build errors:
[auto build test ERROR on v7.0-rc7]
[also build test ERROR on linus/master]
[cannot apply to mszeredi-fuse/for-next next-20260407]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Li-Wang/fuse-Send-FORGET-over-io_uring-when-ring-is-ready/20260408-015226
base: v7.0-rc7
patch link: https://lore.kernel.org/r/20260403035752.20206-1-liwang%40kylinos.cn
patch subject: [PATCH v2] fuse: Send FORGET over io_uring when ring is ready
config: m68k-defconfig (https://download.01.org/0day-ci/archive/20260408/202604081238.PU4HPayI-lkp@intel.com/config)
compiler: m68k-linux-gcc (GCC) 15.2.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20260408/202604081238.PU4HPayI-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202604081238.PU4HPayI-lkp@intel.com/
All errors (new ones prefixed by >>):
fs/fuse/dev_uring.c: In function 'fuse_io_uring_send_forget':
>> fs/fuse/dev_uring.c:1433:21: error: 'struct fuse_args' has no member named 'abort_on_kill'
1433 | if (!d->args.abort_on_kill)
| ^
vim +1433 fs/fuse/dev_uring.c
1378
1379 /*
1380 * Send FUSE_FORGET through the io-uring ring when active; same payload as
1381 * fuse_read_single_forget(), with userspace committing like any other request.
1382 * Called from fuse_dev_queue_forget() when fuse_uring_ready().
1383 */
1384 void fuse_io_uring_send_forget(struct fuse_iqueue *fiq,
1385 struct fuse_forget_link *forget)
1386 {
1387 struct fuse_conn *fc = container_of(fiq, struct fuse_conn, iq);
1388 struct fuse_mount *fm;
1389 struct fuse_req *req;
1390 struct fuse_forget_uring_data *d;
1391
1392 if (!fuse_uring_ready(fc)) {
1393 fuse_dev_queue_forget_list(fiq, forget);
1394 return;
1395 }
1396
1397 down_read(&fc->killsb);
1398 if (list_empty(&fc->mounts)) {
1399 up_read(&fc->killsb);
1400 fuse_dev_queue_forget_list(fiq, forget);
1401 return;
1402 }
1403 fm = list_first_entry(&fc->mounts, struct fuse_mount, fc_entry);
1404 up_read(&fc->killsb);
1405
1406 d = kmalloc(sizeof(*d), GFP_KERNEL);
1407 if (!d)
1408 goto fallback;
1409
1410 atomic_inc(&fc->num_waiting);
1411 req = fuse_request_alloc(fm, GFP_KERNEL);
1412 if (!req) {
1413 kfree(d);
1414 fuse_drop_waiting(fc);
1415 goto fallback;
1416 }
1417
1418 memset(&d->args, 0, sizeof(d->args));
1419 d->inarg.nlookup = forget->forget_one.nlookup;
1420 d->args.opcode = FUSE_FORGET;
1421 d->args.nodeid = forget->forget_one.nodeid;
1422 d->args.in_numargs = 1;
1423 d->args.in_args[0].size = sizeof(d->inarg);
1424 d->args.in_args[0].value = &d->inarg;
1425 d->args.force = true;
1426 d->args.noreply = true;
1427 d->args.end = fuse_forget_uring_free;
1428
1429 kfree(forget);
1430
1431 fuse_force_creds(req);
1432 __set_bit(FR_WAITING, &req->flags);
> 1433 if (!d->args.abort_on_kill)
1434 __set_bit(FR_FORCE, &req->flags);
1435 fuse_adjust_compat(fc, &d->args);
1436 fuse_args_to_req(req, &d->args);
1437 req->in.h.len = sizeof(struct fuse_in_header) +
1438 fuse_len_args(req->args->in_numargs,
1439 (struct fuse_arg *)req->args->in_args);
1440
1441 fuse_uring_queue_fuse_req(fiq, req);
1442 return;
1443
1444 fallback:
1445 fuse_dev_queue_forget_list(fiq, forget);
1446 }
1447
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v2] fuse: Send FORGET over io_uring when ring is ready
2026-04-03 3:57 [PATCH v2] fuse: Send FORGET over io_uring when ring is ready Li Wang
` (2 preceding siblings ...)
2026-04-08 5:03 ` kernel test robot
@ 2026-04-08 5:06 ` kernel test robot
2026-04-08 5:06 ` kernel test robot
4 siblings, 0 replies; 6+ messages in thread
From: kernel test robot @ 2026-04-08 5:06 UTC (permalink / raw)
To: Li Wang, Miklos Szeredi, Bernd Schubert
Cc: llvm, oe-kbuild-all, linux-fsdevel, linux-kernel, Li Wang
Hi Li,
kernel test robot noticed the following build errors:
[auto build test ERROR on v7.0-rc7]
[also build test ERROR on linus/master]
[cannot apply to mszeredi-fuse/for-next next-20260407]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Li-Wang/fuse-Send-FORGET-over-io_uring-when-ring-is-ready/20260408-015226
base: v7.0-rc7
patch link: https://lore.kernel.org/r/20260403035752.20206-1-liwang%40kylinos.cn
patch subject: [PATCH v2] fuse: Send FORGET over io_uring when ring is ready
config: x86_64-kexec (https://download.01.org/0day-ci/archive/20260408/202604080700.IbiaCWad-lkp@intel.com/config)
compiler: clang version 20.1.8 (https://github.com/llvm/llvm-project 87f0227cb60147a26a1eeb4fb06e3b505e9c7261)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20260408/202604080700.IbiaCWad-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202604080700.IbiaCWad-lkp@intel.com/
All errors (new ones prefixed by >>):
>> fs/fuse/dev_uring.c:1433:15: error: no member named 'abort_on_kill' in 'struct fuse_args'
1433 | if (!d->args.abort_on_kill)
| ~~~~~~~ ^
1 error generated.
vim +1433 fs/fuse/dev_uring.c
1378
1379 /*
1380 * Send FUSE_FORGET through the io-uring ring when active; same payload as
1381 * fuse_read_single_forget(), with userspace committing like any other request.
1382 * Called from fuse_dev_queue_forget() when fuse_uring_ready().
1383 */
1384 void fuse_io_uring_send_forget(struct fuse_iqueue *fiq,
1385 struct fuse_forget_link *forget)
1386 {
1387 struct fuse_conn *fc = container_of(fiq, struct fuse_conn, iq);
1388 struct fuse_mount *fm;
1389 struct fuse_req *req;
1390 struct fuse_forget_uring_data *d;
1391
1392 if (!fuse_uring_ready(fc)) {
1393 fuse_dev_queue_forget_list(fiq, forget);
1394 return;
1395 }
1396
1397 down_read(&fc->killsb);
1398 if (list_empty(&fc->mounts)) {
1399 up_read(&fc->killsb);
1400 fuse_dev_queue_forget_list(fiq, forget);
1401 return;
1402 }
1403 fm = list_first_entry(&fc->mounts, struct fuse_mount, fc_entry);
1404 up_read(&fc->killsb);
1405
1406 d = kmalloc(sizeof(*d), GFP_KERNEL);
1407 if (!d)
1408 goto fallback;
1409
1410 atomic_inc(&fc->num_waiting);
1411 req = fuse_request_alloc(fm, GFP_KERNEL);
1412 if (!req) {
1413 kfree(d);
1414 fuse_drop_waiting(fc);
1415 goto fallback;
1416 }
1417
1418 memset(&d->args, 0, sizeof(d->args));
1419 d->inarg.nlookup = forget->forget_one.nlookup;
1420 d->args.opcode = FUSE_FORGET;
1421 d->args.nodeid = forget->forget_one.nodeid;
1422 d->args.in_numargs = 1;
1423 d->args.in_args[0].size = sizeof(d->inarg);
1424 d->args.in_args[0].value = &d->inarg;
1425 d->args.force = true;
1426 d->args.noreply = true;
1427 d->args.end = fuse_forget_uring_free;
1428
1429 kfree(forget);
1430
1431 fuse_force_creds(req);
1432 __set_bit(FR_WAITING, &req->flags);
> 1433 if (!d->args.abort_on_kill)
1434 __set_bit(FR_FORCE, &req->flags);
1435 fuse_adjust_compat(fc, &d->args);
1436 fuse_args_to_req(req, &d->args);
1437 req->in.h.len = sizeof(struct fuse_in_header) +
1438 fuse_len_args(req->args->in_numargs,
1439 (struct fuse_arg *)req->args->in_args);
1440
1441 fuse_uring_queue_fuse_req(fiq, req);
1442 return;
1443
1444 fallback:
1445 fuse_dev_queue_forget_list(fiq, forget);
1446 }
1447
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v2] fuse: Send FORGET over io_uring when ring is ready
2026-04-03 3:57 [PATCH v2] fuse: Send FORGET over io_uring when ring is ready Li Wang
` (3 preceding siblings ...)
2026-04-08 5:06 ` kernel test robot
@ 2026-04-08 5:06 ` kernel test robot
4 siblings, 0 replies; 6+ messages in thread
From: kernel test robot @ 2026-04-08 5:06 UTC (permalink / raw)
To: Li Wang, Miklos Szeredi, Bernd Schubert
Cc: oe-kbuild-all, linux-fsdevel, linux-kernel, Li Wang
Hi Li,
kernel test robot noticed the following build errors:
[auto build test ERROR on v7.0-rc7]
[also build test ERROR on linus/master]
[cannot apply to mszeredi-fuse/for-next next-20260407]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Li-Wang/fuse-Send-FORGET-over-io_uring-when-ring-is-ready/20260408-015226
base: v7.0-rc7
patch link: https://lore.kernel.org/r/20260403035752.20206-1-liwang%40kylinos.cn
patch subject: [PATCH v2] fuse: Send FORGET over io_uring when ring is ready
config: x86_64-rhel-9.4-ltp (https://download.01.org/0day-ci/archive/20260408/202604080703.edi7Btyb-lkp@intel.com/config)
compiler: gcc-14 (Debian 14.2.0-19) 14.2.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20260408/202604080703.edi7Btyb-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202604080703.edi7Btyb-lkp@intel.com/
All errors (new ones prefixed by >>):
fs/fuse/dev_uring.c: In function 'fuse_io_uring_send_forget':
>> fs/fuse/dev_uring.c:1433:21: error: 'struct fuse_args' has no member named 'abort_on_kill'
1433 | if (!d->args.abort_on_kill)
| ^
vim +1433 fs/fuse/dev_uring.c
1378
1379 /*
1380 * Send FUSE_FORGET through the io-uring ring when active; same payload as
1381 * fuse_read_single_forget(), with userspace committing like any other request.
1382 * Called from fuse_dev_queue_forget() when fuse_uring_ready().
1383 */
1384 void fuse_io_uring_send_forget(struct fuse_iqueue *fiq,
1385 struct fuse_forget_link *forget)
1386 {
1387 struct fuse_conn *fc = container_of(fiq, struct fuse_conn, iq);
1388 struct fuse_mount *fm;
1389 struct fuse_req *req;
1390 struct fuse_forget_uring_data *d;
1391
1392 if (!fuse_uring_ready(fc)) {
1393 fuse_dev_queue_forget_list(fiq, forget);
1394 return;
1395 }
1396
1397 down_read(&fc->killsb);
1398 if (list_empty(&fc->mounts)) {
1399 up_read(&fc->killsb);
1400 fuse_dev_queue_forget_list(fiq, forget);
1401 return;
1402 }
1403 fm = list_first_entry(&fc->mounts, struct fuse_mount, fc_entry);
1404 up_read(&fc->killsb);
1405
1406 d = kmalloc(sizeof(*d), GFP_KERNEL);
1407 if (!d)
1408 goto fallback;
1409
1410 atomic_inc(&fc->num_waiting);
1411 req = fuse_request_alloc(fm, GFP_KERNEL);
1412 if (!req) {
1413 kfree(d);
1414 fuse_drop_waiting(fc);
1415 goto fallback;
1416 }
1417
1418 memset(&d->args, 0, sizeof(d->args));
1419 d->inarg.nlookup = forget->forget_one.nlookup;
1420 d->args.opcode = FUSE_FORGET;
1421 d->args.nodeid = forget->forget_one.nodeid;
1422 d->args.in_numargs = 1;
1423 d->args.in_args[0].size = sizeof(d->inarg);
1424 d->args.in_args[0].value = &d->inarg;
1425 d->args.force = true;
1426 d->args.noreply = true;
1427 d->args.end = fuse_forget_uring_free;
1428
1429 kfree(forget);
1430
1431 fuse_force_creds(req);
1432 __set_bit(FR_WAITING, &req->flags);
> 1433 if (!d->args.abort_on_kill)
1434 __set_bit(FR_FORCE, &req->flags);
1435 fuse_adjust_compat(fc, &d->args);
1436 fuse_args_to_req(req, &d->args);
1437 req->in.h.len = sizeof(struct fuse_in_header) +
1438 fuse_len_args(req->args->in_numargs,
1439 (struct fuse_arg *)req->args->in_args);
1440
1441 fuse_uring_queue_fuse_req(fiq, req);
1442 return;
1443
1444 fallback:
1445 fuse_dev_queue_forget_list(fiq, forget);
1446 }
1447
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2026-04-08 5:06 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-04-03 3:57 [PATCH v2] fuse: Send FORGET over io_uring when ring is ready Li Wang
2026-04-03 19:00 ` Joanne Koong
2026-04-08 1:08 ` kernel test robot
2026-04-08 5:03 ` kernel test robot
2026-04-08 5:06 ` kernel test robot
2026-04-08 5:06 ` kernel test robot
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox