aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/mtd/ubi/vmt.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/mtd/ubi/vmt.c')
-rw-r--r--drivers/mtd/ubi/vmt.c69
1 files changed, 36 insertions, 33 deletions
diff --git a/drivers/mtd/ubi/vmt.c b/drivers/mtd/ubi/vmt.c
index 8330703c098f..ff4d97848d1c 100644
--- a/drivers/mtd/ubi/vmt.c
+++ b/drivers/mtd/ubi/vmt.c
@@ -223,7 +223,7 @@ int ubi_create_volume(struct ubi_device *ubi, struct ubi_mkvol_req *req)
223 } 223 }
224 224
225 if (vol_id == UBI_VOL_NUM_AUTO) { 225 if (vol_id == UBI_VOL_NUM_AUTO) {
226 ubi_err("out of volume IDs"); 226 ubi_err(ubi, "out of volume IDs");
227 err = -ENFILE; 227 err = -ENFILE;
228 goto out_unlock; 228 goto out_unlock;
229 } 229 }
@@ -237,7 +237,7 @@ int ubi_create_volume(struct ubi_device *ubi, struct ubi_mkvol_req *req)
237 /* Ensure that this volume does not exist */ 237 /* Ensure that this volume does not exist */
238 err = -EEXIST; 238 err = -EEXIST;
239 if (ubi->volumes[vol_id]) { 239 if (ubi->volumes[vol_id]) {
240 ubi_err("volume %d already exists", vol_id); 240 ubi_err(ubi, "volume %d already exists", vol_id);
241 goto out_unlock; 241 goto out_unlock;
242 } 242 }
243 243
@@ -246,7 +246,8 @@ int ubi_create_volume(struct ubi_device *ubi, struct ubi_mkvol_req *req)
246 if (ubi->volumes[i] && 246 if (ubi->volumes[i] &&
247 ubi->volumes[i]->name_len == req->name_len && 247 ubi->volumes[i]->name_len == req->name_len &&
248 !strcmp(ubi->volumes[i]->name, req->name)) { 248 !strcmp(ubi->volumes[i]->name, req->name)) {
249 ubi_err("volume \"%s\" exists (ID %d)", req->name, i); 249 ubi_err(ubi, "volume \"%s\" exists (ID %d)",
250 req->name, i);
250 goto out_unlock; 251 goto out_unlock;
251 } 252 }
252 253
@@ -257,9 +258,10 @@ int ubi_create_volume(struct ubi_device *ubi, struct ubi_mkvol_req *req)
257 258
258 /* Reserve physical eraseblocks */ 259 /* Reserve physical eraseblocks */
259 if (vol->reserved_pebs > ubi->avail_pebs) { 260 if (vol->reserved_pebs > ubi->avail_pebs) {
260 ubi_err("not enough PEBs, only %d available", ubi->avail_pebs); 261 ubi_err(ubi, "not enough PEBs, only %d available",
262 ubi->avail_pebs);
261 if (ubi->corr_peb_count) 263 if (ubi->corr_peb_count)
262 ubi_err("%d PEBs are corrupted and not used", 264 ubi_err(ubi, "%d PEBs are corrupted and not used",
263 ubi->corr_peb_count); 265 ubi->corr_peb_count);
264 err = -ENOSPC; 266 err = -ENOSPC;
265 goto out_unlock; 267 goto out_unlock;
@@ -314,7 +316,7 @@ int ubi_create_volume(struct ubi_device *ubi, struct ubi_mkvol_req *req)
314 dev = MKDEV(MAJOR(ubi->cdev.dev), vol_id + 1); 316 dev = MKDEV(MAJOR(ubi->cdev.dev), vol_id + 1);
315 err = cdev_add(&vol->cdev, dev, 1); 317 err = cdev_add(&vol->cdev, dev, 1);
316 if (err) { 318 if (err) {
317 ubi_err("cannot add character device"); 319 ubi_err(ubi, "cannot add character device");
318 goto out_mapping; 320 goto out_mapping;
319 } 321 }
320 322
@@ -326,7 +328,7 @@ int ubi_create_volume(struct ubi_device *ubi, struct ubi_mkvol_req *req)
326 dev_set_name(&vol->dev, "%s_%d", ubi->ubi_name, vol->vol_id); 328 dev_set_name(&vol->dev, "%s_%d", ubi->ubi_name, vol->vol_id);
327 err = device_register(&vol->dev); 329 err = device_register(&vol->dev);
328 if (err) { 330 if (err) {
329 ubi_err("cannot register device"); 331 ubi_err(ubi, "cannot register device");
330 goto out_cdev; 332 goto out_cdev;
331 } 333 }
332 334
@@ -386,7 +388,7 @@ out_unlock:
386 kfree(vol); 388 kfree(vol);
387 else 389 else
388 put_device(&vol->dev); 390 put_device(&vol->dev);
389 ubi_err("cannot create volume %d, error %d", vol_id, err); 391 ubi_err(ubi, "cannot create volume %d, error %d", vol_id, err);
390 return err; 392 return err;
391} 393}
392 394
@@ -454,7 +456,7 @@ int ubi_remove_volume(struct ubi_volume_desc *desc, int no_vtbl)
454 return err; 456 return err;
455 457
456out_err: 458out_err:
457 ubi_err("cannot remove volume %d, error %d", vol_id, err); 459 ubi_err(ubi, "cannot remove volume %d, error %d", vol_id, err);
458 spin_lock(&ubi->volumes_lock); 460 spin_lock(&ubi->volumes_lock);
459 ubi->volumes[vol_id] = vol; 461 ubi->volumes[vol_id] = vol;
460out_unlock: 462out_unlock:
@@ -487,7 +489,7 @@ int ubi_resize_volume(struct ubi_volume_desc *desc, int reserved_pebs)
487 489
488 if (vol->vol_type == UBI_STATIC_VOLUME && 490 if (vol->vol_type == UBI_STATIC_VOLUME &&
489 reserved_pebs < vol->used_ebs) { 491 reserved_pebs < vol->used_ebs) {
490 ubi_err("too small size %d, %d LEBs contain data", 492 ubi_err(ubi, "too small size %d, %d LEBs contain data",
491 reserved_pebs, vol->used_ebs); 493 reserved_pebs, vol->used_ebs);
492 return -EINVAL; 494 return -EINVAL;
493 } 495 }
@@ -516,10 +518,10 @@ int ubi_resize_volume(struct ubi_volume_desc *desc, int reserved_pebs)
516 if (pebs > 0) { 518 if (pebs > 0) {
517 spin_lock(&ubi->volumes_lock); 519 spin_lock(&ubi->volumes_lock);
518 if (pebs > ubi->avail_pebs) { 520 if (pebs > ubi->avail_pebs) {
519 ubi_err("not enough PEBs: requested %d, available %d", 521 ubi_err(ubi, "not enough PEBs: requested %d, available %d",
520 pebs, ubi->avail_pebs); 522 pebs, ubi->avail_pebs);
521 if (ubi->corr_peb_count) 523 if (ubi->corr_peb_count)
522 ubi_err("%d PEBs are corrupted and not used", 524 ubi_err(ubi, "%d PEBs are corrupted and not used",
523 ubi->corr_peb_count); 525 ubi->corr_peb_count);
524 spin_unlock(&ubi->volumes_lock); 526 spin_unlock(&ubi->volumes_lock);
525 err = -ENOSPC; 527 err = -ENOSPC;
@@ -643,7 +645,7 @@ int ubi_add_volume(struct ubi_device *ubi, struct ubi_volume *vol)
643 dev = MKDEV(MAJOR(ubi->cdev.dev), vol->vol_id + 1); 645 dev = MKDEV(MAJOR(ubi->cdev.dev), vol->vol_id + 1);
644 err = cdev_add(&vol->cdev, dev, 1); 646 err = cdev_add(&vol->cdev, dev, 1);
645 if (err) { 647 if (err) {
646 ubi_err("cannot add character device for volume %d, error %d", 648 ubi_err(ubi, "cannot add character device for volume %d, error %d",
647 vol_id, err); 649 vol_id, err);
648 return err; 650 return err;
649 } 651 }
@@ -710,7 +712,7 @@ static int self_check_volume(struct ubi_device *ubi, int vol_id)
710 712
711 if (!vol) { 713 if (!vol) {
712 if (reserved_pebs) { 714 if (reserved_pebs) {
713 ubi_err("no volume info, but volume exists"); 715 ubi_err(ubi, "no volume info, but volume exists");
714 goto fail; 716 goto fail;
715 } 717 }
716 spin_unlock(&ubi->volumes_lock); 718 spin_unlock(&ubi->volumes_lock);
@@ -719,90 +721,91 @@ static int self_check_volume(struct ubi_device *ubi, int vol_id)
719 721
720 if (vol->reserved_pebs < 0 || vol->alignment < 0 || vol->data_pad < 0 || 722 if (vol->reserved_pebs < 0 || vol->alignment < 0 || vol->data_pad < 0 ||
721 vol->name_len < 0) { 723 vol->name_len < 0) {
722 ubi_err("negative values"); 724 ubi_err(ubi, "negative values");
723 goto fail; 725 goto fail;
724 } 726 }
725 if (vol->alignment > ubi->leb_size || vol->alignment == 0) { 727 if (vol->alignment > ubi->leb_size || vol->alignment == 0) {
726 ubi_err("bad alignment"); 728 ubi_err(ubi, "bad alignment");
727 goto fail; 729 goto fail;
728 } 730 }
729 731
730 n = vol->alignment & (ubi->min_io_size - 1); 732 n = vol->alignment & (ubi->min_io_size - 1);
731 if (vol->alignment != 1 && n) { 733 if (vol->alignment != 1 && n) {
732 ubi_err("alignment is not multiple of min I/O unit"); 734 ubi_err(ubi, "alignment is not multiple of min I/O unit");
733 goto fail; 735 goto fail;
734 } 736 }
735 737
736 n = ubi->leb_size % vol->alignment; 738 n = ubi->leb_size % vol->alignment;
737 if (vol->data_pad != n) { 739 if (vol->data_pad != n) {
738 ubi_err("bad data_pad, has to be %lld", n); 740 ubi_err(ubi, "bad data_pad, has to be %lld", n);
739 goto fail; 741 goto fail;
740 } 742 }
741 743
742 if (vol->vol_type != UBI_DYNAMIC_VOLUME && 744 if (vol->vol_type != UBI_DYNAMIC_VOLUME &&
743 vol->vol_type != UBI_STATIC_VOLUME) { 745 vol->vol_type != UBI_STATIC_VOLUME) {
744 ubi_err("bad vol_type"); 746 ubi_err(ubi, "bad vol_type");
745 goto fail; 747 goto fail;
746 } 748 }
747 749
748 if (vol->upd_marker && vol->corrupted) { 750 if (vol->upd_marker && vol->corrupted) {
749 ubi_err("update marker and corrupted simultaneously"); 751 ubi_err(ubi, "update marker and corrupted simultaneously");
750 goto fail; 752 goto fail;
751 } 753 }
752 754
753 if (vol->reserved_pebs > ubi->good_peb_count) { 755 if (vol->reserved_pebs > ubi->good_peb_count) {
754 ubi_err("too large reserved_pebs"); 756 ubi_err(ubi, "too large reserved_pebs");
755 goto fail; 757 goto fail;
756 } 758 }
757 759
758 n = ubi->leb_size - vol->data_pad; 760 n = ubi->leb_size - vol->data_pad;
759 if (vol->usable_leb_size != ubi->leb_size - vol->data_pad) { 761 if (vol->usable_leb_size != ubi->leb_size - vol->data_pad) {
760 ubi_err("bad usable_leb_size, has to be %lld", n); 762 ubi_err(ubi, "bad usable_leb_size, has to be %lld", n);
761 goto fail; 763 goto fail;
762 } 764 }
763 765
764 if (vol->name_len > UBI_VOL_NAME_MAX) { 766 if (vol->name_len > UBI_VOL_NAME_MAX) {
765 ubi_err("too long volume name, max is %d", UBI_VOL_NAME_MAX); 767 ubi_err(ubi, "too long volume name, max is %d",
768 UBI_VOL_NAME_MAX);
766 goto fail; 769 goto fail;
767 } 770 }
768 771
769 n = strnlen(vol->name, vol->name_len + 1); 772 n = strnlen(vol->name, vol->name_len + 1);
770 if (n != vol->name_len) { 773 if (n != vol->name_len) {
771 ubi_err("bad name_len %lld", n); 774 ubi_err(ubi, "bad name_len %lld", n);
772 goto fail; 775 goto fail;
773 } 776 }
774 777
775 n = (long long)vol->used_ebs * vol->usable_leb_size; 778 n = (long long)vol->used_ebs * vol->usable_leb_size;
776 if (vol->vol_type == UBI_DYNAMIC_VOLUME) { 779 if (vol->vol_type == UBI_DYNAMIC_VOLUME) {
777 if (vol->corrupted) { 780 if (vol->corrupted) {
778 ubi_err("corrupted dynamic volume"); 781 ubi_err(ubi, "corrupted dynamic volume");
779 goto fail; 782 goto fail;
780 } 783 }
781 if (vol->used_ebs != vol->reserved_pebs) { 784 if (vol->used_ebs != vol->reserved_pebs) {
782 ubi_err("bad used_ebs"); 785 ubi_err(ubi, "bad used_ebs");
783 goto fail; 786 goto fail;
784 } 787 }
785 if (vol->last_eb_bytes != vol->usable_leb_size) { 788 if (vol->last_eb_bytes != vol->usable_leb_size) {
786 ubi_err("bad last_eb_bytes"); 789 ubi_err(ubi, "bad last_eb_bytes");
787 goto fail; 790 goto fail;
788 } 791 }
789 if (vol->used_bytes != n) { 792 if (vol->used_bytes != n) {
790 ubi_err("bad used_bytes"); 793 ubi_err(ubi, "bad used_bytes");
791 goto fail; 794 goto fail;
792 } 795 }
793 } else { 796 } else {
794 if (vol->used_ebs < 0 || vol->used_ebs > vol->reserved_pebs) { 797 if (vol->used_ebs < 0 || vol->used_ebs > vol->reserved_pebs) {
795 ubi_err("bad used_ebs"); 798 ubi_err(ubi, "bad used_ebs");
796 goto fail; 799 goto fail;
797 } 800 }
798 if (vol->last_eb_bytes < 0 || 801 if (vol->last_eb_bytes < 0 ||
799 vol->last_eb_bytes > vol->usable_leb_size) { 802 vol->last_eb_bytes > vol->usable_leb_size) {
800 ubi_err("bad last_eb_bytes"); 803 ubi_err(ubi, "bad last_eb_bytes");
801 goto fail; 804 goto fail;
802 } 805 }
803 if (vol->used_bytes < 0 || vol->used_bytes > n || 806 if (vol->used_bytes < 0 || vol->used_bytes > n ||
804 vol->used_bytes < n - vol->usable_leb_size) { 807 vol->used_bytes < n - vol->usable_leb_size) {
805 ubi_err("bad used_bytes"); 808 ubi_err(ubi, "bad used_bytes");
806 goto fail; 809 goto fail;
807 } 810 }
808 } 811 }
@@ -820,7 +823,7 @@ static int self_check_volume(struct ubi_device *ubi, int vol_id)
820 if (alignment != vol->alignment || data_pad != vol->data_pad || 823 if (alignment != vol->alignment || data_pad != vol->data_pad ||
821 upd_marker != vol->upd_marker || vol_type != vol->vol_type || 824 upd_marker != vol->upd_marker || vol_type != vol->vol_type ||
822 name_len != vol->name_len || strncmp(name, vol->name, name_len)) { 825 name_len != vol->name_len || strncmp(name, vol->name, name_len)) {
823 ubi_err("volume info is different"); 826 ubi_err(ubi, "volume info is different");
824 goto fail; 827 goto fail;
825 } 828 }
826 829
@@ -828,7 +831,7 @@ static int self_check_volume(struct ubi_device *ubi, int vol_id)
828 return 0; 831 return 0;
829 832
830fail: 833fail:
831 ubi_err("self-check failed for volume %d", vol_id); 834 ubi_err(ubi, "self-check failed for volume %d", vol_id);
832 if (vol) 835 if (vol)
833 ubi_dump_vol_info(vol); 836 ubi_dump_vol_info(vol);
834 ubi_dump_vtbl_record(&ubi->vtbl[vol_id], vol_id); 837 ubi_dump_vtbl_record(&ubi->vtbl[vol_id], vol_id);