diff options
Diffstat (limited to 'fs/filesystems.c')
-rw-r--r-- | fs/filesystems.c | 25 |
1 files changed, 14 insertions, 11 deletions
diff --git a/fs/filesystems.c b/fs/filesystems.c index d0e20ced62dd..1aa70260e6d1 100644 --- a/fs/filesystems.c +++ b/fs/filesystems.c | |||
@@ -179,7 +179,7 @@ static int fs_maxindex(void) | |||
179 | /* | 179 | /* |
180 | * Whee.. Weird sysv syscall. | 180 | * Whee.. Weird sysv syscall. |
181 | */ | 181 | */ |
182 | asmlinkage long sys_sysfs(int option, unsigned long arg1, unsigned long arg2) | 182 | SYSCALL_DEFINE3(sysfs, int, option, unsigned long, arg1, unsigned long, arg2) |
183 | { | 183 | { |
184 | int retval = -EINVAL; | 184 | int retval = -EINVAL; |
185 | 185 | ||
@@ -253,24 +253,27 @@ static int __init proc_filesystems_init(void) | |||
253 | module_init(proc_filesystems_init); | 253 | module_init(proc_filesystems_init); |
254 | #endif | 254 | #endif |
255 | 255 | ||
256 | struct file_system_type *get_fs_type(const char *name) | 256 | static struct file_system_type *__get_fs_type(const char *name, int len) |
257 | { | 257 | { |
258 | struct file_system_type *fs; | 258 | struct file_system_type *fs; |
259 | const char *dot = strchr(name, '.'); | ||
260 | unsigned len = dot ? dot - name : strlen(name); | ||
261 | 259 | ||
262 | read_lock(&file_systems_lock); | 260 | read_lock(&file_systems_lock); |
263 | fs = *(find_filesystem(name, len)); | 261 | fs = *(find_filesystem(name, len)); |
264 | if (fs && !try_module_get(fs->owner)) | 262 | if (fs && !try_module_get(fs->owner)) |
265 | fs = NULL; | 263 | fs = NULL; |
266 | read_unlock(&file_systems_lock); | 264 | read_unlock(&file_systems_lock); |
267 | if (!fs && (request_module("%.*s", len, name) == 0)) { | 265 | return fs; |
268 | read_lock(&file_systems_lock); | 266 | } |
269 | fs = *(find_filesystem(name, len)); | 267 | |
270 | if (fs && !try_module_get(fs->owner)) | 268 | struct file_system_type *get_fs_type(const char *name) |
271 | fs = NULL; | 269 | { |
272 | read_unlock(&file_systems_lock); | 270 | struct file_system_type *fs; |
273 | } | 271 | const char *dot = strchr(name, '.'); |
272 | int len = dot ? dot - name : strlen(name); | ||
273 | |||
274 | fs = __get_fs_type(name, len); | ||
275 | if (!fs && (request_module("%.*s", len, name) == 0)) | ||
276 | fs = __get_fs_type(name, len); | ||
274 | 277 | ||
275 | if (dot && fs && !(fs->fs_flags & FS_HAS_SUBTYPE)) { | 278 | if (dot && fs && !(fs->fs_flags & FS_HAS_SUBTYPE)) { |
276 | put_filesystem(fs); | 279 | put_filesystem(fs); |