To find all the ubi volume ids on a given UBI, we need a helper. The added functions allow to use ubi_volume_for_each() to get each volume id of a UBI. Signed-off-by: Markus Pargmann <mpa@xxxxxxxxxxxxxx> --- drivers/mtd/ubi/kapi.c | 42 ++++++++++++++++++++++++++++++++++++++++++ include/linux/mtd/ubi.h | 11 +++++++++++ 2 files changed, 53 insertions(+) diff --git a/drivers/mtd/ubi/kapi.c b/drivers/mtd/ubi/kapi.c index c2e58e865753..f3b0f0d85d84 100644 --- a/drivers/mtd/ubi/kapi.c +++ b/drivers/mtd/ubi/kapi.c @@ -308,6 +308,48 @@ void ubi_close_volume(struct ubi_volume_desc *desc) } EXPORT_SYMBOL_GPL(ubi_close_volume); +int ubi_volume_first(int ubi_num, struct ubi_device **ubi, int *vol_id) +{ + int i; + + /* We keep the device until the last call of ubi_volume_next + * or ubi_volume_abort */ + *ubi = ubi_get_device(ubi_num); + if (!*ubi) + return -ENODEV; + + for (i = 0; i < (*ubi)->vtbl_slots; ++i) { + if ((*ubi)->volumes[i]) { + *vol_id = i; + return 0; + } + } + + ubi_put_device(*ubi); + return -ENOENT; +} + +int ubi_volume_next(struct ubi_device *ubi, int *vol_id) +{ + int i; + + for (i = *vol_id + 1; i < ubi->vtbl_slots; ++i) { + if (ubi->volumes[i]) { + *vol_id = i; + return 0; + } + } + + ubi_put_device(ubi); + + return -ENOENT; +} + +void ubi_volume_abort(struct ubi_device *ubi) +{ + ubi_put_device(ubi); +} + struct cdev *ubi_volume_get_cdev(struct ubi_volume_desc *vol) { return &vol->vol->cdev; diff --git a/include/linux/mtd/ubi.h b/include/linux/mtd/ubi.h index 0725b04f9dfd..344842e4ed97 100644 --- a/include/linux/mtd/ubi.h +++ b/include/linux/mtd/ubi.h @@ -220,6 +220,17 @@ int ubi_flush(int ubi_num, int vol_id, int lnum); struct cdev *ubi_volume_get_cdev(struct ubi_volume_desc *vol); +struct ubi_device; +int ubi_volume_first(int ubi_num, struct ubi_device **ubi, int *vol_id); +int ubi_volume_next(struct ubi_device *ubi, int *vol_id); +void ubi_volume_abort(struct ubi_device *ubi); + +#define ubi_volume_for_each(ubi_num, ubi, vol_id, ret) \ + for (ret = ubi_volume_first(ubi_num, &(ubi), &(vol_id)); \ + !ret; \ + ret = ubi_volume_next(ubi, &(vol_id))) + + /* * This function is the same as the 'ubi_leb_read()' function, but it does not * provide the checking capability. -- 2.7.0 _______________________________________________ barebox mailing list barebox@xxxxxxxxxxxxxxxxxxx http://lists.infradead.org/mailman/listinfo/barebox