diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2013-10-02 22:35:11 -0400 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2013-11-09 00:16:27 -0500 |
commit | 6987843ff7e836ea65b554905aec34d2fad05c94 (patch) | |
tree | b6a66c9d11b96ee6d03eef374e016ed855b25738 /fs | |
parent | 22a8cb8248ba5d340307ba72432253b1dbdb5cf7 (diff) |
take anon inode allocation to libfs.c
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'fs')
-rw-r--r-- | fs/anon_inodes.c | 50 | ||||
-rw-r--r-- | fs/libfs.c | 43 |
2 files changed, 45 insertions, 48 deletions
diff --git a/fs/anon_inodes.c b/fs/anon_inodes.c index 85c961849953..22f9698a1214 100644 --- a/fs/anon_inodes.c +++ b/fs/anon_inodes.c | |||
@@ -24,7 +24,6 @@ | |||
24 | 24 | ||
25 | static struct vfsmount *anon_inode_mnt __read_mostly; | 25 | static struct vfsmount *anon_inode_mnt __read_mostly; |
26 | static struct inode *anon_inode_inode; | 26 | static struct inode *anon_inode_inode; |
27 | static const struct file_operations anon_inode_fops; | ||
28 | 27 | ||
29 | /* | 28 | /* |
30 | * anon_inodefs_dname() is called from d_path(). | 29 | * anon_inodefs_dname() is called from d_path(). |
@@ -39,51 +38,6 @@ static const struct dentry_operations anon_inodefs_dentry_operations = { | |||
39 | .d_dname = anon_inodefs_dname, | 38 | .d_dname = anon_inodefs_dname, |
40 | }; | 39 | }; |
41 | 40 | ||
42 | /* | ||
43 | * nop .set_page_dirty method so that people can use .page_mkwrite on | ||
44 | * anon inodes. | ||
45 | */ | ||
46 | static int anon_set_page_dirty(struct page *page) | ||
47 | { | ||
48 | return 0; | ||
49 | }; | ||
50 | |||
51 | static const struct address_space_operations anon_aops = { | ||
52 | .set_page_dirty = anon_set_page_dirty, | ||
53 | }; | ||
54 | |||
55 | /* | ||
56 | * A single inode exists for all anon_inode files. Contrary to pipes, | ||
57 | * anon_inode inodes have no associated per-instance data, so we need | ||
58 | * only allocate one of them. | ||
59 | */ | ||
60 | static struct inode *anon_inode_mkinode(struct super_block *s) | ||
61 | { | ||
62 | struct inode *inode = new_inode_pseudo(s); | ||
63 | |||
64 | if (!inode) | ||
65 | return ERR_PTR(-ENOMEM); | ||
66 | |||
67 | inode->i_ino = get_next_ino(); | ||
68 | inode->i_fop = &anon_inode_fops; | ||
69 | |||
70 | inode->i_mapping->a_ops = &anon_aops; | ||
71 | |||
72 | /* | ||
73 | * Mark the inode dirty from the very beginning, | ||
74 | * that way it will never be moved to the dirty | ||
75 | * list because mark_inode_dirty() will think | ||
76 | * that it already _is_ on the dirty list. | ||
77 | */ | ||
78 | inode->i_state = I_DIRTY; | ||
79 | inode->i_mode = S_IRUSR | S_IWUSR; | ||
80 | inode->i_uid = current_fsuid(); | ||
81 | inode->i_gid = current_fsgid(); | ||
82 | inode->i_flags |= S_PRIVATE; | ||
83 | inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME; | ||
84 | return inode; | ||
85 | } | ||
86 | |||
87 | static struct dentry *anon_inodefs_mount(struct file_system_type *fs_type, | 41 | static struct dentry *anon_inodefs_mount(struct file_system_type *fs_type, |
88 | int flags, const char *dev_name, void *data) | 42 | int flags, const char *dev_name, void *data) |
89 | { | 43 | { |
@@ -92,7 +46,7 @@ static struct dentry *anon_inodefs_mount(struct file_system_type *fs_type, | |||
92 | &anon_inodefs_dentry_operations, ANON_INODE_FS_MAGIC); | 46 | &anon_inodefs_dentry_operations, ANON_INODE_FS_MAGIC); |
93 | if (!IS_ERR(root)) { | 47 | if (!IS_ERR(root)) { |
94 | struct super_block *s = root->d_sb; | 48 | struct super_block *s = root->d_sb; |
95 | anon_inode_inode = anon_inode_mkinode(s); | 49 | anon_inode_inode = alloc_anon_inode(s); |
96 | if (IS_ERR(anon_inode_inode)) { | 50 | if (IS_ERR(anon_inode_inode)) { |
97 | dput(root); | 51 | dput(root); |
98 | deactivate_locked_super(s); | 52 | deactivate_locked_super(s); |
@@ -134,7 +88,7 @@ struct file *anon_inode_getfile_private(const char *name, | |||
134 | if (fops->owner && !try_module_get(fops->owner)) | 88 | if (fops->owner && !try_module_get(fops->owner)) |
135 | return ERR_PTR(-ENOENT); | 89 | return ERR_PTR(-ENOENT); |
136 | 90 | ||
137 | inode = anon_inode_mkinode(anon_inode_mnt->mnt_sb); | 91 | inode = alloc_anon_inode(anon_inode_mnt->mnt_sb); |
138 | if (IS_ERR(inode)) { | 92 | if (IS_ERR(inode)) { |
139 | file = ERR_PTR(-ENOMEM); | 93 | file = ERR_PTR(-ENOMEM); |
140 | goto err_module; | 94 | goto err_module; |
diff --git a/fs/libfs.c b/fs/libfs.c index 8c5018493154..5de06947ba5e 100644 --- a/fs/libfs.c +++ b/fs/libfs.c | |||
@@ -1002,3 +1002,46 @@ void kfree_put_link(struct dentry *dentry, struct nameidata *nd, | |||
1002 | kfree(s); | 1002 | kfree(s); |
1003 | } | 1003 | } |
1004 | EXPORT_SYMBOL(kfree_put_link); | 1004 | EXPORT_SYMBOL(kfree_put_link); |
1005 | |||
1006 | /* | ||
1007 | * nop .set_page_dirty method so that people can use .page_mkwrite on | ||
1008 | * anon inodes. | ||
1009 | */ | ||
1010 | static int anon_set_page_dirty(struct page *page) | ||
1011 | { | ||
1012 | return 0; | ||
1013 | }; | ||
1014 | |||
1015 | /* | ||
1016 | * A single inode exists for all anon_inode files. Contrary to pipes, | ||
1017 | * anon_inode inodes have no associated per-instance data, so we need | ||
1018 | * only allocate one of them. | ||
1019 | */ | ||
1020 | struct inode *alloc_anon_inode(struct super_block *s) | ||
1021 | { | ||
1022 | static const struct address_space_operations anon_aops = { | ||
1023 | .set_page_dirty = anon_set_page_dirty, | ||
1024 | }; | ||
1025 | struct inode *inode = new_inode_pseudo(s); | ||
1026 | |||
1027 | if (!inode) | ||
1028 | return ERR_PTR(-ENOMEM); | ||
1029 | |||
1030 | inode->i_ino = get_next_ino(); | ||
1031 | inode->i_mapping->a_ops = &anon_aops; | ||
1032 | |||
1033 | /* | ||
1034 | * Mark the inode dirty from the very beginning, | ||
1035 | * that way it will never be moved to the dirty | ||
1036 | * list because mark_inode_dirty() will think | ||
1037 | * that it already _is_ on the dirty list. | ||
1038 | */ | ||
1039 | inode->i_state = I_DIRTY; | ||
1040 | inode->i_mode = S_IRUSR | S_IWUSR; | ||
1041 | inode->i_uid = current_fsuid(); | ||
1042 | inode->i_gid = current_fsgid(); | ||
1043 | inode->i_flags |= S_PRIVATE; | ||
1044 | inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME; | ||
1045 | return inode; | ||
1046 | } | ||
1047 | EXPORT_SYMBOL(alloc_anon_inode); | ||