Thank for this patch series!

I'll send more reviews tomorrow, but in the meantime here are some
answers:

On Mon, Sep 28, 2026 at 02:52:02PM +0800, Cai Xinchen wrote:
> Thank you for review!
> 
> I will link the feature request
> (https://github.com/landlock-lsm/linux/issues/11) in the v2 cover letter.
> 
> For https://github.com/landlock-lsm/linux/issues/18, the current
> READ_METADATA cannot solve this problem, and I don't have a good idea for
> now.
> 
> For path_* rename, I'd rather keep the inode_* names:
> 
> * There is precedent for the mismatch: the inode_getattr hook
>   upstream already takes a "const struct path *" (this series just
>   aligns the other metadata hooks with it).
> 
> * The path_* prefix has an established meaning in the LSM hook
>   interface: it denotes the pathname-based (TOMOYO/AppArmor-style)
>   hooks that are invoked at the VFS path level *before* the
>   corresponding inode_* hook, as a paired, duplicate check
>   serving a different class of LSMs.  For example, a chmod(2)
>   currently runs security_path_chmod() (fs/open.c, for TOMOYO and
>   AppArmor) and then, via notify_change(),
>   security_inode_setattr() (for SELinux, Smack and now Landlock);
>   vfs_mknod() similarly calls both security_path_mknod() and
>   security_inode_mknod().  Renaming inode_setattr to
>   path_setattr would put two path_-prefixed hooks with different
>   call contracts into the same syscall, and path_chown(path,
>   uid, gid) next to a path_setattr(path, attr) would read as a
>   redundant pair, even though they belong to different hook
>   families.  Landlock itself already uses the path_* family for
>   its real path-level hooks (e.g. path_truncate for the TRUNCATE
>   right), so mixing renamed inode hooks into that prefix would
>   also blur its own hook table.

I had the same though as Günther on this, but I'll leave that up to
Paul.

Regarding the BPF LSM use case, I don't think it would make a big
difference.  Anyway, some BPF selftests need to be updated at the same
time, which will also make the changes clear to the BPF folks.

> 
> * If the consensus is that these hooks should be renamed, I think
>   that should be a standalone, tree-wide rename series (including
>   inode_getattr), so that BPF programs only break once instead of
>   twice.

As a general rule, please create bisectable patches (e.g. any patch must
pass BPF and Landlock selftests; all dependent kernel code must build).
But new tests still deserve their own patches.

> 
> On 9/26/2026 4:27 PM, Günther Noack wrote:
> > On Thu, Sep 24, 2026 at 06:48:19PM +0800, Cai Xinchen wrote:
> > > This series adds two new Landlock filesystem access rights,
> > > LANDLOCK_ACCESS_FS_READ_METADATA and LANDLOCK_ACCESS_FS_WRITE_METADATA,
> > > which control access to file and directory metadata such as inode
> > > attributes (mode, ownership, timestamps), extended attributes and POSIX
> > > ACLs.  It picks up the work from the "landlock: add chmod and chown
> > > support" series [1] and follows the coarse-grained grouping discussed in
> > > that thread [2]: instead of separate chmod/chown rights, metadata
> > > operations are grouped into one read and one write right.
> > > 
> > > Landlock evaluates access rights on a per-path basis, but the metadata
> > > related LSM hooks (inode_getattr, inode_setattr, inode_setxattr,
> > > inode_getxattr, inode_listxattr, inode_removexattr, inode_set_acl,
> > > inode_get_acl, inode_remove_acl) only receive the dentry of the accessed
> > > object.  Patches 1-7 therefore first pass struct path instead of dentry
> > > through the metadata-related VFS helpers and LSM hooks.  This is a pure
> > > refactoring with no behavior change, split so that every patch builds
> > > and works on its own:
> > > 
> > >    1: notify_change() and its callers
> > >    2: inode_setsecctx hook (must come before 3: the SELinux and Smack
> > >       implementations call __vfs_setxattr_locked internally)
> > >    3: xattr helpers, which also drops a redundant EVM xattr size sanity
> > >       check whose vfs_getxattr() call only has a dentry and therefore
> > >       cannot be migrated to the new path-based signature
> > >    4: POSIX ACL helpers
> > >    5: inode_setattr hook
> > >    6: inode xattr hooks
> > >    7: inode POSIX ACL hooks
> > > 
> > > Two deliberate scoping decisions for this refactor:
> > > 
> > > - The hooks consistently take struct path rather than struct file.  The
> > >    VFS call sites involved (chmod(2), chown(2), utimensat(2), xattr(2)
> > >    and ACL syscalls) operate on paths, and several of them (lstat(2),
> > >    lchown(2), llistxattr(2), ...) have no struct file to begin with.
> > > 
> > > - struct inode_operations->setattr still receives (idmap, dentry, attr).
> > >    Only the VFS boundary (notify_change()) and the LSM hook layer see the
> > >    path, which keeps the refactor contained to fs/attr.c and the LSM
> > >    infrastructure instead of touching every filesystem.
> > > 
> > > Patches 8-12 then implement the new rights, their tests, the sandboxer
> > > sample and the documentation.  Semantics:
> > > 
> > > - READ_METADATA covers stat(2) and friends, getxattr(2) and friends,
> > >    listxattr(2) and friends, and POSIX ACL reads.
> > > - WRITE_METADATA covers chmod(2), chown(2), utimensat(2), setxattr(2),
> > >    removexattr(2) and friends, and POSIX ACL set and remove.
> > > - Only explicit metadata changes requested by user space are restricted.
> > >    Implicit changes performed by the kernel (e.g. timestamp updates on
> > >    write(2), size changes on truncate(2)) are not, and neither are
> > >    chmod(2)/chown(2) calls that change nothing (e.g. chown(2) with
> > >    (-1, -1), which never reaches the hook), matching the SELinux
> > >    inode_setattr behavior.
> > > - Kernel-internal accesses performed with override_creds() (e.g.
> > >    overlayfs, cachefiles) and kernel threads without a Landlock domain
> > >    (e.g. nfsd, ksmbd) are not restricted.
> > > 
> > > The Landlock ABI version is incremented from 11 to 12.
> > > 
> > > The series is based on linux-next commit 5c4d4169604b ("Add linux-next
> > > specific files for 20260921").
> > > 
> > > Testing: each patch has been built for aarch64 (gcc, -Werror) and the
> > > landlock selftests (445 tests, including the new ones) pass in QEMU on
> > > aarch64; base_test reports ABI v12.
> > > 
> > > [1] 
> > > https://lore.kernel.org/all/[email protected]/
> > > [2] 
> > > https://lore.kernel.org/all/[email protected]/
> > Thank you for sending this patch set!
> > 
> > Some meta-remarks at the beginning:
> > 
> > * You might want to link the bugtracker feature request:
> >    https://github.com/landlock-lsm/linux/issues/11
> > * In the final version, I think it's preferred to merge patches 8
> >    (adding the access right enums) and 9 (adding the LSM hooks that use
> >    them).  Having the feature as an atomic commit makes it harder to
> >    accidentally mess it up during a backport, because you can't patch 8
> >    without 9.
> > * As Paul alluded to, the changes to the LSM hook interface and to the
> >    existing callers in VFS are likely the hardest part of this patch
> >    set.  Alexei from the BPF subsystem has also reiterated recently
> >    that he wants BPF to be looped into such changes.  BPF hooks do not
> >    give the same backwards compatibility guarantees as the syscall
> >    layer, but there are existing users of LSM hooks specifically
> >    through the BPF LSM.
> > 
> > * In https://github.com/landlock-lsm/linux/issues/18, we came across
> >    statfs(), which returns file system meta-information based for the
> >    file system that a given file belongs to.  I have weak confidence
> >    that READ_METADATA would be the right access right to protect this
> >    with, but it's a somewhat related operation.  Maybe you have some
> >    thoughts on this?
> > 
> > More concrete questions:
> > 
> > * If a "inode" LSM hook gets a "path" argument now, should it be
> >    renamed from "inode_..." to "path_..."?
> > 
> >    (Maybe the BPF people can chime in about to what extent that would
> >    cause additional churn for BPF users, in a situation where they
> >    anyway already need to make a change due to the changing function
> >    signature?)
> > 
> > –Günther
> 

Reply via email to