2022-10-25 14:41:31

by Dawei Li

[permalink] [raw]
Subject: [PATCH] vfs: Make vfs_get_super() internal

For now there are no external callers of vfs_get_super(),
so just make it an internal API.

base-commit: 3aca47127a646165965ff52803e2b269eed91afc

Signed-off-by: Dawei Li <[email protected]>
---
fs/super.c | 3 +--
include/linux/fs_context.h | 4 ----
2 files changed, 1 insertion(+), 6 deletions(-)

diff --git a/fs/super.c b/fs/super.c
index 6a82660e1adb..cde412f900c7 100644
--- a/fs/super.c
+++ b/fs/super.c
@@ -1136,7 +1136,7 @@ static int test_single_super(struct super_block *s, struct fs_context *fc)
* A permissions check is made by sget_fc() unless we're getting a superblock
* for a kernel-internal mount or a submount.
*/
-int vfs_get_super(struct fs_context *fc,
+static int vfs_get_super(struct fs_context *fc,
enum vfs_get_super_keying keying,
int (*fill_super)(struct super_block *sb,
struct fs_context *fc))
@@ -1189,7 +1189,6 @@ int vfs_get_super(struct fs_context *fc,
deactivate_locked_super(sb);
return err;
}
-EXPORT_SYMBOL(vfs_get_super);

int get_tree_nodev(struct fs_context *fc,
int (*fill_super)(struct super_block *sb,
diff --git a/include/linux/fs_context.h b/include/linux/fs_context.h
index 13fa6f3df8e4..8b3df5ca8f33 100644
--- a/include/linux/fs_context.h
+++ b/include/linux/fs_context.h
@@ -154,10 +154,6 @@ enum vfs_get_super_keying {
vfs_get_keyed_super, /* Superblocks with different s_fs_info keys may exist */
vfs_get_independent_super, /* Multiple independent superblocks may exist */
};
-extern int vfs_get_super(struct fs_context *fc,
- enum vfs_get_super_keying keying,
- int (*fill_super)(struct super_block *sb,
- struct fs_context *fc));

extern int get_tree_nodev(struct fs_context *fc,
int (*fill_super)(struct super_block *sb,
--
2.25.1



2022-10-25 14:57:08

by Christian Brauner

[permalink] [raw]
Subject: Re: [PATCH] vfs: Make vfs_get_super() internal

On Tue, Oct 25, 2022 at 10:24:01PM +0800, Dawei Li wrote:
> For now there are no external callers of vfs_get_super(),
> so just make it an internal API.
>
> base-commit: 3aca47127a646165965ff52803e2b269eed91afc
>
> Signed-off-by: Dawei Li <[email protected]>
> ---
> fs/super.c | 3 +--
> include/linux/fs_context.h | 4 ----
> 2 files changed, 1 insertion(+), 6 deletions(-)
>
> diff --git a/fs/super.c b/fs/super.c
> index 6a82660e1adb..cde412f900c7 100644
> --- a/fs/super.c
> +++ b/fs/super.c
> @@ -1136,7 +1136,7 @@ static int test_single_super(struct super_block *s, struct fs_context *fc)
> * A permissions check is made by sget_fc() unless we're getting a superblock
> * for a kernel-internal mount or a submount.
> */
> -int vfs_get_super(struct fs_context *fc,
> +static int vfs_get_super(struct fs_context *fc,
> enum vfs_get_super_keying keying,
> int (*fill_super)(struct super_block *sb,
> struct fs_context *fc))

If you want to make it static that you should probably also make enum
vfs_get_super_keying static by moving it into super.c. It's not used
anywhere but for vfs_get_super() afaict.

2022-10-25 15:13:05

by Christoph Hellwig

[permalink] [raw]
Subject: Re: [PATCH] vfs: Make vfs_get_super() internal

On Tue, Oct 25, 2022 at 04:36:07PM +0200, Christian Brauner wrote:
> If you want to make it static that you should probably also make enum
> vfs_get_super_keying static by moving it into super.c. It's not used
> anywhere but for vfs_get_super() afaict.

I'd just remove the enum entirely, as it really obsfucates the code:

diff --git a/Documentation/filesystems/mount_api.rst b/Documentation/filesystems/mount_api.rst
index eb358a00be279..b0f7fd4f64bc8 100644
--- a/Documentation/filesystems/mount_api.rst
+++ b/Documentation/filesystems/mount_api.rst
@@ -560,37 +560,6 @@ or looking up of superblocks.
to sb->s_fs_info - and fc->s_fs_info will be cleared if set returns
success (ie. 0).

-The following helpers all wrap sget_fc():
-
- * ::
-
- int vfs_get_super(struct fs_context *fc,
- enum vfs_get_super_keying keying,
- int (*fill_super)(struct super_block *sb,
- struct fs_context *fc))
-
- This creates/looks up a deviceless superblock. The keying indicates how
- many superblocks of this type may exist and in what manner they may be
- shared:
-
- (1) vfs_get_single_super
-
- Only one such superblock may exist in the system. Any further
- attempt to get a new superblock gets this one (and any parameter
- differences are ignored).
-
- (2) vfs_get_keyed_super
-
- Multiple superblocks of this type may exist and they're keyed on
- their s_fs_info pointer (for example this may refer to a
- namespace).
-
- (3) vfs_get_independent_super
-
- Multiple independent superblocks of this type may exist. This
- function never matches an existing one and always creates a new
- one.
-

Parameter Description
=====================
diff --git a/fs/super.c b/fs/super.c
index 6a82660e1adba..76f477c24c3d5 100644
--- a/fs/super.c
+++ b/fs/super.c
@@ -1111,55 +1111,14 @@ static int test_single_super(struct super_block *s, struct fs_context *fc)
return 1;
}

-/**
- * vfs_get_super - Get a superblock with a search key set in s_fs_info.
- * @fc: The filesystem context holding the parameters
- * @keying: How to distinguish superblocks
- * @fill_super: Helper to initialise a new superblock
- *
- * Search for a superblock and create a new one if not found. The search
- * criterion is controlled by @keying. If the search fails, a new superblock
- * is created and @fill_super() is called to initialise it.
- *
- * @keying can take one of a number of values:
- *
- * (1) vfs_get_single_super - Only one superblock of this type may exist on the
- * system. This is typically used for special system filesystems.
- *
- * (2) vfs_get_keyed_super - Multiple superblocks may exist, but they must have
- * distinct keys (where the key is in s_fs_info). Searching for the same
- * key again will turn up the superblock for that key.
- *
- * (3) vfs_get_independent_super - Multiple superblocks may exist and are
- * unkeyed. Each call will get a new superblock.
- *
- * A permissions check is made by sget_fc() unless we're getting a superblock
- * for a kernel-internal mount or a submount.
- */
-int vfs_get_super(struct fs_context *fc,
- enum vfs_get_super_keying keying,
- int (*fill_super)(struct super_block *sb,
- struct fs_context *fc))
+static int vfs_get_super(struct fs_context *fc, bool reconf,
+ int (*test)(struct super_block *, struct fs_context *),
+ int (*fill_super)(struct super_block *sb,
+ struct fs_context *fc))
{
- int (*test)(struct super_block *, struct fs_context *);
struct super_block *sb;
int err;

- switch (keying) {
- case vfs_get_single_super:
- case vfs_get_single_reconf_super:
- test = test_single_super;
- break;
- case vfs_get_keyed_super:
- test = test_keyed_super;
- break;
- case vfs_get_independent_super:
- test = NULL;
- break;
- default:
- BUG();
- }
-
sb = sget_fc(fc, test, set_anon_super_fc);
if (IS_ERR(sb))
return PTR_ERR(sb);
@@ -1173,7 +1132,7 @@ int vfs_get_super(struct fs_context *fc,
fc->root = dget(sb->s_root);
} else {
fc->root = dget(sb->s_root);
- if (keying == vfs_get_single_reconf_super) {
+ if (reconf) {
err = reconfigure_super(fc);
if (err < 0) {
dput(fc->root);
@@ -1189,13 +1148,12 @@ int vfs_get_super(struct fs_context *fc,
deactivate_locked_super(sb);
return err;
}
-EXPORT_SYMBOL(vfs_get_super);

int get_tree_nodev(struct fs_context *fc,
int (*fill_super)(struct super_block *sb,
struct fs_context *fc))
{
- return vfs_get_super(fc, vfs_get_independent_super, fill_super);
+ return vfs_get_super(fc, false, NULL, fill_super);
}
EXPORT_SYMBOL(get_tree_nodev);

@@ -1203,7 +1161,7 @@ int get_tree_single(struct fs_context *fc,
int (*fill_super)(struct super_block *sb,
struct fs_context *fc))
{
- return vfs_get_super(fc, vfs_get_single_super, fill_super);
+ return vfs_get_super(fc, false, test_single_super, fill_super);
}
EXPORT_SYMBOL(get_tree_single);

@@ -1211,7 +1169,7 @@ int get_tree_single_reconf(struct fs_context *fc,
int (*fill_super)(struct super_block *sb,
struct fs_context *fc))
{
- return vfs_get_super(fc, vfs_get_single_reconf_super, fill_super);
+ return vfs_get_super(fc, true, test_single_super, fill_super);
}
EXPORT_SYMBOL(get_tree_single_reconf);

@@ -1221,7 +1179,7 @@ int get_tree_keyed(struct fs_context *fc,
void *key)
{
fc->s_fs_info = key;
- return vfs_get_super(fc, vfs_get_keyed_super, fill_super);
+ return vfs_get_super(fc, false, test_keyed_super, fill_super);
}
EXPORT_SYMBOL(get_tree_keyed);

diff --git a/include/linux/fs_context.h b/include/linux/fs_context.h
index 13fa6f3df8e46..87a34f2fa68de 100644
--- a/include/linux/fs_context.h
+++ b/include/linux/fs_context.h
@@ -145,20 +145,6 @@ extern void fc_drop_locked(struct fs_context *fc);
int reconfigure_single(struct super_block *s,
int flags, void *data);

-/*
- * sget() wrappers to be called from the ->get_tree() op.
- */
-enum vfs_get_super_keying {
- vfs_get_single_super, /* Only one such superblock may exist */
- vfs_get_single_reconf_super, /* As above, but reconfigure if it exists */
- vfs_get_keyed_super, /* Superblocks with different s_fs_info keys may exist */
- vfs_get_independent_super, /* Multiple independent superblocks may exist */
-};
-extern int vfs_get_super(struct fs_context *fc,
- enum vfs_get_super_keying keying,
- int (*fill_super)(struct super_block *sb,
- struct fs_context *fc));
-
extern int get_tree_nodev(struct fs_context *fc,
int (*fill_super)(struct super_block *sb,
struct fs_context *fc));