UBI: Add ubi_open_volume_path
Add an 'ubi_open_volume_path(path, mode)' function which works like 'open_bdev_exclusive(path, mode, ...)' where path is the special file representing the UBI volume, typically /dev/ubi0_0. This is needed to teach UBIFS being able to mount UBI character devices. [Comments and the patch were amended a bit by Artem] Signed-off-by: Corentin Chary <corentincj@iksaif.net> Signed-off-by: Artem Bityutskiy <Artem.Bityutskiy@nokia.com>
This commit is contained in:
committed by
Artem Bityutskiy
parent
648f4e3e50
commit
b571028418
@@ -22,6 +22,8 @@
|
|||||||
|
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/err.h>
|
#include <linux/err.h>
|
||||||
|
#include <linux/namei.h>
|
||||||
|
#include <linux/fs.h>
|
||||||
#include <asm/div64.h>
|
#include <asm/div64.h>
|
||||||
#include "ubi.h"
|
#include "ubi.h"
|
||||||
|
|
||||||
@@ -279,6 +281,44 @@ struct ubi_volume_desc *ubi_open_volume_nm(int ubi_num, const char *name,
|
|||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(ubi_open_volume_nm);
|
EXPORT_SYMBOL_GPL(ubi_open_volume_nm);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ubi_open_volume_path - open UBI volume by its character device node path.
|
||||||
|
* @pathname: volume character device node path
|
||||||
|
* @mode: open mode
|
||||||
|
*
|
||||||
|
* This function is similar to 'ubi_open_volume()', but opens a volume the path
|
||||||
|
* to its character device node.
|
||||||
|
*/
|
||||||
|
struct ubi_volume_desc *ubi_open_volume_path(const char *pathname, int mode)
|
||||||
|
{
|
||||||
|
int error, ubi_num, vol_id;
|
||||||
|
struct ubi_volume_desc *ret;
|
||||||
|
struct inode *inode;
|
||||||
|
struct path path;
|
||||||
|
|
||||||
|
dbg_gen("open volume %s, mode %d", pathname, mode);
|
||||||
|
|
||||||
|
if (!pathname || !*pathname)
|
||||||
|
return ERR_PTR(-EINVAL);
|
||||||
|
|
||||||
|
error = kern_path(pathname, LOOKUP_FOLLOW, &path);
|
||||||
|
if (error)
|
||||||
|
return ERR_PTR(error);
|
||||||
|
|
||||||
|
inode = path.dentry->d_inode;
|
||||||
|
ubi_num = ubi_major2num(imajor(inode));
|
||||||
|
vol_id = iminor(inode) - 1;
|
||||||
|
|
||||||
|
if (vol_id >= 0 && ubi_num >= 0)
|
||||||
|
ret = ubi_open_volume(ubi_num, vol_id, mode);
|
||||||
|
else
|
||||||
|
ret = ERR_PTR(-ENODEV);
|
||||||
|
|
||||||
|
path_put(&path);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(ubi_open_volume_path);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ubi_close_volume - close UBI volume.
|
* ubi_close_volume - close UBI volume.
|
||||||
* @desc: volume descriptor
|
* @desc: volume descriptor
|
||||||
|
@@ -174,6 +174,8 @@ void ubi_get_volume_info(struct ubi_volume_desc *desc,
|
|||||||
struct ubi_volume_desc *ubi_open_volume(int ubi_num, int vol_id, int mode);
|
struct ubi_volume_desc *ubi_open_volume(int ubi_num, int vol_id, int mode);
|
||||||
struct ubi_volume_desc *ubi_open_volume_nm(int ubi_num, const char *name,
|
struct ubi_volume_desc *ubi_open_volume_nm(int ubi_num, const char *name,
|
||||||
int mode);
|
int mode);
|
||||||
|
struct ubi_volume_desc *ubi_open_volume_path(const char *pathname, int mode);
|
||||||
|
|
||||||
int ubi_register_volume_notifier(struct notifier_block *nb,
|
int ubi_register_volume_notifier(struct notifier_block *nb,
|
||||||
int ignore_existing);
|
int ignore_existing);
|
||||||
int ubi_unregister_volume_notifier(struct notifier_block *nb);
|
int ubi_unregister_volume_notifier(struct notifier_block *nb);
|
||||||
|
Reference in New Issue
Block a user