28 #include <linux/slab.h>
29 #include <linux/export.h>
32 static int self_check_volumes(
struct ubi_device *ubi);
88 if (attr == &attr_vol_reserved_ebs)
90 else if (attr == &attr_vol_type) {
98 }
else if (attr == &attr_vol_name)
100 else if (attr == &attr_vol_corrupted)
102 else if (attr == &attr_vol_alignment)
104 else if (attr == &attr_vol_usable_eb_size)
106 else if (attr == &attr_vol_data_bytes)
108 else if (attr == &attr_vol_upd_marker)
124 static void vol_release(
struct device *dev)
177 static void volume_sysfs_close(
struct ubi_volume *vol)
218 dbg_gen(
"search for vacant volume ID");
233 dbg_gen(
"create device %d, volume %d, %llu bytes, type %d, name %s",
240 ubi_err(
"volume %d already exists", vol_id);
249 ubi_err(
"volume \"%s\" exists (ID %d)", req->
name, i);
262 ubi_err(
"%d PEBs are corrupted and not used",
317 ubi_err(
"cannot add character device");
321 vol->
dev.release = vol_release;
322 vol->
dev.parent = &ubi->
dev;
329 ubi_err(
"cannot register device");
333 err = volume_sysfs_init(ubi, vol);
359 self_check_volumes(ubi);
373 volume_sysfs_close(vol);
389 ubi_err(
"cannot create volume %d, error %d", vol_id, err);
441 volume_sysfs_close(vol);
452 self_check_volumes(ubi);
457 ubi_err(
"cannot remove volume %d, error %d", vol_id, err);
476 int i,
err, pebs, *new_mapping;
485 dbg_gen(
"re-size device %d, volume %d to from %d to %d PEBs",
489 reserved_pebs < vol->used_ebs) {
490 ubi_err(
"too small size %d, %d LEBs contain data",
519 ubi_err(
"not enough PEBs: requested %d, available %d",
522 ubi_err(
"%d PEBs are corrupted and not used",
531 new_mapping[i] = vol->
eba_tbl[i];
545 for (i = 0; i < -pebs; i++) {
555 new_mapping[i] = vol->
eba_tbl[i];
570 self_check_volumes(ubi);
620 self_check_volumes(ubi);
638 dbg_gen(
"add volume %d", vol_id);
646 ubi_err(
"cannot add character device for volume %d, error %d",
651 vol->
dev.release = vol_release;
652 vol->
dev.parent = &ubi->
dev;
660 err = volume_sysfs_init(ubi, vol);
663 volume_sysfs_close(vol);
667 self_check_volumes(ubi);
689 volume_sysfs_close(vol);
701 int idx = vol_id2idx(ubi, vol_id);
713 ubi_err(
"no volume info, but volume exists");
732 ubi_err(
"alignment is not multiple of min I/O unit");
738 ubi_err(
"bad data_pad, has to be %lld", n);
749 ubi_err(
"update marker and corrupted simultaneously");
754 ubi_err(
"too large reserved_pebs");
760 ubi_err(
"bad usable_leb_size, has to be %lld", n);
771 ubi_err(
"bad name_len %lld", n);
778 ubi_err(
"corrupted dynamic volume");
823 ubi_err(
"volume info is different");
831 ubi_err(
"self-check failed for volume %d", vol_id);
846 static int self_check_volumes(
struct ubi_device *ubi)
850 if (!ubi->
dbg->chk_gen)
854 err = self_check_volume(ubi, i);