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:
parent
7039368327
commit
a1b1aec6af
|
@ -1,6 +1,11 @@
|
||||||
|
|
||||||
menu "Filesystem support "
|
menu "Filesystem support "
|
||||||
|
|
||||||
|
config FS
|
||||||
|
bool
|
||||||
|
default y
|
||||||
|
select FILETYPE
|
||||||
|
|
||||||
config FS_AUTOMOUNT
|
config FS_AUTOMOUNT
|
||||||
bool
|
bool
|
||||||
|
|
||||||
|
|
30
fs/fs.c
30
fs/fs.c
|
@ -954,6 +954,28 @@ int register_fs_driver(struct fs_driver_d *fsdrv)
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(register_fs_driver);
|
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.
|
* Mount a device to a directory.
|
||||||
* We do this by registering a new device on which the filesystem
|
* 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 = xzalloc(sizeof(struct fs_device_d));
|
||||||
fsdev->backingstore = xstrdup(device);
|
fsdev->backingstore = xstrdup(device);
|
||||||
safe_strncpy(fsdev->dev.name, fsname, MAX_DRIVER_NAME);
|
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);
|
fsdev = get_fs_device_and_root_path(&p);
|
||||||
if (!fsdev) {
|
if (!fsdev) {
|
||||||
ret = -ENOENT;
|
ret = -ENODEV;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
fsdrv = fsdev->driver;
|
fsdrv = fsdev->driver;
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
#define __FS_H
|
#define __FS_H
|
||||||
|
|
||||||
#include <driver.h>
|
#include <driver.h>
|
||||||
|
#include <filetype.h>
|
||||||
|
|
||||||
#define PATH_MAX 1024 /* include/linux/limits.h */
|
#define PATH_MAX 1024 /* include/linux/limits.h */
|
||||||
|
|
||||||
|
@ -72,6 +73,8 @@ struct fs_driver_d {
|
||||||
|
|
||||||
struct driver_d drv;
|
struct driver_d drv;
|
||||||
|
|
||||||
|
enum filetype type;
|
||||||
|
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -93,6 +96,8 @@ struct fs_device_d {
|
||||||
struct list_head list;
|
struct list_head list;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#define drv_to_fs_driver(d) container_of(d, struct fs_driver_d, drv)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* standard posix file functions
|
* standard posix file functions
|
||||||
*/
|
*/
|
||||||
|
|
Loading…
Reference in New Issue