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