mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-04-01 12:04:08 +00:00
vfs: Provide a mount_pseudo-replacement for the new mount API
Provide a function, init_pseudo(), that provides a common infrastructure for converting pseudo-filesystems that can never be mountable. [AV: once all users of mount_pseudo_xattr() get converted, it will be folded into pseudo_fs_get_tree()] Signed-off-by: David Howells <dhowells@redhat.com> cc: linux-fsdevel@vger.kernel.org
This commit is contained in:
parent
c80fa7c830
commit
31d6d5ce53
2 changed files with 62 additions and 0 deletions
46
fs/libfs.c
46
fs/libfs.c
|
@ -16,6 +16,8 @@
|
||||||
#include <linux/exportfs.h>
|
#include <linux/exportfs.h>
|
||||||
#include <linux/writeback.h>
|
#include <linux/writeback.h>
|
||||||
#include <linux/buffer_head.h> /* sync_mapping_buffers */
|
#include <linux/buffer_head.h> /* sync_mapping_buffers */
|
||||||
|
#include <linux/fs_context.h>
|
||||||
|
#include <linux/pseudo_fs.h>
|
||||||
|
|
||||||
#include <linux/uaccess.h>
|
#include <linux/uaccess.h>
|
||||||
|
|
||||||
|
@ -235,6 +237,50 @@ static const struct super_operations simple_super_operations = {
|
||||||
.statfs = simple_statfs,
|
.statfs = simple_statfs,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static int pseudo_fs_get_tree(struct fs_context *fc)
|
||||||
|
{
|
||||||
|
struct pseudo_fs_context *ctx = fc->fs_private;
|
||||||
|
struct dentry *root;
|
||||||
|
|
||||||
|
root = mount_pseudo_xattr(fc->fs_type,
|
||||||
|
ctx->ops, ctx->xattr,
|
||||||
|
ctx->dops, ctx->magic);
|
||||||
|
if (IS_ERR(root))
|
||||||
|
return PTR_ERR(root);
|
||||||
|
|
||||||
|
fc->root = root;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void pseudo_fs_free(struct fs_context *fc)
|
||||||
|
{
|
||||||
|
kfree(fc->fs_private);
|
||||||
|
}
|
||||||
|
|
||||||
|
static const struct fs_context_operations pseudo_fs_context_ops = {
|
||||||
|
.free = pseudo_fs_free,
|
||||||
|
.get_tree = pseudo_fs_get_tree,
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Common helper for pseudo-filesystems (sockfs, pipefs, bdev - stuff that
|
||||||
|
* will never be mountable)
|
||||||
|
*/
|
||||||
|
struct pseudo_fs_context *init_pseudo(struct fs_context *fc,
|
||||||
|
unsigned long magic)
|
||||||
|
{
|
||||||
|
struct pseudo_fs_context *ctx;
|
||||||
|
|
||||||
|
ctx = kzalloc(sizeof(struct pseudo_fs_context), GFP_KERNEL);
|
||||||
|
if (likely(ctx)) {
|
||||||
|
ctx->magic = magic;
|
||||||
|
fc->fs_private = ctx;
|
||||||
|
fc->ops = &pseudo_fs_context_ops;
|
||||||
|
}
|
||||||
|
return ctx;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(init_pseudo);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Common helper for pseudo-filesystems (sockfs, pipefs, bdev - stuff that
|
* Common helper for pseudo-filesystems (sockfs, pipefs, bdev - stuff that
|
||||||
* will never be mountable)
|
* will never be mountable)
|
||||||
|
|
16
include/linux/pseudo_fs.h
Normal file
16
include/linux/pseudo_fs.h
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
#ifndef __LINUX_PSEUDO_FS__
|
||||||
|
#define __LINUX_PSEUDO_FS__
|
||||||
|
|
||||||
|
#include <linux/fs_context.h>
|
||||||
|
|
||||||
|
struct pseudo_fs_context {
|
||||||
|
const struct super_operations *ops;
|
||||||
|
const struct xattr_handler **xattr;
|
||||||
|
const struct dentry_operations *dops;
|
||||||
|
unsigned long magic;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct pseudo_fs_context *init_pseudo(struct fs_context *fc,
|
||||||
|
unsigned long magic);
|
||||||
|
|
||||||
|
#endif
|
Loading…
Add table
Reference in a new issue