mtd: blkdevs: fix potential deadlock + lockdep warnings
[cascardo/linux.git] / drivers / mtd / mtd_blkdevs.c
index cb47d79..f470118 100644 (file)
@@ -192,8 +192,8 @@ static int blktrans_open(struct block_device *bdev, fmode_t mode)
        if (!dev)
                return -ERESTARTSYS; /* FIXME: busy loop! -arnd*/
 
-       mutex_lock(&dev->lock);
        mutex_lock(&mtd_table_mutex);
+       mutex_lock(&dev->lock);
 
        if (dev->open)
                goto unlock;
@@ -217,8 +217,8 @@ static int blktrans_open(struct block_device *bdev, fmode_t mode)
 
 unlock:
        dev->open++;
-       mutex_unlock(&mtd_table_mutex);
        mutex_unlock(&dev->lock);
+       mutex_unlock(&mtd_table_mutex);
        blktrans_dev_put(dev);
        return ret;
 
@@ -228,8 +228,8 @@ error_release:
 error_put:
        module_put(dev->tr->owner);
        kref_put(&dev->ref, blktrans_dev_release);
-       mutex_unlock(&mtd_table_mutex);
        mutex_unlock(&dev->lock);
+       mutex_unlock(&mtd_table_mutex);
        blktrans_dev_put(dev);
        return ret;
 }
@@ -241,8 +241,8 @@ static void blktrans_release(struct gendisk *disk, fmode_t mode)
        if (!dev)
                return;
 
-       mutex_lock(&dev->lock);
        mutex_lock(&mtd_table_mutex);
+       mutex_lock(&dev->lock);
 
        if (--dev->open)
                goto unlock;
@@ -256,8 +256,8 @@ static void blktrans_release(struct gendisk *disk, fmode_t mode)
                __put_mtd_device(dev->mtd);
        }
 unlock:
-       mutex_unlock(&mtd_table_mutex);
        mutex_unlock(&dev->lock);
+       mutex_unlock(&mtd_table_mutex);
        blktrans_dev_put(dev);
 }