diff options
Diffstat (limited to 'drivers/mtd/ubi/build.c')
| -rw-r--r-- | drivers/mtd/ubi/build.c | 21 |
1 files changed, 14 insertions, 7 deletions
diff --git a/drivers/mtd/ubi/build.c b/drivers/mtd/ubi/build.c index 9082768cc6c3..4048db83aef6 100644 --- a/drivers/mtd/ubi/build.c +++ b/drivers/mtd/ubi/build.c | |||
| @@ -263,8 +263,12 @@ static ssize_t dev_attribute_show(struct device *dev, | |||
| 263 | return ret; | 263 | return ret; |
| 264 | } | 264 | } |
| 265 | 265 | ||
| 266 | /* Fake "release" method for UBI devices */ | 266 | static void dev_release(struct device *dev) |
| 267 | static void dev_release(struct device *dev) { } | 267 | { |
| 268 | struct ubi_device *ubi = container_of(dev, struct ubi_device, dev); | ||
| 269 | |||
| 270 | kfree(ubi); | ||
| 271 | } | ||
| 268 | 272 | ||
| 269 | /** | 273 | /** |
| 270 | * ubi_sysfs_init - initialize sysfs for an UBI device. | 274 | * ubi_sysfs_init - initialize sysfs for an UBI device. |
| @@ -380,7 +384,7 @@ static void free_user_volumes(struct ubi_device *ubi) | |||
| 380 | */ | 384 | */ |
| 381 | static int uif_init(struct ubi_device *ubi) | 385 | static int uif_init(struct ubi_device *ubi) |
| 382 | { | 386 | { |
| 383 | int i, err, do_free = 0; | 387 | int i, err; |
| 384 | dev_t dev; | 388 | dev_t dev; |
| 385 | 389 | ||
| 386 | sprintf(ubi->ubi_name, UBI_NAME_STR "%d", ubi->ubi_num); | 390 | sprintf(ubi->ubi_name, UBI_NAME_STR "%d", ubi->ubi_num); |
| @@ -427,13 +431,10 @@ static int uif_init(struct ubi_device *ubi) | |||
| 427 | 431 | ||
| 428 | out_volumes: | 432 | out_volumes: |
| 429 | kill_volumes(ubi); | 433 | kill_volumes(ubi); |
| 430 | do_free = 0; | ||
| 431 | out_sysfs: | 434 | out_sysfs: |
| 432 | ubi_sysfs_close(ubi); | 435 | ubi_sysfs_close(ubi); |
| 433 | cdev_del(&ubi->cdev); | 436 | cdev_del(&ubi->cdev); |
| 434 | out_unreg: | 437 | out_unreg: |
| 435 | if (do_free) | ||
| 436 | free_user_volumes(ubi); | ||
| 437 | unregister_chrdev_region(ubi->cdev.dev, ubi->vtbl_slots + 1); | 438 | unregister_chrdev_region(ubi->cdev.dev, ubi->vtbl_slots + 1); |
| 438 | ubi_err("cannot initialize UBI %s, error %d", ubi->ubi_name, err); | 439 | ubi_err("cannot initialize UBI %s, error %d", ubi->ubi_name, err); |
| 439 | return err; | 440 | return err; |
| @@ -947,6 +948,12 @@ int ubi_detach_mtd_dev(int ubi_num, int anyway) | |||
| 947 | if (ubi->bgt_thread) | 948 | if (ubi->bgt_thread) |
| 948 | kthread_stop(ubi->bgt_thread); | 949 | kthread_stop(ubi->bgt_thread); |
| 949 | 950 | ||
| 951 | /* | ||
| 952 | * Get a reference to the device in order to prevent 'dev_release()' | ||
| 953 | * from freeing @ubi object. | ||
| 954 | */ | ||
| 955 | get_device(&ubi->dev); | ||
| 956 | |||
| 950 | uif_close(ubi); | 957 | uif_close(ubi); |
| 951 | ubi_wl_close(ubi); | 958 | ubi_wl_close(ubi); |
| 952 | free_internal_volumes(ubi); | 959 | free_internal_volumes(ubi); |
| @@ -958,7 +965,7 @@ int ubi_detach_mtd_dev(int ubi_num, int anyway) | |||
| 958 | vfree(ubi->dbg_peb_buf); | 965 | vfree(ubi->dbg_peb_buf); |
| 959 | #endif | 966 | #endif |
| 960 | ubi_msg("mtd%d is detached from ubi%d", ubi->mtd->index, ubi->ubi_num); | 967 | ubi_msg("mtd%d is detached from ubi%d", ubi->mtd->index, ubi->ubi_num); |
| 961 | kfree(ubi); | 968 | put_device(&ubi->dev); |
| 962 | return 0; | 969 | return 0; |
| 963 | } | 970 | } |
| 964 | 971 | ||
