提交 c74a1cbb 编写于 作者: A Al Viro

pass default dentry_operations to mount_pseudo()

Signed-off-by: NAl Viro <viro@zeniv.linux.org.uk>
上级 f772c4a6
...@@ -617,11 +617,14 @@ pfm_get_unmapped_area(struct file *file, unsigned long addr, unsigned long len, ...@@ -617,11 +617,14 @@ pfm_get_unmapped_area(struct file *file, unsigned long addr, unsigned long len,
return get_unmapped_area(file, addr, len, pgoff, flags); return get_unmapped_area(file, addr, len, pgoff, flags);
} }
/* forward declaration */
static static const struct dentry_operations pfmfs_dentry_operations;
static struct dentry * static struct dentry *
pfmfs_mount(struct file_system_type *fs_type, int flags, const char *dev_name, void *data) pfmfs_mount(struct file_system_type *fs_type, int flags, const char *dev_name, void *data)
{ {
return mount_pseudo(fs_type, "pfm:", NULL, PFMFS_MAGIC); return mount_pseudo(fs_type, "pfm:", NULL, &pfmfs_dentry_operations,
PFMFS_MAGIC);
} }
static struct file_system_type pfm_fs_type = { static struct file_system_type pfm_fs_type = {
...@@ -2232,7 +2235,6 @@ pfm_alloc_file(pfm_context_t *ctx) ...@@ -2232,7 +2235,6 @@ pfm_alloc_file(pfm_context_t *ctx)
} }
path.mnt = mntget(pfmfs_mnt); path.mnt = mntget(pfmfs_mnt);
d_set_d_op(path.dentry, &pfmfs_dentry_operations);
d_add(path.dentry, inode); d_add(path.dentry, inode);
file = alloc_file(&path, FMODE_READ, &pfm_file_ops); file = alloc_file(&path, FMODE_READ, &pfm_file_ops);
......
...@@ -1134,7 +1134,7 @@ static const struct file_operations mtd_fops = { ...@@ -1134,7 +1134,7 @@ static const struct file_operations mtd_fops = {
static struct dentry *mtd_inodefs_mount(struct file_system_type *fs_type, static struct dentry *mtd_inodefs_mount(struct file_system_type *fs_type,
int flags, const char *dev_name, void *data) int flags, const char *dev_name, void *data)
{ {
return mount_pseudo(fs_type, "mtd_inode:", NULL, MTD_INODE_FS_MAGIC); return mount_pseudo(fs_type, "mtd_inode:", NULL, NULL, MTD_INODE_FS_MAGIC);
} }
static struct file_system_type mtd_inodefs_type = { static struct file_system_type mtd_inodefs_type = {
......
...@@ -26,12 +26,6 @@ static struct vfsmount *anon_inode_mnt __read_mostly; ...@@ -26,12 +26,6 @@ static struct vfsmount *anon_inode_mnt __read_mostly;
static struct inode *anon_inode_inode; static struct inode *anon_inode_inode;
static const struct file_operations anon_inode_fops; static const struct file_operations anon_inode_fops;
static struct dentry *anon_inodefs_mount(struct file_system_type *fs_type,
int flags, const char *dev_name, void *data)
{
return mount_pseudo(fs_type, "anon_inode:", NULL, ANON_INODE_FS_MAGIC);
}
/* /*
* anon_inodefs_dname() is called from d_path(). * anon_inodefs_dname() is called from d_path().
*/ */
...@@ -41,14 +35,22 @@ static char *anon_inodefs_dname(struct dentry *dentry, char *buffer, int buflen) ...@@ -41,14 +35,22 @@ static char *anon_inodefs_dname(struct dentry *dentry, char *buffer, int buflen)
dentry->d_name.name); dentry->d_name.name);
} }
static const struct dentry_operations anon_inodefs_dentry_operations = {
.d_dname = anon_inodefs_dname,
};
static struct dentry *anon_inodefs_mount(struct file_system_type *fs_type,
int flags, const char *dev_name, void *data)
{
return mount_pseudo(fs_type, "anon_inode:", NULL,
&anon_inodefs_dentry_operations, ANON_INODE_FS_MAGIC);
}
static struct file_system_type anon_inode_fs_type = { static struct file_system_type anon_inode_fs_type = {
.name = "anon_inodefs", .name = "anon_inodefs",
.mount = anon_inodefs_mount, .mount = anon_inodefs_mount,
.kill_sb = kill_anon_super, .kill_sb = kill_anon_super,
}; };
static const struct dentry_operations anon_inodefs_dentry_operations = {
.d_dname = anon_inodefs_dname,
};
/* /*
* nop .set_page_dirty method so that people can use .page_mkwrite on * nop .set_page_dirty method so that people can use .page_mkwrite on
...@@ -113,7 +115,6 @@ struct file *anon_inode_getfile(const char *name, ...@@ -113,7 +115,6 @@ struct file *anon_inode_getfile(const char *name,
*/ */
ihold(anon_inode_inode); ihold(anon_inode_inode);
d_set_d_op(path.dentry, &anon_inodefs_dentry_operations);
d_instantiate(path.dentry, anon_inode_inode); d_instantiate(path.dentry, anon_inode_inode);
error = -ENFILE; error = -ENFILE;
......
...@@ -473,7 +473,7 @@ static const struct super_operations bdev_sops = { ...@@ -473,7 +473,7 @@ static const struct super_operations bdev_sops = {
static struct dentry *bd_mount(struct file_system_type *fs_type, static struct dentry *bd_mount(struct file_system_type *fs_type,
int flags, const char *dev_name, void *data) int flags, const char *dev_name, void *data)
{ {
return mount_pseudo(fs_type, "bdev:", &bdev_sops, 0x62646576); return mount_pseudo(fs_type, "bdev:", &bdev_sops, NULL, 0x62646576);
} }
static struct file_system_type bd_type = { static struct file_system_type bd_type = {
......
...@@ -217,7 +217,8 @@ static const struct super_operations simple_super_operations = { ...@@ -217,7 +217,8 @@ static const struct super_operations simple_super_operations = {
* will never be mountable) * will never be mountable)
*/ */
struct dentry *mount_pseudo(struct file_system_type *fs_type, char *name, struct dentry *mount_pseudo(struct file_system_type *fs_type, char *name,
const struct super_operations *ops, unsigned long magic) const struct super_operations *ops,
const struct dentry_operations *dops, unsigned long magic)
{ {
struct super_block *s = sget(fs_type, NULL, set_anon_super, NULL); struct super_block *s = sget(fs_type, NULL, set_anon_super, NULL);
struct dentry *dentry; struct dentry *dentry;
...@@ -254,6 +255,7 @@ struct dentry *mount_pseudo(struct file_system_type *fs_type, char *name, ...@@ -254,6 +255,7 @@ struct dentry *mount_pseudo(struct file_system_type *fs_type, char *name,
dentry->d_parent = dentry; dentry->d_parent = dentry;
d_instantiate(dentry, root); d_instantiate(dentry, root);
s->s_root = dentry; s->s_root = dentry;
s->s_d_op = dops;
s->s_flags |= MS_ACTIVE; s->s_flags |= MS_ACTIVE;
return dget(s->s_root); return dget(s->s_root);
......
...@@ -1004,7 +1004,6 @@ struct file *create_write_pipe(int flags) ...@@ -1004,7 +1004,6 @@ struct file *create_write_pipe(int flags)
goto err_inode; goto err_inode;
path.mnt = mntget(pipe_mnt); path.mnt = mntget(pipe_mnt);
d_set_d_op(path.dentry, &pipefs_dentry_operations);
d_instantiate(path.dentry, inode); d_instantiate(path.dentry, inode);
err = -ENFILE; err = -ENFILE;
...@@ -1266,7 +1265,8 @@ static const struct super_operations pipefs_ops = { ...@@ -1266,7 +1265,8 @@ static const struct super_operations pipefs_ops = {
static struct dentry *pipefs_mount(struct file_system_type *fs_type, static struct dentry *pipefs_mount(struct file_system_type *fs_type,
int flags, const char *dev_name, void *data) int flags, const char *dev_name, void *data)
{ {
return mount_pseudo(fs_type, "pipe:", &pipefs_ops, PIPEFS_MAGIC); return mount_pseudo(fs_type, "pipe:", &pipefs_ops,
&pipefs_dentry_operations, PIPEFS_MAGIC);
} }
static struct file_system_type pipe_fs_type = { static struct file_system_type pipe_fs_type = {
......
...@@ -1835,7 +1835,9 @@ struct super_block *sget(struct file_system_type *type, ...@@ -1835,7 +1835,9 @@ struct super_block *sget(struct file_system_type *type,
int (*set)(struct super_block *,void *), int (*set)(struct super_block *,void *),
void *data); void *data);
extern struct dentry *mount_pseudo(struct file_system_type *, char *, extern struct dentry *mount_pseudo(struct file_system_type *, char *,
const struct super_operations *ops, unsigned long); const struct super_operations *ops,
const struct dentry_operations *dops,
unsigned long);
extern void simple_set_mnt(struct vfsmount *mnt, struct super_block *sb); extern void simple_set_mnt(struct vfsmount *mnt, struct super_block *sb);
static inline void sb_mark_dirty(struct super_block *sb) static inline void sb_mark_dirty(struct super_block *sb)
......
...@@ -306,20 +306,6 @@ static const struct super_operations sockfs_ops = { ...@@ -306,20 +306,6 @@ static const struct super_operations sockfs_ops = {
.statfs = simple_statfs, .statfs = simple_statfs,
}; };
static struct dentry *sockfs_mount(struct file_system_type *fs_type,
int flags, const char *dev_name, void *data)
{
return mount_pseudo(fs_type, "socket:", &sockfs_ops, SOCKFS_MAGIC);
}
static struct vfsmount *sock_mnt __read_mostly;
static struct file_system_type sock_fs_type = {
.name = "sockfs",
.mount = sockfs_mount,
.kill_sb = kill_anon_super,
};
/* /*
* sockfs_dname() is called from d_path(). * sockfs_dname() is called from d_path().
*/ */
...@@ -333,6 +319,21 @@ static const struct dentry_operations sockfs_dentry_operations = { ...@@ -333,6 +319,21 @@ static const struct dentry_operations sockfs_dentry_operations = {
.d_dname = sockfs_dname, .d_dname = sockfs_dname,
}; };
static struct dentry *sockfs_mount(struct file_system_type *fs_type,
int flags, const char *dev_name, void *data)
{
return mount_pseudo(fs_type, "socket:", &sockfs_ops,
&sockfs_dentry_operations, SOCKFS_MAGIC);
}
static struct vfsmount *sock_mnt __read_mostly;
static struct file_system_type sock_fs_type = {
.name = "sockfs",
.mount = sockfs_mount,
.kill_sb = kill_anon_super,
};
/* /*
* Obtains the first available file descriptor and sets it up for use. * Obtains the first available file descriptor and sets it up for use.
* *
...@@ -368,7 +369,6 @@ static int sock_alloc_file(struct socket *sock, struct file **f, int flags) ...@@ -368,7 +369,6 @@ static int sock_alloc_file(struct socket *sock, struct file **f, int flags)
} }
path.mnt = mntget(sock_mnt); path.mnt = mntget(sock_mnt);
d_set_d_op(path.dentry, &sockfs_dentry_operations);
d_instantiate(path.dentry, SOCK_INODE(sock)); d_instantiate(path.dentry, SOCK_INODE(sock));
SOCK_INODE(sock)->i_fop = &socket_file_ops; SOCK_INODE(sock)->i_fop = &socket_file_ops;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册