On Fri, Dec 08, 2023 at 10:33:10AM +0100, Max Kellermann wrote: > Handling of S_ISGID is usually done by inode_init_owner() in all other > filesystems, but kernfs doesn't use that function. In kernfs, struct > kernfs_node is the primary data structure, and struct inode is only > created from it on demand. Therefore, inode_init_owner() can't be > used and we need to imitate its behavior. > > S_ISGID support is useful for the cgroup filesystem; it allows > subtrees managed by an unprivileged process to retain a certain owner > gid, which then enables sharing access to the subtree with another > unprivileged process. > > Signed-off-by: Max Kellermann <max.kellermann@xxxxxxxxx> > Acked-by: Tejun Heo <tj@xxxxxxxxxx> > -- > v1 -> v2: minor coding style fix (comment) > --- > fs/kernfs/dir.c | 12 ++++++++++++ > 1 file changed, 12 insertions(+) > > diff --git a/fs/kernfs/dir.c b/fs/kernfs/dir.c > index 8b2bd65d70e7..62d39ecf0a46 100644 > --- a/fs/kernfs/dir.c > +++ b/fs/kernfs/dir.c > @@ -676,6 +676,18 @@ struct kernfs_node *kernfs_new_node(struct kernfs_node *parent, > { > struct kernfs_node *kn; > > + if (parent->mode & S_ISGID) { > + /* this code block imitates inode_init_owner() for > + * kernfs > + */ > + > + if (parent->iattr) > + gid = parent->iattr->ia_gid; > + > + if (flags & KERNFS_DIR) > + mode |= S_ISGID; > + } > + > kn = __kernfs_new_node(kernfs_root(parent), parent, > name, mode, uid, gid, flags); > if (kn) { No noticeable regressions with this patch applied. Tested-by: Bagas Sanjaya <bagasdotme@xxxxxxxxx> -- An old man doll... just what I always wanted! - Clara
Attachment:
signature.asc
Description: PGP signature