UBI volume IDs don't have to be contiguous, this may happen if there
were few and the not last one was removed. In such case we may have
e.g. ubi0_0, ubi0_2.
It means we can't simply read value from "volumes_count" and iterate
from 0 to the count - 1.
This patch rewrites ubi_part_match to read whole directory and look
for ubi%d_%d entries in it.
Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
static int ubi_part_match(struct volume *v, char *name, unsigned int ubi_num)
{
static int ubi_part_match(struct volume *v, char *name, unsigned int ubi_num)
{
- unsigned int i, volumes_count;
+ DIR *ubi_dir;
+ struct dirent *ubi_dirent;
+ unsigned int volid;
snprintf(devdir, sizeof(devdir), "%s/ubi%u",
ubi_dir_name, ubi_num);
snprintf(devdir, sizeof(devdir), "%s/ubi%u",
ubi_dir_name, ubi_num);
- if (read_uint_from_file(devdir, "volumes_count", &volumes_count))
- return -1;
+ ubi_dir = opendir(devdir);
+ if (!ubi_dir)
+ return ret;
- for (i=0;i<volumes_count;i++) {
- if (!ubi_volume_match(v, name, ubi_num, i)) {
- return 0;
+ while ((ubi_dirent = readdir(ubi_dir)) != NULL) {
+ if (strncmp(ubi_dirent->d_name, "ubi", 3))
+ continue;
+
+ if (sscanf(ubi_dirent->d_name, "ubi%*u_%u", &volid) != 1)
+ continue;
+
+ if (!ubi_volume_match(v, name, ubi_num, volid)) {
+ ret = 0;
+ break;
}
static int ubi_volume_find(struct volume *v, char *name)
}
static int ubi_volume_find(struct volume *v, char *name)