On Wed, Jun 18, 2025 at 2:00 PM d.privalov <d.privalov@xxxxxx> wrote: > > From: Miklos Szeredi <mszeredi@xxxxxxxxxx> > > commit 97f044f690bac2b094bfb7fb2d177ef946c85880 upstream. > > The fuse_iget() call in create_new_entry() already updated the inode with > all the new attributes and incremented the attribute version. > > Incrementing the nlink will result in the wrong count. This wasn't noticed > because the attributes were invalidated right after this. > > Updating ctime is still needed for the writeback case when the ctime is not > refreshed. > > Signed-off-by: Miklos Szeredi <mszeredi@xxxxxxxxxx> > Signed-off-by: Dmitriy Privalov <d.privalov@xxxxxx> > --- > fs/fuse/dir.c | 29 ++++++++++------------------- > 1 file changed, 10 insertions(+), 19 deletions(-) > > diff --git a/fs/fuse/dir.c b/fs/fuse/dir.c > index 4488a53a192d..7055fdc1b8ce 100644 > --- a/fs/fuse/dir.c > +++ b/fs/fuse/dir.c > @@ -807,7 +807,7 @@ void fuse_flush_time_update(struct inode *inode) > mapping_set_error(inode->i_mapping, err); > } > > -void fuse_update_ctime(struct inode *inode) > +static void fuse_update_ctime_in_cache(struct inode *inode) > { Backport is wrong. In the original patch we have - fuse_invalidate_attr(inode); And that line comes from 371e8fd02969 ("fuse: move fuse_invalidate_attr() into fuse_update_ctime()") in v5.16. The fix is to not introduce fuse_update_ctime_in_cache(), because fuse_update_ctime() is already doing that. Thanks, Miklos