diff options
Diffstat (limited to 'drivers/mtd/ubi/vmt.c')
| -rw-r--r-- | drivers/mtd/ubi/vmt.c | 18 |
1 files changed, 9 insertions, 9 deletions
diff --git a/drivers/mtd/ubi/vmt.c b/drivers/mtd/ubi/vmt.c index 7402025ded94..367b04176e0a 100644 --- a/drivers/mtd/ubi/vmt.c +++ b/drivers/mtd/ubi/vmt.c | |||
| @@ -127,6 +127,7 @@ static void vol_release(struct device *dev) | |||
| 127 | { | 127 | { |
| 128 | struct ubi_volume *vol = container_of(dev, struct ubi_volume, dev); | 128 | struct ubi_volume *vol = container_of(dev, struct ubi_volume, dev); |
| 129 | 129 | ||
| 130 | kfree(vol->eba_tbl); | ||
| 130 | kfree(vol); | 131 | kfree(vol); |
| 131 | } | 132 | } |
| 132 | 133 | ||
| @@ -201,7 +202,7 @@ static void volume_sysfs_close(struct ubi_volume *vol) | |||
| 201 | */ | 202 | */ |
| 202 | int ubi_create_volume(struct ubi_device *ubi, struct ubi_mkvol_req *req) | 203 | int ubi_create_volume(struct ubi_device *ubi, struct ubi_mkvol_req *req) |
| 203 | { | 204 | { |
| 204 | int i, err, vol_id = req->vol_id, dont_free = 0; | 205 | int i, err, vol_id = req->vol_id, do_free = 1; |
| 205 | struct ubi_volume *vol; | 206 | struct ubi_volume *vol; |
| 206 | struct ubi_vtbl_record vtbl_rec; | 207 | struct ubi_vtbl_record vtbl_rec; |
| 207 | uint64_t bytes; | 208 | uint64_t bytes; |
| @@ -365,14 +366,14 @@ int ubi_create_volume(struct ubi_device *ubi, struct ubi_mkvol_req *req) | |||
| 365 | 366 | ||
| 366 | out_sysfs: | 367 | out_sysfs: |
| 367 | /* | 368 | /* |
| 368 | * We have registered our device, we should not free the volume* | 369 | * 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 | * description object in this function in case of an error - it is |
| 370 | * freed by the release function. | 371 | * freed by the release function. |
| 371 | * | 372 | * |
| 372 | * Get device reference to prevent the release function from being | 373 | * Get device reference to prevent the release function from being |
| 373 | * called just after sysfs has been closed. | 374 | * called just after sysfs has been closed. |
| 374 | */ | 375 | */ |
| 375 | dont_free = 1; | 376 | do_free = 0; |
| 376 | get_device(&vol->dev); | 377 | get_device(&vol->dev); |
| 377 | volume_sysfs_close(vol); | 378 | volume_sysfs_close(vol); |
| 378 | out_gluebi: | 379 | out_gluebi: |
| @@ -382,17 +383,18 @@ out_gluebi: | |||
| 382 | out_cdev: | 383 | out_cdev: |
| 383 | cdev_del(&vol->cdev); | 384 | cdev_del(&vol->cdev); |
| 384 | out_mapping: | 385 | out_mapping: |
| 385 | kfree(vol->eba_tbl); | 386 | if (do_free) |
| 387 | kfree(vol->eba_tbl); | ||
| 386 | out_acc: | 388 | out_acc: |
| 387 | spin_lock(&ubi->volumes_lock); | 389 | spin_lock(&ubi->volumes_lock); |
| 388 | ubi->rsvd_pebs -= vol->reserved_pebs; | 390 | ubi->rsvd_pebs -= vol->reserved_pebs; |
| 389 | ubi->avail_pebs += vol->reserved_pebs; | 391 | ubi->avail_pebs += vol->reserved_pebs; |
| 390 | out_unlock: | 392 | out_unlock: |
| 391 | spin_unlock(&ubi->volumes_lock); | 393 | spin_unlock(&ubi->volumes_lock); |
| 392 | if (dont_free) | 394 | if (do_free) |
| 393 | put_device(&vol->dev); | ||
| 394 | else | ||
| 395 | kfree(vol); | 395 | kfree(vol); |
| 396 | else | ||
| 397 | put_device(&vol->dev); | ||
| 396 | ubi_err("cannot create volume %d, error %d", vol_id, err); | 398 | ubi_err("cannot create volume %d, error %d", vol_id, err); |
| 397 | return err; | 399 | return err; |
| 398 | } | 400 | } |
| @@ -445,8 +447,6 @@ int ubi_remove_volume(struct ubi_volume_desc *desc) | |||
| 445 | goto out_err; | 447 | goto out_err; |
| 446 | } | 448 | } |
| 447 | 449 | ||
| 448 | kfree(vol->eba_tbl); | ||
| 449 | vol->eba_tbl = NULL; | ||
| 450 | cdev_del(&vol->cdev); | 450 | cdev_del(&vol->cdev); |
| 451 | volume_sysfs_close(vol); | 451 | volume_sysfs_close(vol); |
| 452 | 452 | ||
