Commit cda2ed05 authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Al Viro

fs: simplify vfs_get_super

Remove the pointless keying argument and associated enum and pass the
fill_super callback and a "bool reconf" instead.  Also mark the function
static given that there are no users outside of super.c.
Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent 3aca4712
...@@ -562,17 +562,6 @@ or looking up of superblocks. ...@@ -562,17 +562,6 @@ or looking up of superblocks.
The following helpers all wrap sget_fc(): 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 (1) vfs_get_single_super
Only one such superblock may exist in the system. Any further Only one such superblock may exist in the system. Any further
......
...@@ -1111,55 +1111,14 @@ static int test_single_super(struct super_block *s, struct fs_context *fc) ...@@ -1111,55 +1111,14 @@ static int test_single_super(struct super_block *s, struct fs_context *fc)
return 1; return 1;
} }
/** static int vfs_get_super(struct fs_context *fc, bool reconf,
* vfs_get_super - Get a superblock with a search key set in s_fs_info. int (*test)(struct super_block *, struct fs_context *),
* @fc: The filesystem context holding the parameters int (*fill_super)(struct super_block *sb,
* @keying: How to distinguish superblocks struct fs_context *fc))
* @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))
{ {
int (*test)(struct super_block *, struct fs_context *);
struct super_block *sb; struct super_block *sb;
int err; 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); sb = sget_fc(fc, test, set_anon_super_fc);
if (IS_ERR(sb)) if (IS_ERR(sb))
return PTR_ERR(sb); return PTR_ERR(sb);
...@@ -1173,7 +1132,7 @@ int vfs_get_super(struct fs_context *fc, ...@@ -1173,7 +1132,7 @@ int vfs_get_super(struct fs_context *fc,
fc->root = dget(sb->s_root); fc->root = dget(sb->s_root);
} else { } else {
fc->root = dget(sb->s_root); fc->root = dget(sb->s_root);
if (keying == vfs_get_single_reconf_super) { if (reconf) {
err = reconfigure_super(fc); err = reconfigure_super(fc);
if (err < 0) { if (err < 0) {
dput(fc->root); dput(fc->root);
...@@ -1189,13 +1148,12 @@ int vfs_get_super(struct fs_context *fc, ...@@ -1189,13 +1148,12 @@ int vfs_get_super(struct fs_context *fc,
deactivate_locked_super(sb); deactivate_locked_super(sb);
return err; return err;
} }
EXPORT_SYMBOL(vfs_get_super);
int get_tree_nodev(struct fs_context *fc, int get_tree_nodev(struct fs_context *fc,
int (*fill_super)(struct super_block *sb, int (*fill_super)(struct super_block *sb,
struct fs_context *fc)) 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); EXPORT_SYMBOL(get_tree_nodev);
...@@ -1203,7 +1161,7 @@ int get_tree_single(struct fs_context *fc, ...@@ -1203,7 +1161,7 @@ int get_tree_single(struct fs_context *fc,
int (*fill_super)(struct super_block *sb, int (*fill_super)(struct super_block *sb,
struct fs_context *fc)) 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); EXPORT_SYMBOL(get_tree_single);
...@@ -1211,7 +1169,7 @@ int get_tree_single_reconf(struct fs_context *fc, ...@@ -1211,7 +1169,7 @@ int get_tree_single_reconf(struct fs_context *fc,
int (*fill_super)(struct super_block *sb, int (*fill_super)(struct super_block *sb,
struct fs_context *fc)) 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); EXPORT_SYMBOL(get_tree_single_reconf);
...@@ -1221,7 +1179,7 @@ int get_tree_keyed(struct fs_context *fc, ...@@ -1221,7 +1179,7 @@ int get_tree_keyed(struct fs_context *fc,
void *key) void *key)
{ {
fc->s_fs_info = 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); EXPORT_SYMBOL(get_tree_keyed);
......
...@@ -145,20 +145,6 @@ extern void fc_drop_locked(struct fs_context *fc); ...@@ -145,20 +145,6 @@ extern void fc_drop_locked(struct fs_context *fc);
int reconfigure_single(struct super_block *s, int reconfigure_single(struct super_block *s,
int flags, void *data); 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, extern int get_tree_nodev(struct fs_context *fc,
int (*fill_super)(struct super_block *sb, int (*fill_super)(struct super_block *sb,
struct fs_context *fc)); struct fs_context *fc));
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment