Loading drivers/mtd/mtdcore.c +39 −21 Original line number Diff line number Diff line Loading @@ -463,27 +463,38 @@ struct mtd_info *get_mtd_device(struct mtd_info *mtd, int num) ret = NULL; } if (!ret) goto out_unlock; if (!try_module_get(ret->owner)) goto out_unlock; if (ret->get_device) { err = ret->get_device(ret); if (err) goto out_put; if (!ret) { ret = ERR_PTR(err); goto out; } ret->usecount++; err = __get_mtd_device(ret); if (err) ret = ERR_PTR(err); out: mutex_unlock(&mtd_table_mutex); return ret; } out_put: module_put(ret->owner); out_unlock: mutex_unlock(&mtd_table_mutex); return ERR_PTR(err); int __get_mtd_device(struct mtd_info *mtd) { int err; if (!try_module_get(mtd->owner)) return -ENODEV; if (mtd->get_device) { err = mtd->get_device(mtd); if (err) { module_put(mtd->owner); return err; } } mtd->usecount++; return 0; } /** Loading Loading @@ -534,14 +545,19 @@ struct mtd_info *get_mtd_device_nm(const char *name) void put_mtd_device(struct mtd_info *mtd) { int c; mutex_lock(&mtd_table_mutex); c = --mtd->usecount; __put_mtd_device(mtd); mutex_unlock(&mtd_table_mutex); } void __put_mtd_device(struct mtd_info *mtd) { --mtd->usecount; BUG_ON(mtd->usecount < 0); if (mtd->put_device) mtd->put_device(mtd); mutex_unlock(&mtd_table_mutex); BUG_ON(c < 0); module_put(mtd->owner); } Loading Loading @@ -579,7 +595,9 @@ EXPORT_SYMBOL_GPL(add_mtd_device); EXPORT_SYMBOL_GPL(del_mtd_device); EXPORT_SYMBOL_GPL(get_mtd_device); EXPORT_SYMBOL_GPL(get_mtd_device_nm); EXPORT_SYMBOL_GPL(__get_mtd_device); EXPORT_SYMBOL_GPL(put_mtd_device); EXPORT_SYMBOL_GPL(__put_mtd_device); EXPORT_SYMBOL_GPL(register_mtd_user); EXPORT_SYMBOL_GPL(unregister_mtd_user); EXPORT_SYMBOL_GPL(default_mtd_writev); Loading include/linux/mtd/mtd.h +2 −1 Original line number Diff line number Diff line Loading @@ -289,8 +289,9 @@ extern int add_mtd_device(struct mtd_info *mtd); extern int del_mtd_device (struct mtd_info *mtd); extern struct mtd_info *get_mtd_device(struct mtd_info *mtd, int num); extern int __get_mtd_device(struct mtd_info *mtd); extern void __put_mtd_device(struct mtd_info *mtd); extern struct mtd_info *get_mtd_device_nm(const char *name); extern void put_mtd_device(struct mtd_info *mtd); Loading Loading
drivers/mtd/mtdcore.c +39 −21 Original line number Diff line number Diff line Loading @@ -463,27 +463,38 @@ struct mtd_info *get_mtd_device(struct mtd_info *mtd, int num) ret = NULL; } if (!ret) goto out_unlock; if (!try_module_get(ret->owner)) goto out_unlock; if (ret->get_device) { err = ret->get_device(ret); if (err) goto out_put; if (!ret) { ret = ERR_PTR(err); goto out; } ret->usecount++; err = __get_mtd_device(ret); if (err) ret = ERR_PTR(err); out: mutex_unlock(&mtd_table_mutex); return ret; } out_put: module_put(ret->owner); out_unlock: mutex_unlock(&mtd_table_mutex); return ERR_PTR(err); int __get_mtd_device(struct mtd_info *mtd) { int err; if (!try_module_get(mtd->owner)) return -ENODEV; if (mtd->get_device) { err = mtd->get_device(mtd); if (err) { module_put(mtd->owner); return err; } } mtd->usecount++; return 0; } /** Loading Loading @@ -534,14 +545,19 @@ struct mtd_info *get_mtd_device_nm(const char *name) void put_mtd_device(struct mtd_info *mtd) { int c; mutex_lock(&mtd_table_mutex); c = --mtd->usecount; __put_mtd_device(mtd); mutex_unlock(&mtd_table_mutex); } void __put_mtd_device(struct mtd_info *mtd) { --mtd->usecount; BUG_ON(mtd->usecount < 0); if (mtd->put_device) mtd->put_device(mtd); mutex_unlock(&mtd_table_mutex); BUG_ON(c < 0); module_put(mtd->owner); } Loading Loading @@ -579,7 +595,9 @@ EXPORT_SYMBOL_GPL(add_mtd_device); EXPORT_SYMBOL_GPL(del_mtd_device); EXPORT_SYMBOL_GPL(get_mtd_device); EXPORT_SYMBOL_GPL(get_mtd_device_nm); EXPORT_SYMBOL_GPL(__get_mtd_device); EXPORT_SYMBOL_GPL(put_mtd_device); EXPORT_SYMBOL_GPL(__put_mtd_device); EXPORT_SYMBOL_GPL(register_mtd_user); EXPORT_SYMBOL_GPL(unregister_mtd_user); EXPORT_SYMBOL_GPL(default_mtd_writev); Loading
include/linux/mtd/mtd.h +2 −1 Original line number Diff line number Diff line Loading @@ -289,8 +289,9 @@ extern int add_mtd_device(struct mtd_info *mtd); extern int del_mtd_device (struct mtd_info *mtd); extern struct mtd_info *get_mtd_device(struct mtd_info *mtd, int num); extern int __get_mtd_device(struct mtd_info *mtd); extern void __put_mtd_device(struct mtd_info *mtd); extern struct mtd_info *get_mtd_device_nm(const char *name); extern void put_mtd_device(struct mtd_info *mtd); Loading