Re: [PATCH v2 19/21] fuse: add passthrough setattr
Joanne Koong <[email protected]> Fri, 15 May 2026 18:04:09 -0700
| Newsgroups | org.kernel.vger.linux-unionfs,dev.linux.lists.fuse-devel |
|---|---|
| Message-ID | <CAJnrk1bm=QOmY9MNZf5rbi-aTLaYetJ2Ziu7A5q9m4MMy5-Y7A@mail.gmail.com> |
On Fri, May 15, 2026 at 5:53 PM Joanne Koong <[email protected]> wrote: > > Add passthrough setattr which sets attributes directly on the backing > inode through backing_inode_setattr() instead of sending FUSE_SETATTR to > the server. > > Passthrough setattr is checked before the > handle_killpriv/handle_killpriv_v2 suid/sgid stripping because the > stripping is handled natively by notify_change() on the backing inode. > > Signed-off-by: Joanne Koong <[email protected]> > --- > fs/fuse/dir.c | 3 +++ > fs/fuse/fuse_i.h | 3 ++- > fs/fuse/passthrough.c | 28 ++++++++++++++++++++++++++++ > include/uapi/linux/fuse.h | 1 + > 4 files changed, 34 insertions(+), 1 deletion(-) > > diff --git a/fs/fuse/dir.c b/fs/fuse/dir.c > index 4c7e3e1604af..b67b3b334e69 100644 > --- a/fs/fuse/dir.c > +++ b/fs/fuse/dir.c > @@ -2506,6 +2506,9 @@ static int fuse_setattr(struct mnt_idmap *idmap, struct dentry *entry, > if (!fuse_allow_current_process(get_fuse_conn(inode))) > return -EACCES; > > + if (fuse_passthrough_op(inode, FUSE_SETATTR)) > + return fuse_passthrough_setattr(entry, attr); In the v1 discussion [1], there was a suggestion about gating FUSE_PASSTHROUGH_INO on FUSE_HANDLE_KILLPRIV_V2 to avoid the non-atomic killpriv path, but I think we were only encountering the non-atomic killpriv path because I was calling fuse_passthrough_setattr() in the wrong place. I think we can avoid this altogether by just having the backing filesystem handle all of the suid/sgid stripping atomically through its own notify_change() path, which will let us skip all the fuse killpriv handling logic in this function. Thanks, Joanne [1] https://lore.kernel.org/fuse-devel/CAOQ4uxipQJt5zskb_THxueGi_MXpFdywFiGpd_nmWeY_sMHwzQ@mail.gmail.com/ > + > if (attr->ia_valid & (ATTR_KILL_SUID | ATTR_KILL_SGID)) { > attr->ia_valid &= ~(ATTR_KILL_SUID | ATTR_KILL_SGID | > ATTR_MODE);