mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-07-23 07:12:09 +00:00
vfs: Implement a filesystem superblock creation/configuration context
[AV - unfuck kern_mount_data(); we want non-NULL ->mnt_ns on long-living mounts] [AV - reordering fs/namespace.c is badly overdue, but let's keep it separate from that series] [AV - drop simple_pin_fs() change] [AV - clean vfs_kern_mount() failure exits up] Implement a filesystem context concept to be used during superblock creation for mount and superblock reconfiguration for remount. The mounting procedure then becomes: (1) Allocate new fs_context context. (2) Configure the context. (3) Create superblock. (4) Query the superblock. (5) Create a mount for the superblock. (6) Destroy the context. Rather than calling fs_type->mount(), an fs_context struct is created and fs_type->init_fs_context() is called to set it up. Pointers exist for the filesystem and LSM to hang their private data off. A set of operations has to be set by ->init_fs_context() to provide freeing, duplication, option parsing, binary data parsing, validation, mounting and superblock filling. Legacy filesystems are supported by the provision of a set of legacy fs_context operations that build up a list of mount options and then invoke fs_type->mount() from within the fs_context ->get_tree() operation. This allows all filesystems to be accessed using fs_context. It should be noted that, whilst this patch adds a lot of lines of code, there is quite a bit of duplication with existing code that can be eliminated should all filesystems be converted over. Signed-off-by: David Howells <dhowells@redhat.com> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
parent
846e566218
commit
3e1aeb00e6
5 changed files with 319 additions and 17 deletions
|
@ -997,17 +997,15 @@ struct vfsmount *vfs_kern_mount(struct file_system_type *type,
|
|||
int ret = 0;
|
||||
|
||||
if (!type)
|
||||
return ERR_PTR(-ENODEV);
|
||||
return ERR_PTR(-EINVAL);
|
||||
|
||||
fc = fs_context_for_mount(type, flags);
|
||||
if (IS_ERR(fc))
|
||||
return ERR_CAST(fc);
|
||||
|
||||
if (name) {
|
||||
fc->source = kstrdup(name, GFP_KERNEL);
|
||||
if (!fc->source)
|
||||
ret = -ENOMEM;
|
||||
}
|
||||
if (name)
|
||||
ret = vfs_parse_fs_string(fc, "source",
|
||||
name, strlen(name));
|
||||
if (!ret)
|
||||
ret = parse_monolithic_mount_data(fc, data);
|
||||
if (!ret)
|
||||
|
@ -2611,16 +2609,11 @@ static int do_new_mount(struct path *path, const char *fstype, int sb_flags,
|
|||
if (IS_ERR(fc))
|
||||
return PTR_ERR(fc);
|
||||
|
||||
if (subtype) {
|
||||
fc->subtype = kstrdup(subtype, GFP_KERNEL);
|
||||
if (!fc->subtype)
|
||||
err = -ENOMEM;
|
||||
}
|
||||
if (!err && name) {
|
||||
fc->source = kstrdup(name, GFP_KERNEL);
|
||||
if (!fc->source)
|
||||
err = -ENOMEM;
|
||||
}
|
||||
if (subtype)
|
||||
err = vfs_parse_fs_string(fc, "subtype",
|
||||
subtype, strlen(subtype));
|
||||
if (!err && name)
|
||||
err = vfs_parse_fs_string(fc, "source", name, strlen(name));
|
||||
if (!err)
|
||||
err = parse_monolithic_mount_data(fc, data);
|
||||
if (!err)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue