diff options
author | Sascha Hauer <s.hauer@pengutronix.de> | 2017-06-14 09:29:53 +0200 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2017-06-14 09:29:53 +0200 |
commit | 253412624e0fa60a309c6691b0cd99b6c341df87 (patch) | |
tree | d261ea96f8b29388beb93ec1b05b7b972aa548c1 /fs/fs.c | |
parent | 6191ef93b25edbd75caec9213db3665f486ee433 (diff) | |
parent | c35624d1946a4756c93bdb489f4790176b6e2dcc (diff) | |
download | barebox-253412624e0fa60a309c6691b0cd99b6c341df87.tar.gz barebox-253412624e0fa60a309c6691b0cd99b6c341df87.tar.xz |
Merge branch 'for-next/misc'
Diffstat (limited to 'fs/fs.c')
-rw-r--r-- | fs/fs.c | 36 |
1 files changed, 32 insertions, 4 deletions
@@ -36,6 +36,8 @@ #include <block.h> #include <libfile.h> +#include "parseopt.h" + char *mkmodestr(unsigned long mode, char *str) { static const char *l = "xwr"; @@ -404,6 +406,20 @@ int automount_add(const char *path, const char *cmd) } EXPORT_SYMBOL(automount_add); +void cdev_create_default_automount(struct cdev *cdev) +{ + char *path, *cmd; + + path = basprintf("/mnt/%s", cdev->name); + cmd = basprintf("mount %s", cdev->name); + + make_directory(path); + automount_add(path, cmd); + + free(cmd); + free(path); +} + void automount_print(void) { struct automount *am; @@ -1193,6 +1209,9 @@ static void fs_remove(struct device_d *dev) if (fsdev->cdev) cdev_close(fsdev->cdev); + if (fsdev->loop) + cdev_remove_loop(fsdev->cdev); + free(fsdev->backingstore); free(fsdev); } @@ -1219,13 +1238,18 @@ int register_fs_driver(struct fs_driver_d *fsdrv) } EXPORT_SYMBOL(register_fs_driver); -static const char *detect_fs(const char *filename) +static const char *detect_fs(const char *filename, const char *fsoptions) { enum filetype type; struct driver_d *drv; struct fs_driver_d *fdrv; + bool loop; - type = cdev_detect_type(filename); + parseopt_b(fsoptions, "loop", &loop); + if (loop) + type = file_name_detect_type(filename); + else + type = cdev_detect_type(filename); if (type == filetype_unknown) return NULL; @@ -1242,7 +1266,11 @@ static const char *detect_fs(const char *filename) int fsdev_open_cdev(struct fs_device_d *fsdev) { - fsdev->cdev = cdev_open(fsdev->backingstore, O_RDWR); + parseopt_b(fsdev->options, "loop", &fsdev->loop); + if (fsdev->loop) + fsdev->cdev = cdev_create_loop(fsdev->backingstore, O_RDWR); + else + fsdev->cdev = cdev_open(fsdev->backingstore, O_RDWR); if (!fsdev->cdev) return -EINVAL; @@ -1295,7 +1323,7 @@ int mount(const char *device, const char *fsname, const char *_path, } if (!fsname) - fsname = detect_fs(device); + fsname = detect_fs(device, fsoptions); if (!fsname) return -ENOENT; |