aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--block/blk-cgroup.c11
-rw-r--r--block/genhd.c20
-rw-r--r--fs/block_dev.c19
-rw-r--r--include/linux/genhd.h1
4 files changed, 24 insertions, 27 deletions
diff --git a/block/blk-cgroup.c b/block/blk-cgroup.c
index 4117524ca45b..c2033a232a44 100644
--- a/block/blk-cgroup.c
+++ b/block/blk-cgroup.c
@@ -812,7 +812,6 @@ int blkg_conf_prep(struct blkcg *blkcg, const struct blkcg_policy *pol,
812 struct gendisk *disk; 812 struct gendisk *disk;
813 struct request_queue *q; 813 struct request_queue *q;
814 struct blkcg_gq *blkg; 814 struct blkcg_gq *blkg;
815 struct module *owner;
816 unsigned int major, minor; 815 unsigned int major, minor;
817 int key_len, part, ret; 816 int key_len, part, ret;
818 char *body; 817 char *body;
@@ -904,9 +903,7 @@ fail_unlock:
904 spin_unlock_irq(q->queue_lock); 903 spin_unlock_irq(q->queue_lock);
905 rcu_read_unlock(); 904 rcu_read_unlock();
906fail: 905fail:
907 owner = disk->fops->owner; 906 put_disk_and_module(disk);
908 put_disk(disk);
909 module_put(owner);
910 /* 907 /*
911 * If queue was bypassing, we should retry. Do so after a 908 * If queue was bypassing, we should retry. Do so after a
912 * short msleep(). It isn't strictly necessary but queue 909 * short msleep(). It isn't strictly necessary but queue
@@ -931,13 +928,9 @@ EXPORT_SYMBOL_GPL(blkg_conf_prep);
931void blkg_conf_finish(struct blkg_conf_ctx *ctx) 928void blkg_conf_finish(struct blkg_conf_ctx *ctx)
932 __releases(ctx->disk->queue->queue_lock) __releases(rcu) 929 __releases(ctx->disk->queue->queue_lock) __releases(rcu)
933{ 930{
934 struct module *owner;
935
936 spin_unlock_irq(ctx->disk->queue->queue_lock); 931 spin_unlock_irq(ctx->disk->queue->queue_lock);
937 rcu_read_unlock(); 932 rcu_read_unlock();
938 owner = ctx->disk->fops->owner; 933 put_disk_and_module(ctx->disk);
939 put_disk(ctx->disk);
940 module_put(owner);
941} 934}
942EXPORT_SYMBOL_GPL(blkg_conf_finish); 935EXPORT_SYMBOL_GPL(blkg_conf_finish);
943 936
diff --git a/block/genhd.c b/block/genhd.c
index 21b2843b27d0..4c0590434591 100644
--- a/block/genhd.c
+++ b/block/genhd.c
@@ -817,10 +817,7 @@ struct gendisk *get_gendisk(dev_t devt, int *partno)
817 } 817 }
818 818
819 if (disk && unlikely(disk->flags & GENHD_FL_HIDDEN)) { 819 if (disk && unlikely(disk->flags & GENHD_FL_HIDDEN)) {
820 struct module *owner = disk->fops->owner; 820 put_disk_and_module(disk);
821
822 put_disk(disk);
823 module_put(owner);
824 disk = NULL; 821 disk = NULL;
825 } 822 }
826 return disk; 823 return disk;
@@ -1483,6 +1480,21 @@ void put_disk(struct gendisk *disk)
1483} 1480}
1484EXPORT_SYMBOL(put_disk); 1481EXPORT_SYMBOL(put_disk);
1485 1482
1483/*
1484 * This is a counterpart of get_disk_and_module() and thus also of
1485 * get_gendisk().
1486 */
1487void put_disk_and_module(struct gendisk *disk)
1488{
1489 if (disk) {
1490 struct module *owner = disk->fops->owner;
1491
1492 put_disk(disk);
1493 module_put(owner);
1494 }
1495}
1496EXPORT_SYMBOL(put_disk_and_module);
1497
1486static void set_disk_ro_uevent(struct gendisk *gd, int ro) 1498static void set_disk_ro_uevent(struct gendisk *gd, int ro)
1487{ 1499{
1488 char event[] = "DISK_RO=1"; 1500 char event[] = "DISK_RO=1";
diff --git a/fs/block_dev.c b/fs/block_dev.c
index 4a181fcb5175..1dbbf847911a 100644
--- a/fs/block_dev.c
+++ b/fs/block_dev.c
@@ -1111,8 +1111,7 @@ static struct block_device *bd_start_claiming(struct block_device *bdev,
1111 else 1111 else
1112 whole = bdgrab(bdev); 1112 whole = bdgrab(bdev);
1113 1113
1114 module_put(disk->fops->owner); 1114 put_disk_and_module(disk);
1115 put_disk(disk);
1116 if (!whole) 1115 if (!whole)
1117 return ERR_PTR(-ENOMEM); 1116 return ERR_PTR(-ENOMEM);
1118 1117
@@ -1407,7 +1406,6 @@ static void __blkdev_put(struct block_device *bdev, fmode_t mode, int for_part);
1407static int __blkdev_get(struct block_device *bdev, fmode_t mode, int for_part) 1406static int __blkdev_get(struct block_device *bdev, fmode_t mode, int for_part)
1408{ 1407{
1409 struct gendisk *disk; 1408 struct gendisk *disk;
1410 struct module *owner;
1411 int ret; 1409 int ret;
1412 int partno; 1410 int partno;
1413 int perm = 0; 1411 int perm = 0;
@@ -1433,7 +1431,6 @@ static int __blkdev_get(struct block_device *bdev, fmode_t mode, int for_part)
1433 disk = get_gendisk(bdev->bd_dev, &partno); 1431 disk = get_gendisk(bdev->bd_dev, &partno);
1434 if (!disk) 1432 if (!disk)
1435 goto out; 1433 goto out;
1436 owner = disk->fops->owner;
1437 1434
1438 disk_block_events(disk); 1435 disk_block_events(disk);
1439 mutex_lock_nested(&bdev->bd_mutex, for_part); 1436 mutex_lock_nested(&bdev->bd_mutex, for_part);
@@ -1463,8 +1460,7 @@ static int __blkdev_get(struct block_device *bdev, fmode_t mode, int for_part)
1463 bdev->bd_queue = NULL; 1460 bdev->bd_queue = NULL;
1464 mutex_unlock(&bdev->bd_mutex); 1461 mutex_unlock(&bdev->bd_mutex);
1465 disk_unblock_events(disk); 1462 disk_unblock_events(disk);
1466 put_disk(disk); 1463 put_disk_and_module(disk);
1467 module_put(owner);
1468 goto restart; 1464 goto restart;
1469 } 1465 }
1470 } 1466 }
@@ -1525,8 +1521,7 @@ static int __blkdev_get(struct block_device *bdev, fmode_t mode, int for_part)
1525 goto out_unlock_bdev; 1521 goto out_unlock_bdev;
1526 } 1522 }
1527 /* only one opener holds refs to the module and disk */ 1523 /* only one opener holds refs to the module and disk */
1528 put_disk(disk); 1524 put_disk_and_module(disk);
1529 module_put(owner);
1530 } 1525 }
1531 bdev->bd_openers++; 1526 bdev->bd_openers++;
1532 if (for_part) 1527 if (for_part)
@@ -1546,8 +1541,7 @@ static int __blkdev_get(struct block_device *bdev, fmode_t mode, int for_part)
1546 out_unlock_bdev: 1541 out_unlock_bdev:
1547 mutex_unlock(&bdev->bd_mutex); 1542 mutex_unlock(&bdev->bd_mutex);
1548 disk_unblock_events(disk); 1543 disk_unblock_events(disk);
1549 put_disk(disk); 1544 put_disk_and_module(disk);
1550 module_put(owner);
1551 out: 1545 out:
1552 bdput(bdev); 1546 bdput(bdev);
1553 1547
@@ -1770,8 +1764,6 @@ static void __blkdev_put(struct block_device *bdev, fmode_t mode, int for_part)
1770 disk->fops->release(disk, mode); 1764 disk->fops->release(disk, mode);
1771 } 1765 }
1772 if (!bdev->bd_openers) { 1766 if (!bdev->bd_openers) {
1773 struct module *owner = disk->fops->owner;
1774
1775 disk_put_part(bdev->bd_part); 1767 disk_put_part(bdev->bd_part);
1776 bdev->bd_part = NULL; 1768 bdev->bd_part = NULL;
1777 bdev->bd_disk = NULL; 1769 bdev->bd_disk = NULL;
@@ -1779,8 +1771,7 @@ static void __blkdev_put(struct block_device *bdev, fmode_t mode, int for_part)
1779 victim = bdev->bd_contains; 1771 victim = bdev->bd_contains;
1780 bdev->bd_contains = NULL; 1772 bdev->bd_contains = NULL;
1781 1773
1782 put_disk(disk); 1774 put_disk_and_module(disk);
1783 module_put(owner);
1784 } 1775 }
1785 mutex_unlock(&bdev->bd_mutex); 1776 mutex_unlock(&bdev->bd_mutex);
1786 bdput(bdev); 1777 bdput(bdev);
diff --git a/include/linux/genhd.h b/include/linux/genhd.h
index 8e11b9321e55..7f5906fe1b70 100644
--- a/include/linux/genhd.h
+++ b/include/linux/genhd.h
@@ -602,6 +602,7 @@ extern void printk_all_partitions(void);
602extern struct gendisk *__alloc_disk_node(int minors, int node_id); 602extern struct gendisk *__alloc_disk_node(int minors, int node_id);
603extern struct kobject *get_disk_and_module(struct gendisk *disk); 603extern struct kobject *get_disk_and_module(struct gendisk *disk);
604extern void put_disk(struct gendisk *disk); 604extern void put_disk(struct gendisk *disk);
605extern void put_disk_and_module(struct gendisk *disk);
605extern void blk_register_region(dev_t devt, unsigned long range, 606extern void blk_register_region(dev_t devt, unsigned long range,
606 struct module *module, 607 struct module *module,
607 struct kobject *(*probe)(dev_t, int *, void *), 608 struct kobject *(*probe)(dev_t, int *, void *),