|
@@ -197,6 +197,7 @@ static int blktrans_open(struct block_device *bdev, fmode_t mode)
|
|
return -ERESTARTSYS; /* FIXME: busy loop! -arnd*/
|
|
return -ERESTARTSYS; /* FIXME: busy loop! -arnd*/
|
|
|
|
|
|
mutex_lock(&dev->lock);
|
|
mutex_lock(&dev->lock);
|
|
|
|
+ mutex_lock(&mtd_table_mutex);
|
|
|
|
|
|
if (dev->open)
|
|
if (dev->open)
|
|
goto unlock;
|
|
goto unlock;
|
|
@@ -220,6 +221,7 @@ static int blktrans_open(struct block_device *bdev, fmode_t mode)
|
|
|
|
|
|
unlock:
|
|
unlock:
|
|
dev->open++;
|
|
dev->open++;
|
|
|
|
+ mutex_unlock(&mtd_table_mutex);
|
|
mutex_unlock(&dev->lock);
|
|
mutex_unlock(&dev->lock);
|
|
blktrans_dev_put(dev);
|
|
blktrans_dev_put(dev);
|
|
return ret;
|
|
return ret;
|
|
@@ -230,6 +232,7 @@ error_release:
|
|
error_put:
|
|
error_put:
|
|
module_put(dev->tr->owner);
|
|
module_put(dev->tr->owner);
|
|
kref_put(&dev->ref, blktrans_dev_release);
|
|
kref_put(&dev->ref, blktrans_dev_release);
|
|
|
|
+ mutex_unlock(&mtd_table_mutex);
|
|
mutex_unlock(&dev->lock);
|
|
mutex_unlock(&dev->lock);
|
|
blktrans_dev_put(dev);
|
|
blktrans_dev_put(dev);
|
|
return ret;
|
|
return ret;
|
|
@@ -243,6 +246,7 @@ static void blktrans_release(struct gendisk *disk, fmode_t mode)
|
|
return;
|
|
return;
|
|
|
|
|
|
mutex_lock(&dev->lock);
|
|
mutex_lock(&dev->lock);
|
|
|
|
+ mutex_lock(&mtd_table_mutex);
|
|
|
|
|
|
if (--dev->open)
|
|
if (--dev->open)
|
|
goto unlock;
|
|
goto unlock;
|
|
@@ -256,6 +260,7 @@ static void blktrans_release(struct gendisk *disk, fmode_t mode)
|
|
__put_mtd_device(dev->mtd);
|
|
__put_mtd_device(dev->mtd);
|
|
}
|
|
}
|
|
unlock:
|
|
unlock:
|
|
|
|
+ mutex_unlock(&mtd_table_mutex);
|
|
mutex_unlock(&dev->lock);
|
|
mutex_unlock(&dev->lock);
|
|
blktrans_dev_put(dev);
|
|
blktrans_dev_put(dev);
|
|
}
|
|
}
|