9
0
Fork 0

fs/mount: add autodetection type support

if NULL is pass as type mount will try to autodetect the filesystem type

Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>
This commit is contained in:
Jean-Christophe PLAGNIOL-VILLARD 2012-08-12 19:28:27 +08:00 committed by Sascha Hauer
parent 7039368327
commit a1b1aec6af
3 changed files with 39 additions and 1 deletions

View File

@ -1,6 +1,11 @@
menu "Filesystem support "
config FS
bool
default y
select FILETYPE
config FS_AUTOMOUNT
bool

30
fs/fs.c
View File

@ -954,6 +954,28 @@ int register_fs_driver(struct fs_driver_d *fsdrv)
}
EXPORT_SYMBOL(register_fs_driver);
static const char *detect_fs(const char *filename)
{
enum filetype type = file_name_detect_type(filename);
struct driver_d *drv;
struct fs_driver_d *fdrv;
if (type == filetype_unknown)
return NULL;
for_each_driver(drv) {
if (drv->bus != &fs_bus)
continue;
fdrv = drv_to_fs_driver(drv);
if (type == fdrv->type)
return drv->name;
}
return NULL;
}
/*
* Mount a device to a directory.
* We do this by registering a new device on which the filesystem
@ -985,6 +1007,12 @@ int mount(const char *device, const char *fsname, const char *_path)
}
}
if (!fsname)
fsname = detect_fs(device);
if (!fsname)
return -ENOENT;
fsdev = xzalloc(sizeof(struct fs_device_d));
fsdev->backingstore = xstrdup(device);
safe_strncpy(fsdev->dev.name, fsname, MAX_DRIVER_NAME);
@ -1222,7 +1250,7 @@ int rmdir (const char *pathname)
fsdev = get_fs_device_and_root_path(&p);
if (!fsdev) {
ret = -ENOENT;
ret = -ENODEV;
goto out;
}
fsdrv = fsdev->driver;

View File

@ -2,6 +2,7 @@
#define __FS_H
#include <driver.h>
#include <filetype.h>
#define PATH_MAX 1024 /* include/linux/limits.h */
@ -72,6 +73,8 @@ struct fs_driver_d {
struct driver_d drv;
enum filetype type;
unsigned long flags;
};
@ -93,6 +96,8 @@ struct fs_device_d {
struct list_head list;
};
#define drv_to_fs_driver(d) container_of(d, struct fs_driver_d, drv)
/*
* standard posix file functions
*/