diff options
Diffstat (limited to 'drivers/mtd/mtdcore.c')
-rw-r--r-- | drivers/mtd/mtdcore.c | 37 |
1 files changed, 30 insertions, 7 deletions
diff --git a/drivers/mtd/mtdcore.c b/drivers/mtd/mtdcore.c index 06ec9f836ae5..f11f55f02413 100644 --- a/drivers/mtd/mtdcore.c +++ b/drivers/mtd/mtdcore.c | |||
@@ -214,12 +214,23 @@ struct mtd_info *get_mtd_device(struct mtd_info *mtd, int num) | |||
214 | ret = NULL; | 214 | ret = NULL; |
215 | } | 215 | } |
216 | 216 | ||
217 | if (ret && !try_module_get(ret->owner)) | 217 | if (!ret) |
218 | goto out_unlock; | ||
219 | |||
220 | if (!try_module_get(ret->owner)) { | ||
221 | ret = NULL; | ||
222 | goto out_unlock; | ||
223 | } | ||
224 | |||
225 | if (ret->get_device && ret->get_device(ret)) { | ||
226 | module_put(ret->owner); | ||
218 | ret = NULL; | 227 | ret = NULL; |
228 | goto out_unlock; | ||
229 | } | ||
219 | 230 | ||
220 | if (ret) | 231 | ret->usecount++; |
221 | ret->usecount++; | ||
222 | 232 | ||
233 | out_unlock: | ||
223 | mutex_unlock(&mtd_table_mutex); | 234 | mutex_unlock(&mtd_table_mutex); |
224 | return ret; | 235 | return ret; |
225 | } | 236 | } |
@@ -235,8 +246,8 @@ struct mtd_info *get_mtd_device(struct mtd_info *mtd, int num) | |||
235 | 246 | ||
236 | struct mtd_info *get_mtd_device_nm(const char *name) | 247 | struct mtd_info *get_mtd_device_nm(const char *name) |
237 | { | 248 | { |
238 | int i; | 249 | int i, err = -ENODEV; |
239 | struct mtd_info *mtd = ERR_PTR(-ENODEV); | 250 | struct mtd_info *mtd = NULL; |
240 | 251 | ||
241 | mutex_lock(&mtd_table_mutex); | 252 | mutex_lock(&mtd_table_mutex); |
242 | 253 | ||
@@ -247,17 +258,27 @@ struct mtd_info *get_mtd_device_nm(const char *name) | |||
247 | } | 258 | } |
248 | } | 259 | } |
249 | 260 | ||
250 | if (i == MAX_MTD_DEVICES) | 261 | if (!mtd) |
251 | goto out_unlock; | 262 | goto out_unlock; |
252 | 263 | ||
253 | if (!try_module_get(mtd->owner)) | 264 | if (!try_module_get(mtd->owner)) |
254 | goto out_unlock; | 265 | goto out_unlock; |
255 | 266 | ||
267 | if (mtd->get_device) { | ||
268 | err = mtd->get_device(mtd); | ||
269 | if (err) | ||
270 | goto out_put; | ||
271 | } | ||
272 | |||
256 | mtd->usecount++; | 273 | mtd->usecount++; |
274 | mutex_unlock(&mtd_table_mutex); | ||
275 | return mtd; | ||
257 | 276 | ||
277 | out_put: | ||
278 | module_put(mtd->owner); | ||
258 | out_unlock: | 279 | out_unlock: |
259 | mutex_unlock(&mtd_table_mutex); | 280 | mutex_unlock(&mtd_table_mutex); |
260 | return mtd; | 281 | return ERR_PTR(err); |
261 | } | 282 | } |
262 | 283 | ||
263 | void put_mtd_device(struct mtd_info *mtd) | 284 | void put_mtd_device(struct mtd_info *mtd) |
@@ -266,6 +287,8 @@ void put_mtd_device(struct mtd_info *mtd) | |||
266 | 287 | ||
267 | mutex_lock(&mtd_table_mutex); | 288 | mutex_lock(&mtd_table_mutex); |
268 | c = --mtd->usecount; | 289 | c = --mtd->usecount; |
290 | if (mtd->put_device) | ||
291 | mtd->put_device(mtd); | ||
269 | mutex_unlock(&mtd_table_mutex); | 292 | mutex_unlock(&mtd_table_mutex); |
270 | BUG_ON(c < 0); | 293 | BUG_ON(c < 0); |
271 | 294 | ||