diff options
| -rw-r--r-- | drivers/mtd/mtdblock.c | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/drivers/mtd/mtdblock.c b/drivers/mtd/mtdblock.c index 208c6faa0358..77db5ce24d92 100644 --- a/drivers/mtd/mtdblock.c +++ b/drivers/mtd/mtdblock.c | |||
| @@ -29,6 +29,8 @@ static struct mtdblk_dev { | |||
| 29 | enum { STATE_EMPTY, STATE_CLEAN, STATE_DIRTY } cache_state; | 29 | enum { STATE_EMPTY, STATE_CLEAN, STATE_DIRTY } cache_state; |
| 30 | } *mtdblks[MAX_MTD_DEVICES]; | 30 | } *mtdblks[MAX_MTD_DEVICES]; |
| 31 | 31 | ||
| 32 | static struct mutex mtdblks_lock; | ||
| 33 | |||
| 32 | /* | 34 | /* |
| 33 | * Cache stuff... | 35 | * Cache stuff... |
| 34 | * | 36 | * |
| @@ -270,15 +272,19 @@ static int mtdblock_open(struct mtd_blktrans_dev *mbd) | |||
| 270 | 272 | ||
| 271 | DEBUG(MTD_DEBUG_LEVEL1,"mtdblock_open\n"); | 273 | DEBUG(MTD_DEBUG_LEVEL1,"mtdblock_open\n"); |
| 272 | 274 | ||
| 275 | mutex_lock(&mtdblks_lock); | ||
| 273 | if (mtdblks[dev]) { | 276 | if (mtdblks[dev]) { |
| 274 | mtdblks[dev]->count++; | 277 | mtdblks[dev]->count++; |
| 278 | mutex_unlock(&mtdblks_lock); | ||
| 275 | return 0; | 279 | return 0; |
| 276 | } | 280 | } |
| 277 | 281 | ||
| 278 | /* OK, it's not open. Create cache info for it */ | 282 | /* OK, it's not open. Create cache info for it */ |
| 279 | mtdblk = kzalloc(sizeof(struct mtdblk_dev), GFP_KERNEL); | 283 | mtdblk = kzalloc(sizeof(struct mtdblk_dev), GFP_KERNEL); |
| 280 | if (!mtdblk) | 284 | if (!mtdblk) { |
| 285 | mutex_unlock(&mtdblks_lock); | ||
| 281 | return -ENOMEM; | 286 | return -ENOMEM; |
| 287 | } | ||
| 282 | 288 | ||
| 283 | mtdblk->count = 1; | 289 | mtdblk->count = 1; |
| 284 | mtdblk->mtd = mtd; | 290 | mtdblk->mtd = mtd; |
| @@ -291,6 +297,7 @@ static int mtdblock_open(struct mtd_blktrans_dev *mbd) | |||
| 291 | } | 297 | } |
| 292 | 298 | ||
| 293 | mtdblks[dev] = mtdblk; | 299 | mtdblks[dev] = mtdblk; |
| 300 | mutex_unlock(&mtdblks_lock); | ||
| 294 | 301 | ||
| 295 | DEBUG(MTD_DEBUG_LEVEL1, "ok\n"); | 302 | DEBUG(MTD_DEBUG_LEVEL1, "ok\n"); |
| 296 | 303 | ||
| @@ -304,6 +311,8 @@ static int mtdblock_release(struct mtd_blktrans_dev *mbd) | |||
| 304 | 311 | ||
| 305 | DEBUG(MTD_DEBUG_LEVEL1, "mtdblock_release\n"); | 312 | DEBUG(MTD_DEBUG_LEVEL1, "mtdblock_release\n"); |
| 306 | 313 | ||
| 314 | mutex_lock(&mtdblks_lock); | ||
| 315 | |||
| 307 | mutex_lock(&mtdblk->cache_mutex); | 316 | mutex_lock(&mtdblk->cache_mutex); |
| 308 | write_cached_data(mtdblk); | 317 | write_cached_data(mtdblk); |
| 309 | mutex_unlock(&mtdblk->cache_mutex); | 318 | mutex_unlock(&mtdblk->cache_mutex); |
| @@ -316,6 +325,9 @@ static int mtdblock_release(struct mtd_blktrans_dev *mbd) | |||
| 316 | vfree(mtdblk->cache_data); | 325 | vfree(mtdblk->cache_data); |
| 317 | kfree(mtdblk); | 326 | kfree(mtdblk); |
| 318 | } | 327 | } |
| 328 | |||
| 329 | mutex_unlock(&mtdblks_lock); | ||
| 330 | |||
| 319 | DEBUG(MTD_DEBUG_LEVEL1, "ok\n"); | 331 | DEBUG(MTD_DEBUG_LEVEL1, "ok\n"); |
| 320 | 332 | ||
| 321 | return 0; | 333 | return 0; |
| @@ -376,6 +388,8 @@ static struct mtd_blktrans_ops mtdblock_tr = { | |||
| 376 | 388 | ||
| 377 | static int __init init_mtdblock(void) | 389 | static int __init init_mtdblock(void) |
| 378 | { | 390 | { |
| 391 | mutex_init(&mtdblks_lock); | ||
| 392 | |||
| 379 | return register_mtd_blktrans(&mtdblock_tr); | 393 | return register_mtd_blktrans(&mtdblock_tr); |
| 380 | } | 394 | } |
| 381 | 395 | ||
