1 /* 2 * Copyright (c) International Business Machines Corp., 2006 3 * 4 * This program is free software; you can redistribute it and/or modify 5 * it under the terms of the GNU General Public License as published by 6 * the Free Software Foundation; either version 2 of the License, or 7 * (at your option) any later version. 8 * 9 * This program is distributed in the hope that it will be useful, 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See 12 * the GNU General Public License for more details. 13 * 14 * You should have received a copy of the GNU General Public License 15 * along with this program; if not, write to the Free Software 16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 17 * 18 * Author: Artem Bityutskiy (Битюцкий Артём) 19 */ 20 21 /* 22 * This file contains implementation of volume creation, deletion, updating and 23 * resizing. 24 */ 25 26 #include <linux/err.h> 27 #include <linux/math64.h> 28 #include <linux/slab.h> 29 #include "ubi.h" 30 31 #ifdef CONFIG_MTD_UBI_DEBUG_PARANOID 32 static int paranoid_check_volumes(struct ubi_device *ubi); 33 #else 34 #define paranoid_check_volumes(ubi) 0 35 #endif 36 37 static ssize_t vol_attribute_show(struct device *dev, 38 struct device_attribute *attr, char *buf); 39 40 /* Device attributes corresponding to files in '/<sysfs>/class/ubi/ubiX_Y' */ 41 static struct device_attribute attr_vol_reserved_ebs = 42 __ATTR(reserved_ebs, S_IRUGO, vol_attribute_show, NULL); 43 static struct device_attribute attr_vol_type = 44 __ATTR(type, S_IRUGO, vol_attribute_show, NULL); 45 static struct device_attribute attr_vol_name = 46 __ATTR(name, S_IRUGO, vol_attribute_show, NULL); 47 static struct device_attribute attr_vol_corrupted = 48 __ATTR(corrupted, S_IRUGO, vol_attribute_show, NULL); 49 static struct device_attribute attr_vol_alignment = 50 __ATTR(alignment, S_IRUGO, vol_attribute_show, NULL); 51 static struct device_attribute attr_vol_usable_eb_size = 52 __ATTR(usable_eb_size, S_IRUGO, vol_attribute_show, NULL); 53 static struct device_attribute attr_vol_data_bytes = 54 __ATTR(data_bytes, S_IRUGO, vol_attribute_show, NULL); 55 static struct device_attribute attr_vol_upd_marker = 56 __ATTR(upd_marker, S_IRUGO, vol_attribute_show, NULL); 57 58 /* 59 * "Show" method for files in '/<sysfs>/class/ubi/ubiX_Y/'. 60 * 61 * Consider a situation: 62 * A. process 1 opens a sysfs file related to volume Y, say 63 * /<sysfs>/class/ubi/ubiX_Y/reserved_ebs; 64 * B. process 2 removes volume Y; 65 * C. process 1 starts reading the /<sysfs>/class/ubi/ubiX_Y/reserved_ebs file; 66 * 67 * In this situation, this function will return %-ENODEV because it will find 68 * out that the volume was removed from the @ubi->volumes array. 69 */ 70 static ssize_t vol_attribute_show(struct device *dev, 71 struct device_attribute *attr, char *buf) 72 { 73 int ret; 74 struct ubi_volume *vol = container_of(dev, struct ubi_volume, dev); 75 struct ubi_device *ubi; 76 77 ubi = ubi_get_device(vol->ubi->ubi_num); 78 if (!ubi) 79 return -ENODEV; 80 81 spin_lock(&ubi->volumes_lock); 82 if (!ubi->volumes[vol->vol_id]) { 83 spin_unlock(&ubi->volumes_lock); 84 ubi_put_device(ubi); 85 return -ENODEV; 86 } 87 /* Take a reference to prevent volume removal */ 88 vol->ref_count += 1; 89 spin_unlock(&ubi->volumes_lock); 90 91 if (attr == &attr_vol_reserved_ebs) 92 ret = sprintf(buf, "%d\n", vol->reserved_pebs); 93 else if (attr == &attr_vol_type) { 94 const char *tp; 95 96 if (vol->vol_type == UBI_DYNAMIC_VOLUME) 97 tp = "dynamic"; 98 else 99 tp = "static"; 100 ret = sprintf(buf, "%s\n", tp); 101 } else if (attr == &attr_vol_name) 102 ret = sprintf(buf, "%s\n", vol->name); 103 else if (attr == &attr_vol_corrupted) 104 ret = sprintf(buf, "%d\n", vol->corrupted); 105 else if (attr == &attr_vol_alignment) 106 ret = sprintf(buf, "%d\n", vol->alignment); 107 else if (attr == &attr_vol_usable_eb_size) 108 ret = sprintf(buf, "%d\n", vol->usable_leb_size); 109 else if (attr == &attr_vol_data_bytes) 110 ret = sprintf(buf, "%lld\n", vol->used_bytes); 111 else if (attr == &attr_vol_upd_marker) 112 ret = sprintf(buf, "%d\n", vol->upd_marker); 113 else 114 /* This must be a bug */ 115 ret = -EINVAL; 116 117 /* We've done the operation, drop volume and UBI device references */ 118 spin_lock(&ubi->volumes_lock); 119 vol->ref_count -= 1; 120 ubi_assert(vol->ref_count >= 0); 121 spin_unlock(&ubi->volumes_lock); 122 ubi_put_device(ubi); 123 return ret; 124 } 125 126 /* Release method for volume devices */ 127 static void vol_release(struct device *dev) 128 { 129 struct ubi_volume *vol = container_of(dev, struct ubi_volume, dev); 130 131 kfree(vol->eba_tbl); 132 kfree(vol); 133 } 134 135 /** 136 * volume_sysfs_init - initialize sysfs for new volume. 137 * @ubi: UBI device description object 138 * @vol: volume description object 139 * 140 * This function returns zero in case of success and a negative error code in 141 * case of failure. 142 * 143 * Note, this function does not free allocated resources in case of failure - 144 * the caller does it. This is because this would cause release() here and the 145 * caller would oops. 146 */ 147 static int volume_sysfs_init(struct ubi_device *ubi, struct ubi_volume *vol) 148 { 149 int err; 150 151 err = device_create_file(&vol->dev, &attr_vol_reserved_ebs); 152 if (err) 153 return err; 154 err = device_create_file(&vol->dev, &attr_vol_type); 155 if (err) 156 return err; 157 err = device_create_file(&vol->dev, &attr_vol_name); 158 if (err) 159 return err; 160 err = device_create_file(&vol->dev, &attr_vol_corrupted); 161 if (err) 162 return err; 163 err = device_create_file(&vol->dev, &attr_vol_alignment); 164 if (err) 165 return err; 166 err = device_create_file(&vol->dev, &attr_vol_usable_eb_size); 167 if (err) 168 return err; 169 err = device_create_file(&vol->dev, &attr_vol_data_bytes); 170 if (err) 171 return err; 172 err = device_create_file(&vol->dev, &attr_vol_upd_marker); 173 return err; 174 } 175 176 /** 177 * volume_sysfs_close - close sysfs for a volume. 178 * @vol: volume description object 179 */ 180 static void volume_sysfs_close(struct ubi_volume *vol) 181 { 182 device_remove_file(&vol->dev, &attr_vol_upd_marker); 183 device_remove_file(&vol->dev, &attr_vol_data_bytes); 184 device_remove_file(&vol->dev, &attr_vol_usable_eb_size); 185 device_remove_file(&vol->dev, &attr_vol_alignment); 186 device_remove_file(&vol->dev, &attr_vol_corrupted); 187 device_remove_file(&vol->dev, &attr_vol_name); 188 device_remove_file(&vol->dev, &attr_vol_type); 189 device_remove_file(&vol->dev, &attr_vol_reserved_ebs); 190 device_unregister(&vol->dev); 191 } 192 193 /** 194 * ubi_create_volume - create volume. 195 * @ubi: UBI device description object 196 * @req: volume creation request 197 * 198 * This function creates volume described by @req. If @req->vol_id id 199 * %UBI_VOL_NUM_AUTO, this function automatically assign ID to the new volume 200 * and saves it in @req->vol_id. Returns zero in case of success and a negative 201 * error code in case of failure. Note, the caller has to have the 202 * @ubi->device_mutex locked. 203 */ 204 int ubi_create_volume(struct ubi_device *ubi, struct ubi_mkvol_req *req) 205 { 206 int i, err, vol_id = req->vol_id, do_free = 1; 207 struct ubi_volume *vol; 208 struct ubi_vtbl_record vtbl_rec; 209 dev_t dev; 210 211 if (ubi->ro_mode) 212 return -EROFS; 213 214 vol = kzalloc(sizeof(struct ubi_volume), GFP_KERNEL); 215 if (!vol) 216 return -ENOMEM; 217 218 spin_lock(&ubi->volumes_lock); 219 if (vol_id == UBI_VOL_NUM_AUTO) { 220 /* Find unused volume ID */ 221 dbg_gen("search for vacant volume ID"); 222 for (i = 0; i < ubi->vtbl_slots; i++) 223 if (!ubi->volumes[i]) { 224 vol_id = i; 225 break; 226 } 227 228 if (vol_id == UBI_VOL_NUM_AUTO) { 229 dbg_err("out of volume IDs"); 230 err = -ENFILE; 231 goto out_unlock; 232 } 233 req->vol_id = vol_id; 234 } 235 236 dbg_gen("create device %d, volume %d, %llu bytes, type %d, name %s", 237 ubi->ubi_num, vol_id, (unsigned long long)req->bytes, 238 (int)req->vol_type, req->name); 239 240 /* Ensure that this volume does not exist */ 241 err = -EEXIST; 242 if (ubi->volumes[vol_id]) { 243 dbg_err("volume %d already exists", vol_id); 244 goto out_unlock; 245 } 246 247 /* Ensure that the name is unique */ 248 for (i = 0; i < ubi->vtbl_slots; i++) 249 if (ubi->volumes[i] && 250 ubi->volumes[i]->name_len == req->name_len && 251 !strcmp(ubi->volumes[i]->name, req->name)) { 252 dbg_err("volume \"%s\" exists (ID %d)", req->name, i); 253 goto out_unlock; 254 } 255 256 /* Calculate how many eraseblocks are requested */ 257 vol->usable_leb_size = ubi->leb_size - ubi->leb_size % req->alignment; 258 vol->reserved_pebs += div_u64(req->bytes + vol->usable_leb_size - 1, 259 vol->usable_leb_size); 260 261 /* Reserve physical eraseblocks */ 262 if (vol->reserved_pebs > ubi->avail_pebs) { 263 dbg_err("not enough PEBs, only %d available", ubi->avail_pebs); 264 if (ubi->corr_peb_count) 265 dbg_err("%d PEBs are corrupted and not used", 266 ubi->corr_peb_count); 267 err = -ENOSPC; 268 goto out_unlock; 269 } 270 ubi->avail_pebs -= vol->reserved_pebs; 271 ubi->rsvd_pebs += vol->reserved_pebs; 272 spin_unlock(&ubi->volumes_lock); 273 274 vol->vol_id = vol_id; 275 vol->alignment = req->alignment; 276 vol->data_pad = ubi->leb_size % vol->alignment; 277 vol->vol_type = req->vol_type; 278 vol->name_len = req->name_len; 279 memcpy(vol->name, req->name, vol->name_len); 280 vol->ubi = ubi; 281 282 /* 283 * Finish all pending erases because there may be some LEBs belonging 284 * to the same volume ID. 285 */ 286 err = ubi_wl_flush(ubi); 287 if (err) 288 goto out_acc; 289 290 vol->eba_tbl = kmalloc(vol->reserved_pebs * sizeof(int), GFP_KERNEL); 291 if (!vol->eba_tbl) { 292 err = -ENOMEM; 293 goto out_acc; 294 } 295 296 for (i = 0; i < vol->reserved_pebs; i++) 297 vol->eba_tbl[i] = UBI_LEB_UNMAPPED; 298 299 if (vol->vol_type == UBI_DYNAMIC_VOLUME) { 300 vol->used_ebs = vol->reserved_pebs; 301 vol->last_eb_bytes = vol->usable_leb_size; 302 vol->used_bytes = 303 (long long)vol->used_ebs * vol->usable_leb_size; 304 } else { 305 vol->used_ebs = div_u64_rem(vol->used_bytes, 306 vol->usable_leb_size, 307 &vol->last_eb_bytes); 308 if (vol->last_eb_bytes != 0) 309 vol->used_ebs += 1; 310 else 311 vol->last_eb_bytes = vol->usable_leb_size; 312 } 313 314 /* Register character device for the volume */ 315 cdev_init(&vol->cdev, &ubi_vol_cdev_operations); 316 vol->cdev.owner = THIS_MODULE; 317 dev = MKDEV(MAJOR(ubi->cdev.dev), vol_id + 1); 318 err = cdev_add(&vol->cdev, dev, 1); 319 if (err) { 320 ubi_err("cannot add character device"); 321 goto out_mapping; 322 } 323 324 vol->dev.release = vol_release; 325 vol->dev.parent = &ubi->dev; 326 vol->dev.devt = dev; 327 vol->dev.class = ubi_class; 328 329 dev_set_name(&vol->dev, "%s_%d", ubi->ubi_name, vol->vol_id); 330 err = device_register(&vol->dev); 331 if (err) { 332 ubi_err("cannot register device"); 333 goto out_cdev; 334 } 335 336 err = volume_sysfs_init(ubi, vol); 337 if (err) 338 goto out_sysfs; 339 340 /* Fill volume table record */ 341 memset(&vtbl_rec, 0, sizeof(struct ubi_vtbl_record)); 342 vtbl_rec.reserved_pebs = cpu_to_be32(vol->reserved_pebs); 343 vtbl_rec.alignment = cpu_to_be32(vol->alignment); 344 vtbl_rec.data_pad = cpu_to_be32(vol->data_pad); 345 vtbl_rec.name_len = cpu_to_be16(vol->name_len); 346 if (vol->vol_type == UBI_DYNAMIC_VOLUME) 347 vtbl_rec.vol_type = UBI_VID_DYNAMIC; 348 else 349 vtbl_rec.vol_type = UBI_VID_STATIC; 350 memcpy(vtbl_rec.name, vol->name, vol->name_len); 351 352 err = ubi_change_vtbl_record(ubi, vol_id, &vtbl_rec); 353 if (err) 354 goto out_sysfs; 355 356 spin_lock(&ubi->volumes_lock); 357 ubi->volumes[vol_id] = vol; 358 ubi->vol_count += 1; 359 spin_unlock(&ubi->volumes_lock); 360 361 ubi_volume_notify(ubi, vol, UBI_VOLUME_ADDED); 362 if (paranoid_check_volumes(ubi)) 363 dbg_err("check failed while creating volume %d", vol_id); 364 return err; 365 366 out_sysfs: 367 /* 368 * We have registered our device, we should not free the volume 369 * description object in this function in case of an error - it is 370 * freed by the release function. 371 * 372 * Get device reference to prevent the release function from being 373 * called just after sysfs has been closed. 374 */ 375 do_free = 0; 376 get_device(&vol->dev); 377 volume_sysfs_close(vol); 378 out_cdev: 379 cdev_del(&vol->cdev); 380 out_mapping: 381 if (do_free) 382 kfree(vol->eba_tbl); 383 out_acc: 384 spin_lock(&ubi->volumes_lock); 385 ubi->rsvd_pebs -= vol->reserved_pebs; 386 ubi->avail_pebs += vol->reserved_pebs; 387 out_unlock: 388 spin_unlock(&ubi->volumes_lock); 389 if (do_free) 390 kfree(vol); 391 else 392 put_device(&vol->dev); 393 ubi_err("cannot create volume %d, error %d", vol_id, err); 394 return err; 395 } 396 397 /** 398 * ubi_remove_volume - remove volume. 399 * @desc: volume descriptor 400 * @no_vtbl: do not change volume table if not zero 401 * 402 * This function removes volume described by @desc. The volume has to be opened 403 * in "exclusive" mode. Returns zero in case of success and a negative error 404 * code in case of failure. The caller has to have the @ubi->device_mutex 405 * locked. 406 */ 407 int ubi_remove_volume(struct ubi_volume_desc *desc, int no_vtbl) 408 { 409 struct ubi_volume *vol = desc->vol; 410 struct ubi_device *ubi = vol->ubi; 411 int i, err, vol_id = vol->vol_id, reserved_pebs = vol->reserved_pebs; 412 413 dbg_gen("remove device %d, volume %d", ubi->ubi_num, vol_id); 414 ubi_assert(desc->mode == UBI_EXCLUSIVE); 415 ubi_assert(vol == ubi->volumes[vol_id]); 416 417 if (ubi->ro_mode) 418 return -EROFS; 419 420 spin_lock(&ubi->volumes_lock); 421 if (vol->ref_count > 1) { 422 /* 423 * The volume is busy, probably someone is reading one of its 424 * sysfs files. 425 */ 426 err = -EBUSY; 427 goto out_unlock; 428 } 429 ubi->volumes[vol_id] = NULL; 430 spin_unlock(&ubi->volumes_lock); 431 432 if (!no_vtbl) { 433 err = ubi_change_vtbl_record(ubi, vol_id, NULL); 434 if (err) 435 goto out_err; 436 } 437 438 for (i = 0; i < vol->reserved_pebs; i++) { 439 err = ubi_eba_unmap_leb(ubi, vol, i); 440 if (err) 441 goto out_err; 442 } 443 444 cdev_del(&vol->cdev); 445 volume_sysfs_close(vol); 446 447 spin_lock(&ubi->volumes_lock); 448 ubi->rsvd_pebs -= reserved_pebs; 449 ubi->avail_pebs += reserved_pebs; 450 i = ubi->beb_rsvd_level - ubi->beb_rsvd_pebs; 451 if (i > 0) { 452 i = ubi->avail_pebs >= i ? i : ubi->avail_pebs; 453 ubi->avail_pebs -= i; 454 ubi->rsvd_pebs += i; 455 ubi->beb_rsvd_pebs += i; 456 if (i > 0) 457 ubi_msg("reserve more %d PEBs", i); 458 } 459 ubi->vol_count -= 1; 460 spin_unlock(&ubi->volumes_lock); 461 462 ubi_volume_notify(ubi, vol, UBI_VOLUME_REMOVED); 463 if (!no_vtbl && paranoid_check_volumes(ubi)) 464 dbg_err("check failed while removing volume %d", vol_id); 465 466 return err; 467 468 out_err: 469 ubi_err("cannot remove volume %d, error %d", vol_id, err); 470 spin_lock(&ubi->volumes_lock); 471 ubi->volumes[vol_id] = vol; 472 out_unlock: 473 spin_unlock(&ubi->volumes_lock); 474 return err; 475 } 476 477 /** 478 * ubi_resize_volume - re-size volume. 479 * @desc: volume descriptor 480 * @reserved_pebs: new size in physical eraseblocks 481 * 482 * This function re-sizes the volume and returns zero in case of success, and a 483 * negative error code in case of failure. The caller has to have the 484 * @ubi->device_mutex locked. 485 */ 486 int ubi_resize_volume(struct ubi_volume_desc *desc, int reserved_pebs) 487 { 488 int i, err, pebs, *new_mapping; 489 struct ubi_volume *vol = desc->vol; 490 struct ubi_device *ubi = vol->ubi; 491 struct ubi_vtbl_record vtbl_rec; 492 int vol_id = vol->vol_id; 493 494 if (ubi->ro_mode) 495 return -EROFS; 496 497 dbg_gen("re-size device %d, volume %d to from %d to %d PEBs", 498 ubi->ubi_num, vol_id, vol->reserved_pebs, reserved_pebs); 499 500 if (vol->vol_type == UBI_STATIC_VOLUME && 501 reserved_pebs < vol->used_ebs) { 502 dbg_err("too small size %d, %d LEBs contain data", 503 reserved_pebs, vol->used_ebs); 504 return -EINVAL; 505 } 506 507 /* If the size is the same, we have nothing to do */ 508 if (reserved_pebs == vol->reserved_pebs) 509 return 0; 510 511 new_mapping = kmalloc(reserved_pebs * sizeof(int), GFP_KERNEL); 512 if (!new_mapping) 513 return -ENOMEM; 514 515 for (i = 0; i < reserved_pebs; i++) 516 new_mapping[i] = UBI_LEB_UNMAPPED; 517 518 spin_lock(&ubi->volumes_lock); 519 if (vol->ref_count > 1) { 520 spin_unlock(&ubi->volumes_lock); 521 err = -EBUSY; 522 goto out_free; 523 } 524 spin_unlock(&ubi->volumes_lock); 525 526 /* Reserve physical eraseblocks */ 527 pebs = reserved_pebs - vol->reserved_pebs; 528 if (pebs > 0) { 529 spin_lock(&ubi->volumes_lock); 530 if (pebs > ubi->avail_pebs) { 531 dbg_err("not enough PEBs: requested %d, available %d", 532 pebs, ubi->avail_pebs); 533 if (ubi->corr_peb_count) 534 dbg_err("%d PEBs are corrupted and not used", 535 ubi->corr_peb_count); 536 spin_unlock(&ubi->volumes_lock); 537 err = -ENOSPC; 538 goto out_free; 539 } 540 ubi->avail_pebs -= pebs; 541 ubi->rsvd_pebs += pebs; 542 for (i = 0; i < vol->reserved_pebs; i++) 543 new_mapping[i] = vol->eba_tbl[i]; 544 kfree(vol->eba_tbl); 545 vol->eba_tbl = new_mapping; 546 spin_unlock(&ubi->volumes_lock); 547 } 548 549 /* Change volume table record */ 550 memcpy(&vtbl_rec, &ubi->vtbl[vol_id], sizeof(struct ubi_vtbl_record)); 551 vtbl_rec.reserved_pebs = cpu_to_be32(reserved_pebs); 552 err = ubi_change_vtbl_record(ubi, vol_id, &vtbl_rec); 553 if (err) 554 goto out_acc; 555 556 if (pebs < 0) { 557 for (i = 0; i < -pebs; i++) { 558 err = ubi_eba_unmap_leb(ubi, vol, reserved_pebs + i); 559 if (err) 560 goto out_acc; 561 } 562 spin_lock(&ubi->volumes_lock); 563 ubi->rsvd_pebs += pebs; 564 ubi->avail_pebs -= pebs; 565 pebs = ubi->beb_rsvd_level - ubi->beb_rsvd_pebs; 566 if (pebs > 0) { 567 pebs = ubi->avail_pebs >= pebs ? pebs : ubi->avail_pebs; 568 ubi->avail_pebs -= pebs; 569 ubi->rsvd_pebs += pebs; 570 ubi->beb_rsvd_pebs += pebs; 571 if (pebs > 0) 572 ubi_msg("reserve more %d PEBs", pebs); 573 } 574 for (i = 0; i < reserved_pebs; i++) 575 new_mapping[i] = vol->eba_tbl[i]; 576 kfree(vol->eba_tbl); 577 vol->eba_tbl = new_mapping; 578 spin_unlock(&ubi->volumes_lock); 579 } 580 581 vol->reserved_pebs = reserved_pebs; 582 if (vol->vol_type == UBI_DYNAMIC_VOLUME) { 583 vol->used_ebs = reserved_pebs; 584 vol->last_eb_bytes = vol->usable_leb_size; 585 vol->used_bytes = 586 (long long)vol->used_ebs * vol->usable_leb_size; 587 } 588 589 ubi_volume_notify(ubi, vol, UBI_VOLUME_RESIZED); 590 if (paranoid_check_volumes(ubi)) 591 dbg_err("check failed while re-sizing volume %d", vol_id); 592 return err; 593 594 out_acc: 595 if (pebs > 0) { 596 spin_lock(&ubi->volumes_lock); 597 ubi->rsvd_pebs -= pebs; 598 ubi->avail_pebs += pebs; 599 spin_unlock(&ubi->volumes_lock); 600 } 601 out_free: 602 kfree(new_mapping); 603 return err; 604 } 605 606 /** 607 * ubi_rename_volumes - re-name UBI volumes. 608 * @ubi: UBI device description object 609 * @rename_list: list of &struct ubi_rename_entry objects 610 * 611 * This function re-names or removes volumes specified in the re-name list. 612 * Returns zero in case of success and a negative error code in case of 613 * failure. 614 */ 615 int ubi_rename_volumes(struct ubi_device *ubi, struct list_head *rename_list) 616 { 617 int err; 618 struct ubi_rename_entry *re; 619 620 err = ubi_vtbl_rename_volumes(ubi, rename_list); 621 if (err) 622 return err; 623 624 list_for_each_entry(re, rename_list, list) { 625 if (re->remove) { 626 err = ubi_remove_volume(re->desc, 1); 627 if (err) 628 break; 629 } else { 630 struct ubi_volume *vol = re->desc->vol; 631 632 spin_lock(&ubi->volumes_lock); 633 vol->name_len = re->new_name_len; 634 memcpy(vol->name, re->new_name, re->new_name_len + 1); 635 spin_unlock(&ubi->volumes_lock); 636 ubi_volume_notify(ubi, vol, UBI_VOLUME_RENAMED); 637 } 638 } 639 640 if (!err && paranoid_check_volumes(ubi)) 641 ; 642 return err; 643 } 644 645 /** 646 * ubi_add_volume - add volume. 647 * @ubi: UBI device description object 648 * @vol: volume description object 649 * 650 * This function adds an existing volume and initializes all its data 651 * structures. Returns zero in case of success and a negative error code in 652 * case of failure. 653 */ 654 int ubi_add_volume(struct ubi_device *ubi, struct ubi_volume *vol) 655 { 656 int err, vol_id = vol->vol_id; 657 dev_t dev; 658 659 dbg_gen("add volume %d", vol_id); 660 661 /* Register character device for the volume */ 662 cdev_init(&vol->cdev, &ubi_vol_cdev_operations); 663 vol->cdev.owner = THIS_MODULE; 664 dev = MKDEV(MAJOR(ubi->cdev.dev), vol->vol_id + 1); 665 err = cdev_add(&vol->cdev, dev, 1); 666 if (err) { 667 ubi_err("cannot add character device for volume %d, error %d", 668 vol_id, err); 669 return err; 670 } 671 672 vol->dev.release = vol_release; 673 vol->dev.parent = &ubi->dev; 674 vol->dev.devt = dev; 675 vol->dev.class = ubi_class; 676 dev_set_name(&vol->dev, "%s_%d", ubi->ubi_name, vol->vol_id); 677 err = device_register(&vol->dev); 678 if (err) 679 goto out_cdev; 680 681 err = volume_sysfs_init(ubi, vol); 682 if (err) { 683 cdev_del(&vol->cdev); 684 volume_sysfs_close(vol); 685 return err; 686 } 687 688 if (paranoid_check_volumes(ubi)) 689 dbg_err("check failed while adding volume %d", vol_id); 690 return err; 691 692 out_cdev: 693 cdev_del(&vol->cdev); 694 return err; 695 } 696 697 /** 698 * ubi_free_volume - free volume. 699 * @ubi: UBI device description object 700 * @vol: volume description object 701 * 702 * This function frees all resources for volume @vol but does not remove it. 703 * Used only when the UBI device is detached. 704 */ 705 void ubi_free_volume(struct ubi_device *ubi, struct ubi_volume *vol) 706 { 707 dbg_gen("free volume %d", vol->vol_id); 708 709 ubi->volumes[vol->vol_id] = NULL; 710 cdev_del(&vol->cdev); 711 volume_sysfs_close(vol); 712 } 713 714 #ifdef CONFIG_MTD_UBI_DEBUG_PARANOID 715 716 /** 717 * paranoid_check_volume - check volume information. 718 * @ubi: UBI device description object 719 * @vol_id: volume ID 720 * 721 * Returns zero if volume is all right and a a negative error code if not. 722 */ 723 static int paranoid_check_volume(struct ubi_device *ubi, int vol_id) 724 { 725 int idx = vol_id2idx(ubi, vol_id); 726 int reserved_pebs, alignment, data_pad, vol_type, name_len, upd_marker; 727 const struct ubi_volume *vol; 728 long long n; 729 const char *name; 730 731 spin_lock(&ubi->volumes_lock); 732 reserved_pebs = be32_to_cpu(ubi->vtbl[vol_id].reserved_pebs); 733 vol = ubi->volumes[idx]; 734 735 if (!vol) { 736 if (reserved_pebs) { 737 ubi_err("no volume info, but volume exists"); 738 goto fail; 739 } 740 spin_unlock(&ubi->volumes_lock); 741 return 0; 742 } 743 744 if (vol->reserved_pebs < 0 || vol->alignment < 0 || vol->data_pad < 0 || 745 vol->name_len < 0) { 746 ubi_err("negative values"); 747 goto fail; 748 } 749 if (vol->alignment > ubi->leb_size || vol->alignment == 0) { 750 ubi_err("bad alignment"); 751 goto fail; 752 } 753 754 n = vol->alignment & (ubi->min_io_size - 1); 755 if (vol->alignment != 1 && n) { 756 ubi_err("alignment is not multiple of min I/O unit"); 757 goto fail; 758 } 759 760 n = ubi->leb_size % vol->alignment; 761 if (vol->data_pad != n) { 762 ubi_err("bad data_pad, has to be %lld", n); 763 goto fail; 764 } 765 766 if (vol->vol_type != UBI_DYNAMIC_VOLUME && 767 vol->vol_type != UBI_STATIC_VOLUME) { 768 ubi_err("bad vol_type"); 769 goto fail; 770 } 771 772 if (vol->upd_marker && vol->corrupted) { 773 dbg_err("update marker and corrupted simultaneously"); 774 goto fail; 775 } 776 777 if (vol->reserved_pebs > ubi->good_peb_count) { 778 ubi_err("too large reserved_pebs"); 779 goto fail; 780 } 781 782 n = ubi->leb_size - vol->data_pad; 783 if (vol->usable_leb_size != ubi->leb_size - vol->data_pad) { 784 ubi_err("bad usable_leb_size, has to be %lld", n); 785 goto fail; 786 } 787 788 if (vol->name_len > UBI_VOL_NAME_MAX) { 789 ubi_err("too long volume name, max is %d", UBI_VOL_NAME_MAX); 790 goto fail; 791 } 792 793 if (!vol->name) { 794 ubi_err("NULL volume name"); 795 goto fail; 796 } 797 798 n = strnlen(vol->name, vol->name_len + 1); 799 if (n != vol->name_len) { 800 ubi_err("bad name_len %lld", n); 801 goto fail; 802 } 803 804 n = (long long)vol->used_ebs * vol->usable_leb_size; 805 if (vol->vol_type == UBI_DYNAMIC_VOLUME) { 806 if (vol->corrupted) { 807 ubi_err("corrupted dynamic volume"); 808 goto fail; 809 } 810 if (vol->used_ebs != vol->reserved_pebs) { 811 ubi_err("bad used_ebs"); 812 goto fail; 813 } 814 if (vol->last_eb_bytes != vol->usable_leb_size) { 815 ubi_err("bad last_eb_bytes"); 816 goto fail; 817 } 818 if (vol->used_bytes != n) { 819 ubi_err("bad used_bytes"); 820 goto fail; 821 } 822 } else { 823 if (vol->used_ebs < 0 || vol->used_ebs > vol->reserved_pebs) { 824 ubi_err("bad used_ebs"); 825 goto fail; 826 } 827 if (vol->last_eb_bytes < 0 || 828 vol->last_eb_bytes > vol->usable_leb_size) { 829 ubi_err("bad last_eb_bytes"); 830 goto fail; 831 } 832 if (vol->used_bytes < 0 || vol->used_bytes > n || 833 vol->used_bytes < n - vol->usable_leb_size) { 834 ubi_err("bad used_bytes"); 835 goto fail; 836 } 837 } 838 839 alignment = be32_to_cpu(ubi->vtbl[vol_id].alignment); 840 data_pad = be32_to_cpu(ubi->vtbl[vol_id].data_pad); 841 name_len = be16_to_cpu(ubi->vtbl[vol_id].name_len); 842 upd_marker = ubi->vtbl[vol_id].upd_marker; 843 name = &ubi->vtbl[vol_id].name[0]; 844 if (ubi->vtbl[vol_id].vol_type == UBI_VID_DYNAMIC) 845 vol_type = UBI_DYNAMIC_VOLUME; 846 else 847 vol_type = UBI_STATIC_VOLUME; 848 849 if (alignment != vol->alignment || data_pad != vol->data_pad || 850 upd_marker != vol->upd_marker || vol_type != vol->vol_type || 851 name_len != vol->name_len || strncmp(name, vol->name, name_len)) { 852 ubi_err("volume info is different"); 853 goto fail; 854 } 855 856 spin_unlock(&ubi->volumes_lock); 857 return 0; 858 859 fail: 860 ubi_err("paranoid check failed for volume %d", vol_id); 861 if (vol) 862 ubi_dbg_dump_vol_info(vol); 863 ubi_dbg_dump_vtbl_record(&ubi->vtbl[vol_id], vol_id); 864 dump_stack(); 865 spin_unlock(&ubi->volumes_lock); 866 return -EINVAL; 867 } 868 869 /** 870 * paranoid_check_volumes - check information about all volumes. 871 * @ubi: UBI device description object 872 * 873 * Returns zero if volumes are all right and a a negative error code if not. 874 */ 875 static int paranoid_check_volumes(struct ubi_device *ubi) 876 { 877 int i, err = 0; 878 879 for (i = 0; i < ubi->vtbl_slots; i++) { 880 err = paranoid_check_volume(ubi, i); 881 if (err) 882 break; 883 } 884 885 return err; 886 } 887 #endif 888