summaryrefslogtreecommitdiffstats
path: root/fs/fs.c
diff options
context:
space:
mode:
authorSascha Hauer <s.hauer@pengutronix.de>2017-06-14 09:29:53 +0200
committerSascha Hauer <s.hauer@pengutronix.de>2017-06-14 09:29:53 +0200
commit253412624e0fa60a309c6691b0cd99b6c341df87 (patch)
treed261ea96f8b29388beb93ec1b05b7b972aa548c1 /fs/fs.c
parent6191ef93b25edbd75caec9213db3665f486ee433 (diff)
parentc35624d1946a4756c93bdb489f4790176b6e2dcc (diff)
downloadbarebox-253412624e0fa60a309c6691b0cd99b6c341df87.tar.gz
barebox-253412624e0fa60a309c6691b0cd99b6c341df87.tar.xz
Merge branch 'for-next/misc'
Diffstat (limited to 'fs/fs.c')
-rw-r--r--fs/fs.c36
1 files changed, 32 insertions, 4 deletions
diff --git a/fs/fs.c b/fs/fs.c
index 1da080502c..0a5b61a2b0 100644
--- a/fs/fs.c
+++ b/fs/fs.c
@@ -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;