mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-29 03:01:39 -04:00
VFS: Pass mount flags to sget()
Pass mount flags to sget() so that it can use them in initialising a new superblock before the set function is called. They could also be passed to the compare function. Signed-off-by: David Howells <[email protected]> Signed-off-by: Al Viro <[email protected]>
This commit is contained in:
parent
f015f1267b
commit
9249e17fe0
20 changed files with 40 additions and 50 deletions
22
fs/super.c
22
fs/super.c
|
|
@ -105,11 +105,12 @@ static int prune_super(struct shrinker *shrink, struct shrink_control *sc)
|
|||
/**
|
||||
* alloc_super - create new superblock
|
||||
* @type: filesystem type superblock should belong to
|
||||
* @flags: the mount flags
|
||||
*
|
||||
* Allocates and initializes a new &struct super_block. alloc_super()
|
||||
* returns a pointer new superblock or %NULL if allocation had failed.
|
||||
*/
|
||||
static struct super_block *alloc_super(struct file_system_type *type)
|
||||
static struct super_block *alloc_super(struct file_system_type *type, int flags)
|
||||
{
|
||||
struct super_block *s = kzalloc(sizeof(struct super_block), GFP_USER);
|
||||
static const struct super_operations default_op;
|
||||
|
|
@ -136,6 +137,7 @@ static struct super_block *alloc_super(struct file_system_type *type)
|
|||
#else
|
||||
INIT_LIST_HEAD(&s->s_files);
|
||||
#endif
|
||||
s->s_flags = flags;
|
||||
s->s_bdi = &default_backing_dev_info;
|
||||
INIT_HLIST_NODE(&s->s_instances);
|
||||
INIT_HLIST_BL_HEAD(&s->s_anon);
|
||||
|
|
@ -415,11 +417,13 @@ EXPORT_SYMBOL(generic_shutdown_super);
|
|||
* @type: filesystem type superblock should belong to
|
||||
* @test: comparison callback
|
||||
* @set: setup callback
|
||||
* @flags: mount flags
|
||||
* @data: argument to each of them
|
||||
*/
|
||||
struct super_block *sget(struct file_system_type *type,
|
||||
int (*test)(struct super_block *,void *),
|
||||
int (*set)(struct super_block *,void *),
|
||||
int flags,
|
||||
void *data)
|
||||
{
|
||||
struct super_block *s = NULL;
|
||||
|
|
@ -450,7 +454,7 @@ retry:
|
|||
}
|
||||
if (!s) {
|
||||
spin_unlock(&sb_lock);
|
||||
s = alloc_super(type);
|
||||
s = alloc_super(type, flags);
|
||||
if (!s)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
goto retry;
|
||||
|
|
@ -925,13 +929,12 @@ struct dentry *mount_ns(struct file_system_type *fs_type, int flags,
|
|||
{
|
||||
struct super_block *sb;
|
||||
|
||||
sb = sget(fs_type, ns_test_super, ns_set_super, data);
|
||||
sb = sget(fs_type, ns_test_super, ns_set_super, flags, data);
|
||||
if (IS_ERR(sb))
|
||||
return ERR_CAST(sb);
|
||||
|
||||
if (!sb->s_root) {
|
||||
int err;
|
||||
sb->s_flags = flags;
|
||||
err = fill_super(sb, data, flags & MS_SILENT ? 1 : 0);
|
||||
if (err) {
|
||||
deactivate_locked_super(sb);
|
||||
|
|
@ -992,7 +995,8 @@ struct dentry *mount_bdev(struct file_system_type *fs_type,
|
|||
error = -EBUSY;
|
||||
goto error_bdev;
|
||||
}
|
||||
s = sget(fs_type, test_bdev_super, set_bdev_super, bdev);
|
||||
s = sget(fs_type, test_bdev_super, set_bdev_super, flags | MS_NOSEC,
|
||||
bdev);
|
||||
mutex_unlock(&bdev->bd_fsfreeze_mutex);
|
||||
if (IS_ERR(s))
|
||||
goto error_s;
|
||||
|
|
@ -1017,7 +1021,6 @@ struct dentry *mount_bdev(struct file_system_type *fs_type,
|
|||
} else {
|
||||
char b[BDEVNAME_SIZE];
|
||||
|
||||
s->s_flags = flags | MS_NOSEC;
|
||||
s->s_mode = mode;
|
||||
strlcpy(s->s_id, bdevname(bdev, b), sizeof(s->s_id));
|
||||
sb_set_blocksize(s, block_size(bdev));
|
||||
|
|
@ -1062,13 +1065,11 @@ struct dentry *mount_nodev(struct file_system_type *fs_type,
|
|||
int (*fill_super)(struct super_block *, void *, int))
|
||||
{
|
||||
int error;
|
||||
struct super_block *s = sget(fs_type, NULL, set_anon_super, NULL);
|
||||
struct super_block *s = sget(fs_type, NULL, set_anon_super, flags, NULL);
|
||||
|
||||
if (IS_ERR(s))
|
||||
return ERR_CAST(s);
|
||||
|
||||
s->s_flags = flags;
|
||||
|
||||
error = fill_super(s, data, flags & MS_SILENT ? 1 : 0);
|
||||
if (error) {
|
||||
deactivate_locked_super(s);
|
||||
|
|
@ -1091,11 +1092,10 @@ struct dentry *mount_single(struct file_system_type *fs_type,
|
|||
struct super_block *s;
|
||||
int error;
|
||||
|
||||
s = sget(fs_type, compare_single, set_anon_super, NULL);
|
||||
s = sget(fs_type, compare_single, set_anon_super, flags, NULL);
|
||||
if (IS_ERR(s))
|
||||
return ERR_CAST(s);
|
||||
if (!s->s_root) {
|
||||
s->s_flags = flags;
|
||||
error = fill_super(s, data, flags & MS_SILENT ? 1 : 0);
|
||||
if (error) {
|
||||
deactivate_locked_super(s);
|
||||
|
|
|
|||
Loading…
Reference in a new issue