mirror of
https://github.com/Fishwaldo/linux-bl808.git
synced 2025-03-18 04:54:52 +00:00
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: Christoph Hellwig <hch@lst.de> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
parent
3aca47127a
commit
cda2ed05aa
3 changed files with 9 additions and 76 deletions
|
@ -562,17 +562,6 @@ or looking up of superblocks.
|
|||
|
||||
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
|
||||
|
|
60
fs/super.c
60
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 @@ error:
|
|||
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);
|
||||
|
||||
|
|
|
@ -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));
|
||||
|
|
Loading…
Add table
Reference in a new issue