Skip to content

Commit

Permalink
UBI: Add ubi_open_volume_path
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Corentin Chary authored and Artem Bityutskiy committed Nov 24, 2009
1 parent 648f4e3 commit b571028
Show file tree
Hide file tree
Showing 2 changed files with 42 additions and 0 deletions.
40 changes: 40 additions & 0 deletions drivers/mtd/ubi/kapi.c
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@

#include <linux/module.h>
#include <linux/err.h>
#include <linux/namei.h>
#include <linux/fs.h>
#include <asm/div64.h>
#include "ubi.h"

Expand Down Expand Up @@ -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);

/**
* 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.
* @desc: volume descriptor
Expand Down
2 changes: 2 additions & 0 deletions include/linux/mtd/ubi.h
Original file line number Diff line number Diff line change
Expand Up @@ -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_nm(int ubi_num, const char *name,
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 ignore_existing);
int ubi_unregister_volume_notifier(struct notifier_block *nb);
Expand Down

0 comments on commit b571028

Please sign in to comment.