aboutsummaryrefslogtreecommitdiffstats
path: root/fs/block_dev.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/block_dev.c')
-rw-r--r--fs/block_dev.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/fs/block_dev.c b/fs/block_dev.c
index 1dbbf847911a..fe41a76769fa 100644
--- a/fs/block_dev.c
+++ b/fs/block_dev.c
@@ -1409,6 +1409,7 @@ static int __blkdev_get(struct block_device *bdev, fmode_t mode, int for_part)
1409 int ret; 1409 int ret;
1410 int partno; 1410 int partno;
1411 int perm = 0; 1411 int perm = 0;
1412 bool first_open = false;
1412 1413
1413 if (mode & FMODE_READ) 1414 if (mode & FMODE_READ)
1414 perm |= MAY_READ; 1415 perm |= MAY_READ;
@@ -1435,6 +1436,7 @@ static int __blkdev_get(struct block_device *bdev, fmode_t mode, int for_part)
1435 disk_block_events(disk); 1436 disk_block_events(disk);
1436 mutex_lock_nested(&bdev->bd_mutex, for_part); 1437 mutex_lock_nested(&bdev->bd_mutex, for_part);
1437 if (!bdev->bd_openers) { 1438 if (!bdev->bd_openers) {
1439 first_open = true;
1438 bdev->bd_disk = disk; 1440 bdev->bd_disk = disk;
1439 bdev->bd_queue = disk->queue; 1441 bdev->bd_queue = disk->queue;
1440 bdev->bd_contains = bdev; 1442 bdev->bd_contains = bdev;
@@ -1520,14 +1522,15 @@ static int __blkdev_get(struct block_device *bdev, fmode_t mode, int for_part)
1520 if (ret) 1522 if (ret)
1521 goto out_unlock_bdev; 1523 goto out_unlock_bdev;
1522 } 1524 }
1523 /* only one opener holds refs to the module and disk */
1524 put_disk_and_module(disk);
1525 } 1525 }
1526 bdev->bd_openers++; 1526 bdev->bd_openers++;
1527 if (for_part) 1527 if (for_part)
1528 bdev->bd_part_count++; 1528 bdev->bd_part_count++;
1529 mutex_unlock(&bdev->bd_mutex); 1529 mutex_unlock(&bdev->bd_mutex);
1530 disk_unblock_events(disk); 1530 disk_unblock_events(disk);
1531 /* only one opener holds refs to the module and disk */
1532 if (!first_open)
1533 put_disk_and_module(disk);
1531 return 0; 1534 return 0;
1532 1535
1533 out_clear: 1536 out_clear: