Re: [PATCH 07/14] libfuse: add a reply function to send FUSE_ATTR_* to the kernel

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Fri, Jul 18, 2025 at 5:48 PM Darrick J. Wong <djwong@xxxxxxxxxx> wrote:
>
> On Fri, Jul 18, 2025 at 04:10:18PM +0200, Amir Goldstein wrote:
> > On Fri, Jul 18, 2025 at 1:36 AM Darrick J. Wong <djwong@xxxxxxxxxx> wrote:
> > >
> > > From: Darrick J. Wong <djwong@xxxxxxxxxx>
> > >
> > > Create new fuse_reply_{attr,create,entry}_iflags functions so that we
> > > can send FUSE_ATTR_* flags to the kernel when instantiating an inode.
> > > Servers are expected to send FUSE_IFLAG_* values, which will be
> > > translated into what the kernel can understand.
> > >
> > > Signed-off-by: "Darrick J. Wong" <djwong@xxxxxxxxxx>
> > > ---
> > >  include/fuse_common.h   |    3 ++
> > >  include/fuse_lowlevel.h |   87 +++++++++++++++++++++++++++++++++++++++++++++--
> > >  lib/fuse_lowlevel.c     |   69 ++++++++++++++++++++++++++++++-------
> > >  lib/fuse_versionscript  |    4 ++
> > >  4 files changed, 146 insertions(+), 17 deletions(-)
>
> <snip for brevity>
>
> > > diff --git a/lib/fuse_lowlevel.c b/lib/fuse_lowlevel.c
> > > index d26043fa54c036..568db13502a7d7 100644
> > > --- a/lib/fuse_lowlevel.c
> > > +++ b/lib/fuse_lowlevel.c
> > > @@ -545,7 +573,22 @@ int fuse_reply_attr(fuse_req_t req, const struct stat *attr,
> > >         memset(&arg, 0, sizeof(arg));
> > >         arg.attr_valid = calc_timeout_sec(attr_timeout);
> > >         arg.attr_valid_nsec = calc_timeout_nsec(attr_timeout);
> > > -       convert_stat(attr, &arg.attr);
> > > +       convert_stat(attr, &arg.attr, 0);
> > > +
> > > +       return send_reply_ok(req, &arg, size);
> > > +}
> > > +
> > > +int fuse_reply_attr_iflags(fuse_req_t req, const struct stat *attr,
> > > +                          unsigned int iflags, double attr_timeout)
> > > +{
> > > +       struct fuse_attr_out arg;
> > > +       size_t size = req->se->conn.proto_minor < 9 ?
> > > +               FUSE_COMPAT_ATTR_OUT_SIZE : sizeof(arg);
> > > +
> > > +       memset(&arg, 0, sizeof(arg));
> > > +       arg.attr_valid = calc_timeout_sec(attr_timeout);
> > > +       arg.attr_valid_nsec = calc_timeout_nsec(attr_timeout);
> > > +       convert_stat(attr, &arg.attr, iflags);
> > >
> > >         return send_reply_ok(req, &arg, size);
> > >  }
> >
> > I wonder why fuse_reply_attr() is not implemented as a wrapper to
> > fuse_reply_attr_iflags()?
>
> oops.  I meant to convert this one, and apparently forgot. :(
>
> > FWIW, the flags field was added in minor version 23 for
> > FUSE_ATTR_SUBMOUNT, but I guess that doesn't matter here.
>
> <nod> Hopefully nobody will call fuse_reply_attr_iflags when
> proto_minor < 23.  Do I need to check for that explicitly in libfuse and
> zero out iflags?  Or is it safe enough to assume that the os kernel
> ignores flags bits that it doesn't understand and/or are not enabled on
> the fuse_mount?
>

AFAICS the server ignores other flags, so I think it's fine.
It only ever checks the bits it knows about in fuse_iget() and in
fuse_dentry_revalidate() to make sure they did not change.

Thanks,
Amir.





[Index of Archives]     [Linux Ext4 Filesystem]     [Union Filesystem]     [Filesystem Testing]     [Ceph Users]     [Ecryptfs]     [NTFS 3]     [AutoFS]     [Kernel Newbies]     [Share Photos]     [Security]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux Cachefs]     [Reiser Filesystem]     [Linux RAID]     [NTFS 3]     [Samba]     [Device Mapper]     [CEPH Development]

  Powered by Linux