diff options
| -rw-r--r-- | block/blk-cgroup.c | 11 | ||||
| -rw-r--r-- | block/genhd.c | 20 | ||||
| -rw-r--r-- | fs/block_dev.c | 19 | ||||
| -rw-r--r-- | include/linux/genhd.h | 1 |
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(); |
| 906 | fail: | 905 | fail: |
| 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); | |||
| 931 | void blkg_conf_finish(struct blkg_conf_ctx *ctx) | 928 | void 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 | } |
| 942 | EXPORT_SYMBOL_GPL(blkg_conf_finish); | 935 | EXPORT_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 | } |
| 1484 | EXPORT_SYMBOL(put_disk); | 1481 | EXPORT_SYMBOL(put_disk); |
| 1485 | 1482 | ||
| 1483 | /* | ||
| 1484 | * This is a counterpart of get_disk_and_module() and thus also of | ||
| 1485 | * get_gendisk(). | ||
| 1486 | */ | ||
| 1487 | void 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 | } | ||
| 1496 | EXPORT_SYMBOL(put_disk_and_module); | ||
| 1497 | |||
| 1486 | static void set_disk_ro_uevent(struct gendisk *gd, int ro) | 1498 | static 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); | |||
| 1407 | static int __blkdev_get(struct block_device *bdev, fmode_t mode, int for_part) | 1406 | static 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); | |||
| 602 | extern struct gendisk *__alloc_disk_node(int minors, int node_id); | 602 | extern struct gendisk *__alloc_disk_node(int minors, int node_id); |
| 603 | extern struct kobject *get_disk_and_module(struct gendisk *disk); | 603 | extern struct kobject *get_disk_and_module(struct gendisk *disk); |
| 604 | extern void put_disk(struct gendisk *disk); | 604 | extern void put_disk(struct gendisk *disk); |
| 605 | extern void put_disk_and_module(struct gendisk *disk); | ||
| 605 | extern void blk_register_region(dev_t devt, unsigned long range, | 606 | extern 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 *), |
