On Thu, 28 Aug 2025 at 18:30, Luis Henriques <luis@xxxxxxxxxx> wrote: > > With the infrastructure introduced to periodically invalidate expired > dentries, it is now possible to add an extra work queue to invalidate > dentries when an epoch is incremented. This work queue will only be > triggered when the 'inval_wq' parameter is set. > > Signed-off-by: Luis Henriques <luis@xxxxxxxxxx> > --- > fs/fuse/dev.c | 7 ++++--- > fs/fuse/dir.c | 34 ++++++++++++++++++++++++++++++++++ > fs/fuse/fuse_i.h | 4 ++++ > fs/fuse/inode.c | 41 ++++++++++++++++++++++------------------- > 4 files changed, 64 insertions(+), 22 deletions(-) > > diff --git a/fs/fuse/dev.c b/fs/fuse/dev.c > index e80cd8f2c049..48c5c01c3e5b 100644 > --- a/fs/fuse/dev.c > +++ b/fs/fuse/dev.c > @@ -2033,13 +2033,14 @@ static int fuse_notify_resend(struct fuse_conn *fc) > > /* > * Increments the fuse connection epoch. This will result of dentries from > - * previous epochs to be invalidated. > - * > - * XXX optimization: add call to shrink_dcache_sb()? I guess it wouldn't hurt. Definitely simpler, so I'd opt for this. > void fuse_conn_put(struct fuse_conn *fc) > { > - if (refcount_dec_and_test(&fc->count)) { > - struct fuse_iqueue *fiq = &fc->iq; > - struct fuse_sync_bucket *bucket; > - > - if (IS_ENABLED(CONFIG_FUSE_DAX)) > - fuse_dax_conn_free(fc); > - if (fc->timeout.req_timeout) > - cancel_delayed_work_sync(&fc->timeout.work); > - if (fiq->ops->release) > - fiq->ops->release(fiq); > - put_pid_ns(fc->pid_ns); > - bucket = rcu_dereference_protected(fc->curr_bucket, 1); > - if (bucket) { > - WARN_ON(atomic_read(&bucket->count) != 1); > - kfree(bucket); > - } > - if (IS_ENABLED(CONFIG_FUSE_PASSTHROUGH)) > - fuse_backing_files_free(fc); > - call_rcu(&fc->rcu, delayed_release); > + struct fuse_iqueue *fiq = &fc->iq; > + struct fuse_sync_bucket *bucket; > + > + if (!refcount_dec_and_test(&fc->count)) > + return; Please don't do this. It's difficult to see what actually changed this way. Thanks, Miklos