|
@@ -41,11 +41,12 @@ void put_filesystem(struct file_system_type *fs)
|
|
|
module_put(fs->owner);
|
|
|
}
|
|
|
|
|
|
-static struct file_system_type **find_filesystem(const char *name)
|
|
|
+static struct file_system_type **find_filesystem(const char *name, unsigned len)
|
|
|
{
|
|
|
struct file_system_type **p;
|
|
|
for (p=&file_systems; *p; p=&(*p)->next)
|
|
|
- if (strcmp((*p)->name,name) == 0)
|
|
|
+ if (strlen((*p)->name) == len &&
|
|
|
+ strncmp((*p)->name, name, len) == 0)
|
|
|
break;
|
|
|
return p;
|
|
|
}
|
|
@@ -68,11 +69,12 @@ int register_filesystem(struct file_system_type * fs)
|
|
|
int res = 0;
|
|
|
struct file_system_type ** p;
|
|
|
|
|
|
+ BUG_ON(strchr(fs->name, '.'));
|
|
|
if (fs->next)
|
|
|
return -EBUSY;
|
|
|
INIT_LIST_HEAD(&fs->fs_supers);
|
|
|
write_lock(&file_systems_lock);
|
|
|
- p = find_filesystem(fs->name);
|
|
|
+ p = find_filesystem(fs->name, strlen(fs->name));
|
|
|
if (*p)
|
|
|
res = -EBUSY;
|
|
|
else
|
|
@@ -215,19 +217,26 @@ int get_filesystem_list(char * buf)
|
|
|
struct file_system_type *get_fs_type(const char *name)
|
|
|
{
|
|
|
struct file_system_type *fs;
|
|
|
+ const char *dot = strchr(name, '.');
|
|
|
+ unsigned len = dot ? dot - name : strlen(name);
|
|
|
|
|
|
read_lock(&file_systems_lock);
|
|
|
- fs = *(find_filesystem(name));
|
|
|
+ fs = *(find_filesystem(name, len));
|
|
|
if (fs && !try_module_get(fs->owner))
|
|
|
fs = NULL;
|
|
|
read_unlock(&file_systems_lock);
|
|
|
- if (!fs && (request_module("%s", name) == 0)) {
|
|
|
+ if (!fs && (request_module("%.*s", len, name) == 0)) {
|
|
|
read_lock(&file_systems_lock);
|
|
|
- fs = *(find_filesystem(name));
|
|
|
+ fs = *(find_filesystem(name, len));
|
|
|
if (fs && !try_module_get(fs->owner))
|
|
|
fs = NULL;
|
|
|
read_unlock(&file_systems_lock);
|
|
|
}
|
|
|
+
|
|
|
+ if (dot && fs && !(fs->fs_flags & FS_HAS_SUBTYPE)) {
|
|
|
+ put_filesystem(fs);
|
|
|
+ fs = NULL;
|
|
|
+ }
|
|
|
return fs;
|
|
|
}
|
|
|
|