idmapped_mounts: Prepare for support for more features
authorJan Kara <jack@suse.cz>
Thu, 31 Mar 2022 11:19:19 +0000 (13:19 +0200)
committerZorro Lang <zlang@kernel.org>
Tue, 26 Apr 2022 18:42:02 +0000 (02:42 +0800)
Currently idmapped_mounts tests fail for kernels without CONFIG_USER_NS
because some tests are run despite missing support for idmapped mounts
and they implicitely require user namespace support. Prepare
idmapped_mounts to support more features a test may require to reliably
run.

Signed-off-by: Jan Kara <jack@suse.cz>
Tested-by: Christian Brauner (Microsoft) <brauner@kernel.org>
Reviewed-by: Christian Brauner (Microsoft) <brauner@kernel.org>
Signed-off-by: Zorro Lang <zlang@kernel.org>
src/idmapped-mounts/idmapped-mounts.c

index 4cf6c3bb2a25b1d0c5caabd003b20c90dcc3cb56..d3b27da6c0851426af23f68321fff05d71013159 100644 (file)
@@ -13829,60 +13829,63 @@ static const struct option longopts[] = {
        {NULL,                                  0,                      0,        0},
 };
 
+/* Flags for which functionality is required by the test */
+#define T_REQUIRE_IDMAPPED_MOUNTS (1U << 0)
+
 struct t_idmapped_mounts {
        int (*test)(void);
-       bool require_fs_allow_idmap;
+       unsigned int support_flags;
        const char *description;
 } basic_suite[] = {
-       { acls,                                                         true,   "posix acls on regular mounts",                                                                 },
-       { create_in_userns,                                             true,   "create operations in user namespace",                                                          },
-       { device_node_in_userns,                                        true,   "device node in user namespace",                                                                },
-       { expected_uid_gid_idmapped_mounts,                             true,   "expected ownership on idmapped mounts",                                                        },
-       { fscaps,                                                       false,  "fscaps on regular mounts",                                                                     },
-       { fscaps_idmapped_mounts,                                       true,   "fscaps on idmapped mounts",                                                                    },
-       { fscaps_idmapped_mounts_in_userns,                             true,   "fscaps on idmapped mounts in user namespace",                                                  },
-       { fscaps_idmapped_mounts_in_userns_separate_userns,             true,   "fscaps on idmapped mounts in user namespace with different id mappings",                       },
-       { fsids_mapped,                                                 true,   "mapped fsids",                                                                                 },
-       { fsids_unmapped,                                               true,   "unmapped fsids",                                                                               },
-       { hardlink_crossing_mounts,                                     false,  "cross mount hardlink",                                                                         },
-       { hardlink_crossing_idmapped_mounts,                            true,   "cross idmapped mount hardlink",                                                                },
-       { hardlink_from_idmapped_mount,                                 true,   "hardlinks from idmapped mounts",                                                               },
-       { hardlink_from_idmapped_mount_in_userns,                       true,   "hardlinks from idmapped mounts in user namespace",                                             },
+       { acls,                                                         T_REQUIRE_IDMAPPED_MOUNTS,      "posix acls on regular mounts",                                                                 },
+       { create_in_userns,                                             T_REQUIRE_IDMAPPED_MOUNTS,      "create operations in user namespace",                                                          },
+       { device_node_in_userns,                                        T_REQUIRE_IDMAPPED_MOUNTS,      "device node in user namespace",                                                                },
+       { expected_uid_gid_idmapped_mounts,                             T_REQUIRE_IDMAPPED_MOUNTS,      "expected ownership on idmapped mounts",                                                        },
+       { fscaps,                                                       0,                              "fscaps on regular mounts",                                                                     },
+       { fscaps_idmapped_mounts,                                       T_REQUIRE_IDMAPPED_MOUNTS,      "fscaps on idmapped mounts",                                                                    },
+       { fscaps_idmapped_mounts_in_userns,                             T_REQUIRE_IDMAPPED_MOUNTS,      "fscaps on idmapped mounts in user namespace",                                                  },
+       { fscaps_idmapped_mounts_in_userns_separate_userns,             T_REQUIRE_IDMAPPED_MOUNTS,      "fscaps on idmapped mounts in user namespace with different id mappings",                       },
+       { fsids_mapped,                                                 T_REQUIRE_IDMAPPED_MOUNTS,      "mapped fsids",                                                                                 },
+       { fsids_unmapped,                                               T_REQUIRE_IDMAPPED_MOUNTS,      "unmapped fsids",                                                                               },
+       { hardlink_crossing_mounts,                                     0,                              "cross mount hardlink",                                                                         },
+       { hardlink_crossing_idmapped_mounts,                            T_REQUIRE_IDMAPPED_MOUNTS,      "cross idmapped mount hardlink",                                                                },
+       { hardlink_from_idmapped_mount,                                 T_REQUIRE_IDMAPPED_MOUNTS,      "hardlinks from idmapped mounts",                                                               },
+       { hardlink_from_idmapped_mount_in_userns,                       T_REQUIRE_IDMAPPED_MOUNTS,      "hardlinks from idmapped mounts in user namespace",                                             },
 #ifdef HAVE_LIBURING_H
-       { io_uring,                                                     false,  "io_uring",                                                                                     },
-       { io_uring_userns,                                              false,  "io_uring in user namespace",                                                                   },
-       { io_uring_idmapped,                                            true,   "io_uring from idmapped mounts",                                                                },
-       { io_uring_idmapped_userns,                                     true,   "io_uring from idmapped mounts in user namespace",                                              },
-       { io_uring_idmapped_unmapped,                                   true,   "io_uring from idmapped mounts with unmapped ids",                                              },
-       { io_uring_idmapped_unmapped_userns,                            true,   "io_uring from idmapped mounts with unmapped ids in user namespace",                            },
+       { io_uring,                                                     0,                              "io_uring",                                                                                     },
+       { io_uring_userns,                                              0,                              "io_uring in user namespace",                                                                   },
+       { io_uring_idmapped,                                            T_REQUIRE_IDMAPPED_MOUNTS,      "io_uring from idmapped mounts",                                                                },
+       { io_uring_idmapped_userns,                                     T_REQUIRE_IDMAPPED_MOUNTS,      "io_uring from idmapped mounts in user namespace",                                              },
+       { io_uring_idmapped_unmapped,                                   T_REQUIRE_IDMAPPED_MOUNTS,      "io_uring from idmapped mounts with unmapped ids",                                              },
+       { io_uring_idmapped_unmapped_userns,                            T_REQUIRE_IDMAPPED_MOUNTS,      "io_uring from idmapped mounts with unmapped ids in user namespace",                            },
 #endif
-       { protected_symlinks,                                           false,  "following protected symlinks on regular mounts",                                               },
-       { protected_symlinks_idmapped_mounts,                           true,   "following protected symlinks on idmapped mounts",                                              },
-       { protected_symlinks_idmapped_mounts_in_userns,                 true,   "following protected symlinks on idmapped mounts in user namespace",                            },
-       { rename_crossing_mounts,                                       false,  "cross mount rename",                                                                           },
-       { rename_crossing_idmapped_mounts,                              true,   "cross idmapped mount rename",                                                                  },
-       { rename_from_idmapped_mount,                                   true,   "rename from idmapped mounts",                                                                  },
-       { rename_from_idmapped_mount_in_userns,                         true,   "rename from idmapped mounts in user namespace",                                                },
-       { setattr_truncate,                                             false,  "setattr truncate",                                                                             },
-       { setattr_truncate_idmapped,                                    true,   "setattr truncate on idmapped mounts",                                                          },
-       { setattr_truncate_idmapped_in_userns,                          true,   "setattr truncate on idmapped mounts in user namespace",                                        },
-       { setgid_create,                                                false,  "create operations in directories with setgid bit set",                                         },
-       { setgid_create_idmapped,                                       true,   "create operations in directories with setgid bit set on idmapped mounts",                      },
-       { setgid_create_idmapped_in_userns,                             true,   "create operations in directories with setgid bit set on idmapped mounts in user namespace",    },
-       { setid_binaries,                                               false,  "setid binaries on regular mounts",                                                             },
-       { setid_binaries_idmapped_mounts,                               true,   "setid binaries on idmapped mounts",                                                            },
-       { setid_binaries_idmapped_mounts_in_userns,                     true,   "setid binaries on idmapped mounts in user namespace",                                          },
-       { setid_binaries_idmapped_mounts_in_userns_separate_userns,     true,   "setid binaries on idmapped mounts in user namespace with different id mappings",               },
-       { sticky_bit_unlink,                                            false,  "sticky bit unlink operations on regular mounts",                                               },
-       { sticky_bit_unlink_idmapped_mounts,                            true,   "sticky bit unlink operations on idmapped mounts",                                              },
-       { sticky_bit_unlink_idmapped_mounts_in_userns,                  true,   "sticky bit unlink operations on idmapped mounts in user namespace",                            },
-       { sticky_bit_rename,                                            false,  "sticky bit rename operations on regular mounts",                                               },
-       { sticky_bit_rename_idmapped_mounts,                            true,   "sticky bit rename operations on idmapped mounts",                                              },
-       { sticky_bit_rename_idmapped_mounts_in_userns,                  true,   "sticky bit rename operations on idmapped mounts in user namespace",                            },
-       { symlink_regular_mounts,                                       false,  "symlink from regular mounts",                                                                  },
-       { symlink_idmapped_mounts,                                      true,   "symlink from idmapped mounts",                                                                 },
-       { symlink_idmapped_mounts_in_userns,                            true,   "symlink from idmapped mounts in user namespace",                                               },
-       { threaded_idmapped_mount_interactions,                         true,   "threaded operations on idmapped mounts",                                                       },
+       { protected_symlinks,                                           0,                              "following protected symlinks on regular mounts",                                               },
+       { protected_symlinks_idmapped_mounts,                           T_REQUIRE_IDMAPPED_MOUNTS,      "following protected symlinks on idmapped mounts",                                              },
+       { protected_symlinks_idmapped_mounts_in_userns,                 T_REQUIRE_IDMAPPED_MOUNTS,      "following protected symlinks on idmapped mounts in user namespace",                            },
+       { rename_crossing_mounts,                                       0,                              "cross mount rename",                                                                           },
+       { rename_crossing_idmapped_mounts,                              T_REQUIRE_IDMAPPED_MOUNTS,      "cross idmapped mount rename",                                                                  },
+       { rename_from_idmapped_mount,                                   T_REQUIRE_IDMAPPED_MOUNTS,      "rename from idmapped mounts",                                                                  },
+       { rename_from_idmapped_mount_in_userns,                         T_REQUIRE_IDMAPPED_MOUNTS,      "rename from idmapped mounts in user namespace",                                                },
+       { setattr_truncate,                                             0,                              "setattr truncate",                                                                             },
+       { setattr_truncate_idmapped,                                    T_REQUIRE_IDMAPPED_MOUNTS,      "setattr truncate on idmapped mounts",                                                          },
+       { setattr_truncate_idmapped_in_userns,                          T_REQUIRE_IDMAPPED_MOUNTS,      "setattr truncate on idmapped mounts in user namespace",                                        },
+       { setgid_create,                                                0,                              "create operations in directories with setgid bit set",                                         },
+       { setgid_create_idmapped,                                       T_REQUIRE_IDMAPPED_MOUNTS,      "create operations in directories with setgid bit set on idmapped mounts",                      },
+       { setgid_create_idmapped_in_userns,                             T_REQUIRE_IDMAPPED_MOUNTS,      "create operations in directories with setgid bit set on idmapped mounts in user namespace",    },
+       { setid_binaries,                                               0,                              "setid binaries on regular mounts",                                                             },
+       { setid_binaries_idmapped_mounts,                               T_REQUIRE_IDMAPPED_MOUNTS,      "setid binaries on idmapped mounts",                                                            },
+       { setid_binaries_idmapped_mounts_in_userns,                     T_REQUIRE_IDMAPPED_MOUNTS,      "setid binaries on idmapped mounts in user namespace",                                          },
+       { setid_binaries_idmapped_mounts_in_userns_separate_userns,     T_REQUIRE_IDMAPPED_MOUNTS,      "setid binaries on idmapped mounts in user namespace with different id mappings",               },
+       { sticky_bit_unlink,                                            0,                              "sticky bit unlink operations on regular mounts",                                               },
+       { sticky_bit_unlink_idmapped_mounts,                            T_REQUIRE_IDMAPPED_MOUNTS,      "sticky bit unlink operations on idmapped mounts",                                              },
+       { sticky_bit_unlink_idmapped_mounts_in_userns,                  T_REQUIRE_IDMAPPED_MOUNTS,      "sticky bit unlink operations on idmapped mounts in user namespace",                            },
+       { sticky_bit_rename,                                            0,                              "sticky bit rename operations on regular mounts",                                               },
+       { sticky_bit_rename_idmapped_mounts,                            T_REQUIRE_IDMAPPED_MOUNTS,      "sticky bit rename operations on idmapped mounts",                                              },
+       { sticky_bit_rename_idmapped_mounts_in_userns,                  T_REQUIRE_IDMAPPED_MOUNTS,      "sticky bit rename operations on idmapped mounts in user namespace",                            },
+       { symlink_regular_mounts,                                       0,                              "symlink from regular mounts",                                                                  },
+       { symlink_idmapped_mounts,                                      T_REQUIRE_IDMAPPED_MOUNTS,      "symlink from idmapped mounts",                                                                 },
+       { symlink_idmapped_mounts_in_userns,                            T_REQUIRE_IDMAPPED_MOUNTS,      "symlink from idmapped mounts in user namespace",                                               },
+       { threaded_idmapped_mount_interactions,                         T_REQUIRE_IDMAPPED_MOUNTS,      "threaded operations on idmapped mounts",                                                       },
 };
 
 struct t_idmapped_mounts fscaps_in_ancestor_userns[] = {
@@ -13936,7 +13939,8 @@ static bool run_test(struct t_idmapped_mounts suite[], size_t suite_size)
                 * If the underlying filesystems does not support idmapped
                 * mounts only run vfs generic tests.
                 */
-               if (t->require_fs_allow_idmap && !t_fs_allow_idmap) {
+               if (t->support_flags & T_REQUIRE_IDMAPPED_MOUNTS &&
+                   !t_fs_allow_idmap) {
                        log_debug("Skipping test %s", t->description);
                        continue;
                }