• Christian Brauner's avatar
    tests: add mount_setattr() selftests · 01eadc8d
    Christian Brauner authored
    Add a range of selftests for the new mount_setattr() syscall to verify
    that it works as expected. This tests that:
    - no invalid flags can be specified
    - changing properties of a single mount works and leaves other mounts in
      the mount tree unchanged
    - changing a mount tre to read-only when one of the mounts has writers
      fails and leaves the whole mount tree unchanged
    - changing mount properties from multiple threads works
    - changing atime settings works
    - changing mount propagation works
    - changing the mount options of a mount tree where the individual mounts
      in the tree have different mount options only changes the flags that
      were requested to change
    - changing mount options from another mount namespace fails
    - changing mount options from another user namespace fails
    - idmapped mounts
    
    Note, the main test-suite for idmapped mounts is part of xfstests and is
    pretty huge. These tests here just make sure that the syscalls bits work
    correctly.
    
     TAP version 13
     1..20
     # Starting 20 tests from 3 test cases.
     #  RUN           mount_setattr.invalid_attributes ...
     #            OK  mount_setattr.invalid_attributes
     ok 1 mount_setattr.invalid_attributes
     #  RUN           mount_setattr.extensibility ...
     #            OK  mount_setattr.extensibility
     ok 2 mount_setattr.extensibility
     #  RUN           mount_setattr.basic ...
     #            OK  mount_setattr.basic
     ok 3 mount_setattr.basic
     #  RUN           mount_setattr.basic_recursive ...
     #            OK  mount_setattr.basic_recursive
     ok 4 mount_setattr.basic_recursive
     #  RUN           mount_setattr.mount_has_writers ...
     #            OK  mount_setattr.mount_has_writers
     ok 5 mount_setattr.mount_has_writers
     #  RUN           mount_setattr.mixed_mount_options ...
     #            OK  mount_setattr.mixed_mount_options
     ok 6 mount_setattr.mixed_mount_options
     #  RUN           mount_setattr.time_changes ...
     #            OK  mount_setattr.time_changes
     ok 7 mount_setattr.time_changes
     #  RUN           mount_setattr.multi_threaded ...
     #            OK  mount_setattr.multi_threaded
     ok 8 mount_setattr.multi_threaded
     #  RUN           mount_setattr.wrong_user_namespace ...
     #            OK  mount_setattr.wrong_user_namespace
     ok 9 mount_setattr.wrong_user_namespace
     #  RUN           mount_setattr.wrong_mount_namespace ...
     #            OK  mount_setattr.wrong_mount_namespace
     ok 10 mount_setattr.wrong_mount_namespace
     #  RUN           mount_setattr_idmapped.invalid_fd_negative ...
     #            OK  mount_setattr_idmapped.invalid_fd_negative
     ok 11 mount_setattr_idmapped.invalid_fd_negative
     #  RUN           mount_setattr_idmapped.invalid_fd_large ...
     #            OK  mount_setattr_idmapped.invalid_fd_large
     ok 12 mount_setattr_idmapped.invalid_fd_large
     #  RUN           mount_setattr_idmapped.invalid_fd_closed ...
     #            OK  mount_setattr_idmapped.invalid_fd_closed
     ok 13 mount_setattr_idmapped.invalid_fd_closed
     #  RUN           mount_setattr_idmapped.invalid_fd_initial_userns ...
     #            OK  mount_setattr_idmapped.invalid_fd_initial_userns
     ok 14 mount_setattr_idmapped.invalid_fd_initial_userns
     #  RUN           mount_setattr_idmapped.attached_mount_inside_current_mount_namespace ...
     #            OK  mount_setattr_idmapped.attached_mount_inside_current_mount_namespace
     ok 15 mount_setattr_idmapped.attached_mount_inside_current_mount_namespace
     #  RUN           mount_setattr_idmapped.attached_mount_outside_current_mount_namespace ...
     #            OK  mount_setattr_idmapped.attached_mount_outside_current_mount_namespace
     ok 16 mount_setattr_idmapped.attached_mount_outside_current_mount_namespace
     #  RUN           mount_setattr_idmapped.detached_mount_inside_current_mount_namespace ...
     #            OK  mount_setattr_idmapped.detached_mount_inside_current_mount_namespace
     ok 17 mount_setattr_idmapped.detached_mount_inside_current_mount_namespace
     #  RUN           mount_setattr_idmapped.detached_mount_outside_current_mount_namespace ...
     #            OK  mount_setattr_idmapped.detached_mount_outside_current_mount_namespace
     ok 18 mount_setattr_idmapped.detached_mount_outside_current_mount_namespace
     #  RUN           mount_setattr_idmapped.change_idmapping ...
     #            OK  mount_setattr_idmapped.change_idmapping
     ok 19 mount_setattr_idmapped.change_idmapping
     #  RUN           mount_setattr_idmapped.idmap_mount_tree_invalid ...
     #            OK  mount_setattr_idmapped.idmap_mount_tree_invalid
     ok 20 mount_setattr_idmapped.idmap_mount_tree_invalid
     # PASSED: 20 / 20 tests passed.
     # Totals: pass:20 fail:0 xfail:0 xpass:0 skip:0 error:0
    
    Link: https://lore.kernel.org/r/20210121131959.646623-37-christian.brauner@ubuntu.com
    Cc: Christoph Hellwig <hch@lst.de>
    Cc: David Howells <dhowells@redhat.com>
    Cc: Al Viro <viro@zeniv.linux.org.uk>
    Cc: linux-fsdevel@vger.kernel.org
    Signed-off-by: default avatarChristian Brauner <christian.brauner@ubuntu.com>
    01eadc8d
mount_setattr_test.c 35.6 KB