[GIT PULL] fs idmapping updates

From: Christian Brauner
Date: Mon Jan 10 2022 - 07:58:30 EST


Hi Linus,

/* Summary */
This contains the work to enable the idmapping infrastructure to support
idmapped mounts of filesystems mounted with an idmapping. In addition this
contains various cleanups that avoid repeated open-coding of the same
functionality and simplify the code in quite a few places. We also finish
the renaming of the mapping helpers we started a few kernel releases back
and move them to a dedicated header to not continue polluting the fs
header needlessly with low-level idmapping helpers. With this series the fs
header only contains idmapping helpers that interact with fs objects.

Currently we only support idmapped mounts for filesystems mounted without
an idmapping themselves. This was a conscious decision mentioned in
multiple places (cf. [1]).

As explained at length in [3] it is perfectly fine to extend support for
idmapped mounts to filesystem's mounted with an idmapping should the need
arise. The need has been there for some time now (cf. [2]).

Before we can port any filesystem that is mountable with an idmapping to
support idmapped mounts in the coming cycles, we need to first extend the
mapping helpers to account for the filesystem's idmapping. This again, is
explained at length in our documentation at [3] and also in the individual
commit messages so here's an overview.

Currently, the low-level mapping helpers implement the remapping algorithms
described in [3] in a simplified manner as we could rely on the fact
that all filesystems supporting idmapped mounts are mounted without an
idmapping.

In contrast, filesystems mounted with an idmapping are very likely to not
use an identity mapping and will instead use a non-identity mapping. So the
translation step from or into the filesystem's idmapping in the remapping
algorithm cannot be skipped for such filesystems.

Non-idmapped filesystems and filesystems not supporting idmapped mounts are
unaffected by this change as the remapping algorithms can take the same
shortcut as before. If the low-level helpers detect that they are dealing
with an idmapped mount but the underlying filesystem is mounted without an
idmapping we can rely on the previous shortcut and can continue to skip the
translation step from or into the filesystem's idmapping. And of course, if
the low-level helpers detect that they are not dealing with an idmapped
mount they can simply return the relevant id unchanged; no remapping needs
to be performed at all.

These checks guarantee that only the minimal amount of work is performed.
As before, if idmapped mounts aren't used the low-level helpers are
idempotent and no work is performed at all.

Link: [1] commit 2ca4dcc4909d ("fs/mount_setattr: tighten permission checks")
Link: [2] https://github.com/containers/podman/issues/10374
Link: [3] Documentations/filesystems/idmappings.rst
Link: [4] commit a65e58e791a1 ("fs: document and rename fsid helpers")

/* Testing */
All patches are based on v5.16-rc3 and have been sitting in linux-next. No
build failures or warnings were observed and fstests are passing:

SECTION -- xfs
RECREATING -- xfs on /dev/loop4
FSTYP -- xfs (debug)
PLATFORM -- Linux/x86_64 f2-vm 5.16.0-fs.idmapped.v5.17-88a4b8c3b3c3 #42 SMP PREEMPT Mon Jan 10 10:57:44 UTC 2022
MKFS_OPTIONS -- -f -f /dev/loop5
MOUNT_OPTIONS -- /dev/loop5 /mnt/scratch

generic/633 25s ... 26s
generic/644 4s ... 16s
generic/645 209s ... 77s
generic/656 14s ... 17s
xfs/152 75s ... 70s
xfs/153 48s ... 43s
Ran: generic/633 generic/644 generic/645 generic/656 xfs/152 xfs/153
Passed all 6 tests

SECTION -- ext4
RECREATING -- ext4 on /dev/loop4
FSTYP -- ext4
PLATFORM -- Linux/x86_64 f2-vm 5.16.0-fs.idmapped.v5.17-88a4b8c3b3c3 #42 SMP PREEMPT Mon Jan 10 10:57:44 UTC 2022
MKFS_OPTIONS -- -F -F /dev/loop5
MOUNT_OPTIONS -- -o acl,user_xattr /dev/loop5 /mnt/scratch

generic/633 26s ... 17s
generic/644 16s ... 4s
generic/645 77s ... 58s
generic/656 17s ... 8s
Ran: generic/633 generic/644 generic/645 generic/656
Passed all 4 tests

SECTION -- btrfs
RECREATING -- btrfs on /dev/loop4
FSTYP -- btrfs
PLATFORM -- Linux/x86_64 f2-vm 5.16.0-fs.idmapped.v5.17-88a4b8c3b3c3 #42 SMP PREEMPT Mon Jan 10 10:57:44 UTC 2022
MKFS_OPTIONS -- -f /dev/loop5
MOUNT_OPTIONS -- /dev/loop5 /mnt/scratch

btrfs/245 11s ... 11s
generic/633 17s ... 21s
generic/644 4s ... 6s
generic/645 58s ... 60s
generic/656 8s ... 8s
Ran: btrfs/245 generic/633 generic/644 generic/645 generic/656
Passed all 5 tests

SECTION -- xfs
=========================
Ran: generic/633 generic/644 generic/645 generic/656 xfs/152 xfs/153
Passed all 6 tests

SECTION -- ext4
=========================
Ran: generic/633 generic/644 generic/645 generic/656
Passed all 4 tests

SECTION -- btrfs
=========================
Ran: btrfs/245 generic/633 generic/644 generic/645 generic/656
Passed all 5 tests

/* Conflicts */
At the time of creating this PR no merge conflicts showed up doing a test-merge
with current mainline.

There's a merge conflict reported from -next with David's fscache rewrite.
Although I'm not sure David still intends to send it for the v5.17 merge window
we covered the conflict in thread [1] where stated in [2] that the conflict is
trivial enough for you to resolve during the merge. (I'm posting the links so
you can double-check.)

[1]: https://lore.kernel.org/linux-fsdevel/20211207142405.179428-1-brauner@xxxxxxxxxx
[2]: https://lore.kernel.org/linux-fsdevel/CAHk-=wjjxBRNkav+RjpdHjDZHRPAJgjdM4wTFi_oEnk0_dc67g@xxxxxxxxxxxxxx

At the time of creating this PR no merge conflicts were reported from
linux-next and no merge conflicts showed up doing a test-merge with current
mainline.

The following changes since commit d58071a8a76d779eedab38033ae4c821c30295a5:

Linux 5.16-rc3 (2021-11-28 14:09:19 -0800)

are available in the Git repository at:

git@xxxxxxxxxxxxxxxxxxx:pub/scm/linux/kernel/git/brauner/linux tags/fs.idmapped.v5.17

for you to fetch changes up to bd303368b776eead1c29e6cdda82bde7128b82a7:

fs: support mapped mounts of mapped filesystems (2021-12-05 10:28:57 +0100)

Please consider pulling these changes from the signed fs.idmapped.v5.17 tag.

Thanks!
Christian

----------------------------------------------------------------
fs.idmapped.v5.17

----------------------------------------------------------------
Christian Brauner (10):
fs: add is_idmapped_mnt() helper
fs: move mapping helpers
fs: tweak fsuidgid_has_mapping()
fs: account for filesystem mappings
docs: update mapping documentation
fs: use low-level mapping helpers
fs: remove unused low-level mapping helpers
fs: port higher-level mapping helpers
fs: add i_user_ns() helper
fs: support mapped mounts of mapped filesystems

Documentation/filesystems/idmappings.rst | 72 ----------
fs/cachefiles/bind.c | 2 +-
fs/ecryptfs/main.c | 2 +-
fs/ksmbd/smbacl.c | 19 +--
fs/ksmbd/smbacl.h | 5 +-
fs/namespace.c | 53 +++++--
fs/nfsd/export.c | 2 +-
fs/open.c | 8 +-
fs/overlayfs/super.c | 2 +-
fs/posix_acl.c | 17 ++-
fs/proc_namespace.c | 2 +-
fs/xfs/xfs_inode.c | 8 +-
fs/xfs/xfs_linux.h | 1 +
fs/xfs/xfs_symlink.c | 4 +-
include/linux/fs.h | 141 ++++++-------------
include/linux/mnt_idmapping.h | 234 +++++++++++++++++++++++++++++++
security/commoncap.c | 15 +-
17 files changed, 356 insertions(+), 231 deletions(-)
create mode 100644 include/linux/mnt_idmapping.h