Re: [PATCH 1/2] userns: rename insert_extent() and sort_idmaps()
From: Bill Wendling
Date: Fri Sep 11 2026 - 15:28:41 EST
On Fri, Sep 11, 2026 at 5:59 AM Christian Brauner <brauner@xxxxxxxxxx> wrote:
>
> The KUnit test suite turned insert_extent() and sort_idmaps() into global
> symbols and declared them in include/linux/user_namespace.h. That header
> is pulled in nearly everywhere through linux/cgroup.h and the btrfs
> self-tests carry a static insert_extent() of their own, so any config
> with both test suites enabled fails to build:
>
> fs/btrfs/tests/inode-tests.c:16:13: error: conflicting types for 'insert_extent'
> include/linux/user_namespace.h:212:12: note: previous declaration of 'insert_extent'
>
> A global symbol needs a prefix. Rename them to
> uid_gid_map_insert_extent() and uid_gid_map_sort(). It's the better name
> anyway.
>
> No functional changes.
>
> Fixes: f6f1a2496ba5 ("userns: Add KUnit test suite for uid_gid_map")
> Reported-by: kernel test robot <lkp@xxxxxxxxx>
> Closes: https://lore.kernel.org/oe-kbuild-all/202609110843.okbPe7GM-lkp@xxxxxxxxx/
> Closes: https://lore.kernel.org/oe-kbuild-all/202609110937.zHKPPXJk-lkp@xxxxxxxxx/
> Signed-off-by: Christian Brauner (Amutable) <brauner@xxxxxxxxxx>
Apologies for this. This version of the KUnit testing is susceptible
to exposting duplicate symbols. :-(
Reviewed-by: Bill Wendling <morbo@xxxxxxxxxx>
-bw
> ---
> include/linux/user_namespace.h | 5 +++--
> kernel/tests/user_ns_map_kunit.c | 6 +++---
> kernel/user_namespace.c | 19 ++++++++++---------
> 3 files changed, 16 insertions(+), 14 deletions(-)
>
> diff --git a/include/linux/user_namespace.h b/include/linux/user_namespace.h
> index 633157781edc..637cd7e91a45 100644
> --- a/include/linux/user_namespace.h
> +++ b/include/linux/user_namespace.h
> @@ -209,8 +209,9 @@ extern bool current_in_userns(const struct user_namespace *target_ns);
> struct ns_common *ns_get_owner(struct ns_common *ns);
>
> #if IS_ENABLED(CONFIG_USER_NS_MAP_KUNIT_TEST)
> -extern int insert_extent(struct uid_gid_map *map, struct uid_gid_extent *extent);
> -extern int sort_idmaps(struct uid_gid_map *map);
> +extern int uid_gid_map_insert_extent(struct uid_gid_map *map,
> + struct uid_gid_extent *extent);
> +extern int uid_gid_map_sort(struct uid_gid_map *map);
> #endif /* CONFIG_USER_NS_MAP_KUNIT_TEST */
>
> #else
> diff --git a/kernel/tests/user_ns_map_kunit.c b/kernel/tests/user_ns_map_kunit.c
> index 24c21e43a36c..033dccc6a535 100644
> --- a/kernel/tests/user_ns_map_kunit.c
> +++ b/kernel/tests/user_ns_map_kunit.c
> @@ -24,7 +24,7 @@ static void user_ns_map_insert(struct kunit *test)
> extent.lower_first = i * 100;
> extent.count = 5;
>
> - ret = insert_extent(&map, &extent);
> + ret = uid_gid_map_insert_extent(&map, &extent);
> KUNIT_ASSERT_EQ(test, ret, 0);
> }
>
> @@ -54,14 +54,14 @@ static void user_ns_map_insert_extended(struct kunit *test)
> extent.lower_first = value * 100;
> extent.count = 5;
>
> - ret = insert_extent(&map, &extent);
> + ret = uid_gid_map_insert_extent(&map, &extent);
> KUNIT_ASSERT_EQ(test, ret, 0);
> }
>
> KUNIT_EXPECT_EQ(test, map.nr_extents, NR_EXTENTS);
>
> /* Now sort the map to set up reverse mapping */
> - ret = sort_idmaps(&map);
> + ret = uid_gid_map_sort(&map);
> KUNIT_ASSERT_EQ(test, ret, 0);
> KUNIT_ASSERT_NOT_ERR_OR_NULL(test, map.reverse);
>
> diff --git a/kernel/user_namespace.c b/kernel/user_namespace.c
> index f9cbb4b92b48..98b0279b6cc6 100644
> --- a/kernel/user_namespace.c
> +++ b/kernel/user_namespace.c
> @@ -780,12 +780,13 @@ static bool mappings_overlap(struct uid_gid_map *new_map,
> }
>
> /*
> - * insert_extent - Safely insert a new idmap extent into struct uid_gid_map.
> + * uid_gid_map_insert_extent - Safely insert a new idmap extent into
> + * struct uid_gid_map.
> * Takes care to allocate a 4K block of memory if the number of mappings exceeds
> * UID_GID_MAP_MAX_BASE_EXTENTS.
> */
> -VISIBLE_IF_KUNIT int insert_extent(struct uid_gid_map *map,
> - struct uid_gid_extent *extent)
> +VISIBLE_IF_KUNIT int uid_gid_map_insert_extent(struct uid_gid_map *map,
> + struct uid_gid_extent *extent)
> {
> struct uid_gid_extent *dest;
>
> @@ -821,7 +822,7 @@ VISIBLE_IF_KUNIT int insert_extent(struct uid_gid_map *map,
> *dest = *extent;
> return 0;
> }
> -EXPORT_SYMBOL_IF_KUNIT(insert_extent);
> +EXPORT_SYMBOL_IF_KUNIT(uid_gid_map_insert_extent);
>
> /* cmp function to sort() forward mappings */
> static int cmp_extents_forward(const void *a, const void *b)
> @@ -854,10 +855,10 @@ static int cmp_extents_reverse(const void *a, const void *b)
> }
>
> /*
> - * sort_idmaps - Sorts an array of idmap entries.
> + * uid_gid_map_sort - Sorts an array of idmap entries.
> * Can only be called if number of mappings exceeds UID_GID_MAP_MAX_BASE_EXTENTS.
> */
> -VISIBLE_IF_KUNIT int sort_idmaps(struct uid_gid_map *map)
> +VISIBLE_IF_KUNIT int uid_gid_map_sort(struct uid_gid_map *map)
> {
> if (map->nr_extents <= UID_GID_MAP_MAX_BASE_EXTENTS)
> return 0;
> @@ -878,7 +879,7 @@ VISIBLE_IF_KUNIT int sort_idmaps(struct uid_gid_map *map)
>
> return 0;
> }
> -EXPORT_SYMBOL_IF_KUNIT(sort_idmaps);
> +EXPORT_SYMBOL_IF_KUNIT(uid_gid_map_sort);
>
> /**
> * verify_root_map() - check the uid 0 mapping
> @@ -1047,7 +1048,7 @@ static ssize_t map_write(struct file *file, const char __user *buf,
> (next_line != NULL))
> goto out;
>
> - ret = insert_extent(&new_map, &extent);
> + ret = uid_gid_map_insert_extent(&new_map, &extent);
> if (ret < 0)
> goto out;
> ret = -EINVAL;
> @@ -1091,7 +1092,7 @@ static ssize_t map_write(struct file *file, const char __user *buf,
> * If we want to use binary search for lookup, this clones the extent
> * array and sorts both copies.
> */
> - ret = sort_idmaps(&new_map);
> + ret = uid_gid_map_sort(&new_map);
> if (ret < 0)
> goto out;
>
> --
> 2.53.0
>