diff options
author | Sascha Hauer <s.hauer@pengutronix.de> | 2013-09-28 00:02:39 +0200 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2013-09-30 16:03:02 +0200 |
commit | cd1622738337b5564cc4d2b8f99832fb50bdeb06 (patch) | |
tree | 001def07ba755534c37b2f73190d8fefb2fb8085 /fs | |
parent | 4dda27ce490e13901e59f108db980052afefc4fb (diff) | |
download | barebox-cd1622738337b5564cc4d2b8f99832fb50bdeb06.tar.gz barebox-cd1622738337b5564cc4d2b8f99832fb50bdeb06.tar.xz |
fs: add cdev mount helpers
Introduce helpers to iterate over cdevs and mount them to a known
path.
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'fs')
-rw-r--r-- | fs/fs.c | 80 |
1 files changed, 80 insertions, 0 deletions
@@ -32,6 +32,7 @@ #include <magicvar.h> #include <environment.h> #include <libgen.h> +#include <block.h> void *read_file(const char *filename, size_t *size) { @@ -1670,3 +1671,82 @@ ssize_t mem_write(struct cdev *cdev, const void *buf, size_t count, loff_t offse return size; } EXPORT_SYMBOL(mem_write); + +/* + * cdev_get_mount_path - return the path a cdev is mounted on + * + * If a cdev is mounted return the path it's mounted on, NULL + * otherwise. + */ +const char *cdev_get_mount_path(struct cdev *cdev) +{ + struct fs_device_d *fsdev; + + for_each_fs_device(fsdev) { + if (fsdev->cdev && fsdev->cdev == cdev) + return fsdev->path; + } + + return NULL; +} + +/* + * cdev_mount_default - mount a cdev to the default path + * + * If a cdev is already mounted return the path it's mounted on, otherwise + * mount it to /mnt/<cdevname> and return the path. Returns an error pointer + * on failure. + */ +const char *cdev_mount_default(struct cdev *cdev) +{ + const char *path; + char *newpath, *devpath; + int ret; + + /* + * If this cdev is already mounted somewhere use this path + * instead of mounting it again to avoid corruption on the + * filesystem. + */ + path = cdev_get_mount_path(cdev); + if (path) + return path; + + newpath = asprintf("/mnt/%s", cdev->name); + make_directory(newpath); + + devpath = asprintf("/dev/%s", cdev->name); + + ret = mount(devpath, NULL, newpath); + + free(devpath); + + if (ret) { + free(newpath); + return ERR_PTR(ret); + } + + return cdev_get_mount_path(cdev); +} + +/* + * mount_all - iterate over block devices and mount all devices we are able to + */ +void mount_all(void) +{ + struct device_d *dev; + struct block_device *bdev; + + if (!IS_ENABLED(CONFIG_BLOCK)) + return; + + for_each_device(dev) + device_detect(dev); + + for_each_block_device(bdev) { + struct cdev *cdev = &bdev->cdev; + + list_for_each_entry(cdev, &bdev->dev->cdevs, devices_list) + cdev_mount_default(cdev); + } +} |