/* MTD devices specification parameters */
static struct mtd_dev_param mtd_dev_param[UBI_MAX_DEVICES];
-/* Number of UBI devices in system */
-int ubi_devices_cnt;
-
/* All UBI devices in system */
struct ubi_device *ubi_devices[UBI_MAX_DEVICES];
}
/* Check if we already have the same MTD device attached */
- for (i = 0; i < ubi_devices_cnt; i++)
- if (ubi_devices[i]->mtd->index == mtd->index) {
+ for (i = 0; i < UBI_MAX_DEVICES; i++)
+ ubi = ubi_devices[i];
+ if (ubi && ubi->mtd->index == mtd->index) {
ubi_err("mtd%d is already attached to ubi%d",
mtd->index, i);
err = -EINVAL;
goto out_mtd;
}
- ubi = ubi_devices[ubi_devices_cnt] = kzalloc(sizeof(struct ubi_device),
- GFP_KERNEL);
+ ubi = kzalloc(sizeof(struct ubi_device), GFP_KERNEL);
if (!ubi) {
err = -ENOMEM;
goto out_mtd;
}
- ubi->ubi_num = ubi_devices_cnt;
ubi->mtd = mtd;
+ /* Search for an empty slot in the @ubi_devices array */
+ ubi->ubi_num = -1;
+ for (i = 0; i < UBI_MAX_DEVICES; i++)
+ if (!ubi_devices[i]) {
+ ubi->ubi_num = i;
+ break;
+ }
+
+ if (ubi->ubi_num == -1) {
+ ubi_err("only %d UBI devices may be created", UBI_MAX_DEVICES);
+ err = -ENFILE;
+ goto out_free;
+ }
+
dbg_msg("attaching mtd%d to ubi%d: VID header offset %d data offset %d",
- ubi->mtd->index, ubi_devices_cnt, vid_hdr_offset, data_offset);
+ ubi->mtd->index, ubi->ubi_num, vid_hdr_offset, data_offset);
ubi->vid_hdr_offset = vid_hdr_offset;
ubi->leb_start = data_offset;
if (err)
goto out_detach;
- ubi_msg("attached mtd%d to ubi%d", ubi->mtd->index, ubi_devices_cnt);
+ ubi_msg("attached mtd%d to ubi%d", ubi->mtd->index, ubi->ubi_num);
ubi_msg("MTD device name: \"%s\"", ubi->mtd->name);
ubi_msg("MTD device size: %llu MiB", ubi->flash_size >> 20);
ubi_msg("physical eraseblock size: %d bytes (%d KiB)",
wake_up_process(ubi->bgt_thread);
}
- ubi_devices_cnt += 1;
+ ubi_devices[ubi->ubi_num] = ubi;
return 0;
out_detach:
kfree(ubi);
out_mtd:
put_mtd_device(mtd);
- ubi_devices[ubi_devices_cnt] = NULL;
return err;
}
#endif
kfree(ubi_devices[ubi_num]);
ubi_devices[ubi_num] = NULL;
- ubi_devices_cnt -= 1;
- ubi_assert(ubi_devices_cnt >= 0);
ubi_msg("mtd%d is detached from ubi%d", mtd_num, ubi_num);
}
static void __exit ubi_exit(void)
{
- int i, n = ubi_devices_cnt;
+ int i;
- for (i = 0; i < n; i++)
- detach_mtd_dev(ubi_devices[i]);
+ for (i = 0; i < UBI_MAX_DEVICES; i++)
+ if (ubi_devices[i])
+ detach_mtd_dev(ubi_devices[i]);
kmem_cache_destroy(ubi_wl_entry_slab);
kmem_cache_destroy(ubi_ltree_slab);
class_remove_file(ubi_class, &ubi_version);