diff options
author | Jan Kara <jack@suse.cz> | 2014-03-26 01:20:14 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2014-03-27 12:52:54 -0400 |
commit | 75c5a52da3fc2a06abb6c6192bdf5d680e56d37d (patch) | |
tree | ad31cd7d9c1d5893d6b2ce392b170c068b625688 /fs | |
parent | f217c44ebd41ce7369d2df07622b2839479183b0 (diff) |
vfs: Allocate anon_inode_inode in anon_inode_init()
Currently we allocated anon_inode_inode in anon_inodefs_mount. This is
somewhat fragile as if that function ever gets called again, it will
overwrite anon_inode_inode pointer. So move the initialization of
anon_inode_inode to anon_inode_init().
Signed-off-by: Jan Kara <jack@suse.cz>
[ Further simplified on suggestion from Dave Jones ]
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'fs')
-rw-r--r-- | fs/anon_inodes.c | 30 |
1 files changed, 8 insertions, 22 deletions
diff --git a/fs/anon_inodes.c b/fs/anon_inodes.c index 42fcc46e2cca..80ef38c73e5a 100644 --- a/fs/anon_inodes.c +++ b/fs/anon_inodes.c | |||
@@ -41,19 +41,8 @@ static const struct dentry_operations anon_inodefs_dentry_operations = { | |||
41 | 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, |
42 | int flags, const char *dev_name, void *data) | 42 | int flags, const char *dev_name, void *data) |
43 | { | 43 | { |
44 | struct dentry *root; | 44 | return mount_pseudo(fs_type, "anon_inode:", NULL, |
45 | root = mount_pseudo(fs_type, "anon_inode:", NULL, | ||
46 | &anon_inodefs_dentry_operations, ANON_INODE_FS_MAGIC); | 45 | &anon_inodefs_dentry_operations, ANON_INODE_FS_MAGIC); |
47 | if (!IS_ERR(root)) { | ||
48 | struct super_block *s = root->d_sb; | ||
49 | anon_inode_inode = alloc_anon_inode(s); | ||
50 | if (IS_ERR(anon_inode_inode)) { | ||
51 | dput(root); | ||
52 | deactivate_locked_super(s); | ||
53 | root = ERR_CAST(anon_inode_inode); | ||
54 | } | ||
55 | } | ||
56 | return root; | ||
57 | } | 46 | } |
58 | 47 | ||
59 | static struct file_system_type anon_inode_fs_type = { | 48 | static struct file_system_type anon_inode_fs_type = { |
@@ -175,18 +164,15 @@ EXPORT_SYMBOL_GPL(anon_inode_getfd); | |||
175 | 164 | ||
176 | static int __init anon_inode_init(void) | 165 | static int __init anon_inode_init(void) |
177 | { | 166 | { |
178 | int error; | ||
179 | |||
180 | anon_inode_mnt = kern_mount(&anon_inode_fs_type); | 167 | anon_inode_mnt = kern_mount(&anon_inode_fs_type); |
181 | if (IS_ERR(anon_inode_mnt)) { | 168 | if (IS_ERR(anon_inode_mnt)) |
182 | error = PTR_ERR(anon_inode_mnt); | 169 | panic("anon_inode_init() kernel mount failed (%ld)\n", PTR_ERR(anon_inode_mnt)); |
183 | goto err_unregister_filesystem; | ||
184 | } | ||
185 | return 0; | ||
186 | 170 | ||
187 | err_unregister_filesystem: | 171 | anon_inode_inode = alloc_anon_inode(anon_inode_mnt->mnt_sb); |
188 | unregister_filesystem(&anon_inode_fs_type); | 172 | if (IS_ERR(anon_inode_inode)) |
189 | panic(KERN_ERR "anon_inode_init() failed (%d)\n", error); | 173 | panic("anon_inode_init() inode allocation failed (%ld)\n", PTR_ERR(anon_inode_inode)); |
174 | |||
175 | return 0; | ||
190 | } | 176 | } |
191 | 177 | ||
192 | fs_initcall(anon_inode_init); | 178 | fs_initcall(anon_inode_init); |