mirror of
https://github.com/tbsdtv/linux_media.git
synced 2025-07-23 04:33:26 +02:00
add filesystem subtype support
There's a slight problem with filesystem type representation in fuse based filesystems. From the kernel's view, there are just two filesystem types: fuse and fuseblk. From the user's view there are lots of different filesystem types. The user is not even much concerned if the filesystem is fuse based or not. So there's a conflict of interest in how this should be represented in fstab, mtab and /proc/mounts. The current scheme is to encode the real filesystem type in the mount source. So an sshfs mount looks like this: sshfs#user@server:/ /mnt/server fuse rw,nosuid,nodev,... This url-ish syntax works OK for sshfs and similar filesystems. However for block device based filesystems (ntfs-3g, zfs) it doesn't work, since the kernel expects the mount source to be a real device name. A possibly better scheme would be to encode the real type in the type field as "type.subtype". So fuse mounts would look like this: /dev/hda1 /mnt/windows fuseblk.ntfs-3g rw,... user@server:/ /mnt/server fuse.sshfs rw,nosuid,nodev,... This patch adds the necessary code to the kernel so that this can be correctly displayed in /proc/mounts. Signed-off-by: Miklos Szeredi <mszeredi@suse.cz> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
committed by
Linus Torvalds
parent
880afc4d76
commit
79c0b2df79
@@ -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;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user