diff options
author | Mike Snitzer <snitzer@redhat.com> | 2016-02-18 16:13:51 -0500 |
---|---|---|
committer | Mike Snitzer <snitzer@redhat.com> | 2016-02-21 20:27:51 -0500 |
commit | 956a4025808df4abfe2fe25a11feb4c8f33fc336 (patch) | |
tree | 986069505785621f1dc0925ba363e5fc13e19c19 /drivers/md/dm.c | |
parent | 664820265d70a759dceca87b6eb200cd2b93cda8 (diff) |
dm: fix sparse "unexpected unlock" warnings in ioctl code
Rename dm_get_live_table_for_ioctl to dm_grab_bdev_for_ioctl and have it
do the dm_{get,put}_live_table() rather than split those operations.
The dm_grab_bdev_for_ioctl() callers only care about the block_device
associated with a singleton DM device so there isn't any need to retain
a reference to the live DM table. It is sufficient to:
1) dm_get_live_table()
2) bdgrab() the bdev associated with the singleton table's target
3) dm_put_live_table()
4) bdput() the bdev
Signed-off-by: Mike Snitzer <snitzer@redhat.com>
Diffstat (limited to 'drivers/md/dm.c')
-rw-r--r-- | drivers/md/dm.c | 56 |
1 files changed, 29 insertions, 27 deletions
diff --git a/drivers/md/dm.c b/drivers/md/dm.c index e9e74e6274d4..a712fd73a55f 100644 --- a/drivers/md/dm.c +++ b/drivers/md/dm.c | |||
@@ -556,17 +556,17 @@ static int dm_blk_getgeo(struct block_device *bdev, struct hd_geometry *geo) | |||
556 | return dm_get_geometry(md, geo); | 556 | return dm_get_geometry(md, geo); |
557 | } | 557 | } |
558 | 558 | ||
559 | static int dm_get_live_table_for_ioctl(struct mapped_device *md, | 559 | static int dm_grab_bdev_for_ioctl(struct mapped_device *md, |
560 | struct block_device **bdev, | 560 | struct block_device **bdev, |
561 | fmode_t *mode, int *srcu_idx) | 561 | fmode_t *mode) |
562 | { | 562 | { |
563 | struct dm_target *tgt; | 563 | struct dm_target *tgt; |
564 | struct dm_table *map; | 564 | struct dm_table *map; |
565 | int r; | 565 | int srcu_idx, r; |
566 | 566 | ||
567 | retry: | 567 | retry: |
568 | r = -ENOTTY; | 568 | r = -ENOTTY; |
569 | map = dm_get_live_table(md, srcu_idx); | 569 | map = dm_get_live_table(md, &srcu_idx); |
570 | if (!map || !dm_table_get_size(map)) | 570 | if (!map || !dm_table_get_size(map)) |
571 | goto out; | 571 | goto out; |
572 | 572 | ||
@@ -587,10 +587,12 @@ retry: | |||
587 | if (r < 0) | 587 | if (r < 0) |
588 | goto out; | 588 | goto out; |
589 | 589 | ||
590 | bdgrab(*bdev); | ||
591 | dm_put_live_table(md, srcu_idx); | ||
590 | return r; | 592 | return r; |
591 | 593 | ||
592 | out: | 594 | out: |
593 | dm_put_live_table(md, *srcu_idx); | 595 | dm_put_live_table(md, srcu_idx); |
594 | if (r == -ENOTCONN && !fatal_signal_pending(current)) { | 596 | if (r == -ENOTCONN && !fatal_signal_pending(current)) { |
595 | msleep(10); | 597 | msleep(10); |
596 | goto retry; | 598 | goto retry; |
@@ -602,9 +604,9 @@ static int dm_blk_ioctl(struct block_device *bdev, fmode_t mode, | |||
602 | unsigned int cmd, unsigned long arg) | 604 | unsigned int cmd, unsigned long arg) |
603 | { | 605 | { |
604 | struct mapped_device *md = bdev->bd_disk->private_data; | 606 | struct mapped_device *md = bdev->bd_disk->private_data; |
605 | int srcu_idx, r; | 607 | int r; |
606 | 608 | ||
607 | r = dm_get_live_table_for_ioctl(md, &bdev, &mode, &srcu_idx); | 609 | r = dm_grab_bdev_for_ioctl(md, &bdev, &mode); |
608 | if (r < 0) | 610 | if (r < 0) |
609 | return r; | 611 | return r; |
610 | 612 | ||
@@ -621,7 +623,7 @@ static int dm_blk_ioctl(struct block_device *bdev, fmode_t mode, | |||
621 | 623 | ||
622 | r = __blkdev_driver_ioctl(bdev, mode, cmd, arg); | 624 | r = __blkdev_driver_ioctl(bdev, mode, cmd, arg); |
623 | out: | 625 | out: |
624 | dm_put_live_table(md, srcu_idx); | 626 | bdput(bdev); |
625 | return r; | 627 | return r; |
626 | } | 628 | } |
627 | 629 | ||
@@ -3552,14 +3554,14 @@ void dm_free_md_mempools(struct dm_md_mempools *pools) | |||
3552 | } | 3554 | } |
3553 | 3555 | ||
3554 | static int dm_pr_register(struct block_device *bdev, u64 old_key, u64 new_key, | 3556 | static int dm_pr_register(struct block_device *bdev, u64 old_key, u64 new_key, |
3555 | u32 flags) | 3557 | u32 flags) |
3556 | { | 3558 | { |
3557 | struct mapped_device *md = bdev->bd_disk->private_data; | 3559 | struct mapped_device *md = bdev->bd_disk->private_data; |
3558 | const struct pr_ops *ops; | 3560 | const struct pr_ops *ops; |
3559 | fmode_t mode; | 3561 | fmode_t mode; |
3560 | int srcu_idx, r; | 3562 | int r; |
3561 | 3563 | ||
3562 | r = dm_get_live_table_for_ioctl(md, &bdev, &mode, &srcu_idx); | 3564 | r = dm_grab_bdev_for_ioctl(md, &bdev, &mode); |
3563 | if (r < 0) | 3565 | if (r < 0) |
3564 | return r; | 3566 | return r; |
3565 | 3567 | ||
@@ -3569,19 +3571,19 @@ static int dm_pr_register(struct block_device *bdev, u64 old_key, u64 new_key, | |||
3569 | else | 3571 | else |
3570 | r = -EOPNOTSUPP; | 3572 | r = -EOPNOTSUPP; |
3571 | 3573 | ||
3572 | dm_put_live_table(md, srcu_idx); | 3574 | bdput(bdev); |
3573 | return r; | 3575 | return r; |
3574 | } | 3576 | } |
3575 | 3577 | ||
3576 | static int dm_pr_reserve(struct block_device *bdev, u64 key, enum pr_type type, | 3578 | static int dm_pr_reserve(struct block_device *bdev, u64 key, enum pr_type type, |
3577 | u32 flags) | 3579 | u32 flags) |
3578 | { | 3580 | { |
3579 | struct mapped_device *md = bdev->bd_disk->private_data; | 3581 | struct mapped_device *md = bdev->bd_disk->private_data; |
3580 | const struct pr_ops *ops; | 3582 | const struct pr_ops *ops; |
3581 | fmode_t mode; | 3583 | fmode_t mode; |
3582 | int srcu_idx, r; | 3584 | int r; |
3583 | 3585 | ||
3584 | r = dm_get_live_table_for_ioctl(md, &bdev, &mode, &srcu_idx); | 3586 | r = dm_grab_bdev_for_ioctl(md, &bdev, &mode); |
3585 | if (r < 0) | 3587 | if (r < 0) |
3586 | return r; | 3588 | return r; |
3587 | 3589 | ||
@@ -3591,7 +3593,7 @@ static int dm_pr_reserve(struct block_device *bdev, u64 key, enum pr_type type, | |||
3591 | else | 3593 | else |
3592 | r = -EOPNOTSUPP; | 3594 | r = -EOPNOTSUPP; |
3593 | 3595 | ||
3594 | dm_put_live_table(md, srcu_idx); | 3596 | bdput(bdev); |
3595 | return r; | 3597 | return r; |
3596 | } | 3598 | } |
3597 | 3599 | ||
@@ -3600,9 +3602,9 @@ static int dm_pr_release(struct block_device *bdev, u64 key, enum pr_type type) | |||
3600 | struct mapped_device *md = bdev->bd_disk->private_data; | 3602 | struct mapped_device *md = bdev->bd_disk->private_data; |
3601 | const struct pr_ops *ops; | 3603 | const struct pr_ops *ops; |
3602 | fmode_t mode; | 3604 | fmode_t mode; |
3603 | int srcu_idx, r; | 3605 | int r; |
3604 | 3606 | ||
3605 | r = dm_get_live_table_for_ioctl(md, &bdev, &mode, &srcu_idx); | 3607 | r = dm_grab_bdev_for_ioctl(md, &bdev, &mode); |
3606 | if (r < 0) | 3608 | if (r < 0) |
3607 | return r; | 3609 | return r; |
3608 | 3610 | ||
@@ -3612,19 +3614,19 @@ static int dm_pr_release(struct block_device *bdev, u64 key, enum pr_type type) | |||
3612 | else | 3614 | else |
3613 | r = -EOPNOTSUPP; | 3615 | r = -EOPNOTSUPP; |
3614 | 3616 | ||
3615 | dm_put_live_table(md, srcu_idx); | 3617 | bdput(bdev); |
3616 | return r; | 3618 | return r; |
3617 | } | 3619 | } |
3618 | 3620 | ||
3619 | static int dm_pr_preempt(struct block_device *bdev, u64 old_key, u64 new_key, | 3621 | static int dm_pr_preempt(struct block_device *bdev, u64 old_key, u64 new_key, |
3620 | enum pr_type type, bool abort) | 3622 | enum pr_type type, bool abort) |
3621 | { | 3623 | { |
3622 | struct mapped_device *md = bdev->bd_disk->private_data; | 3624 | struct mapped_device *md = bdev->bd_disk->private_data; |
3623 | const struct pr_ops *ops; | 3625 | const struct pr_ops *ops; |
3624 | fmode_t mode; | 3626 | fmode_t mode; |
3625 | int srcu_idx, r; | 3627 | int r; |
3626 | 3628 | ||
3627 | r = dm_get_live_table_for_ioctl(md, &bdev, &mode, &srcu_idx); | 3629 | r = dm_grab_bdev_for_ioctl(md, &bdev, &mode); |
3628 | if (r < 0) | 3630 | if (r < 0) |
3629 | return r; | 3631 | return r; |
3630 | 3632 | ||
@@ -3634,7 +3636,7 @@ static int dm_pr_preempt(struct block_device *bdev, u64 old_key, u64 new_key, | |||
3634 | else | 3636 | else |
3635 | r = -EOPNOTSUPP; | 3637 | r = -EOPNOTSUPP; |
3636 | 3638 | ||
3637 | dm_put_live_table(md, srcu_idx); | 3639 | bdput(bdev); |
3638 | return r; | 3640 | return r; |
3639 | } | 3641 | } |
3640 | 3642 | ||
@@ -3643,9 +3645,9 @@ static int dm_pr_clear(struct block_device *bdev, u64 key) | |||
3643 | struct mapped_device *md = bdev->bd_disk->private_data; | 3645 | struct mapped_device *md = bdev->bd_disk->private_data; |
3644 | const struct pr_ops *ops; | 3646 | const struct pr_ops *ops; |
3645 | fmode_t mode; | 3647 | fmode_t mode; |
3646 | int srcu_idx, r; | 3648 | int r; |
3647 | 3649 | ||
3648 | r = dm_get_live_table_for_ioctl(md, &bdev, &mode, &srcu_idx); | 3650 | r = dm_grab_bdev_for_ioctl(md, &bdev, &mode); |
3649 | if (r < 0) | 3651 | if (r < 0) |
3650 | return r; | 3652 | return r; |
3651 | 3653 | ||
@@ -3655,7 +3657,7 @@ static int dm_pr_clear(struct block_device *bdev, u64 key) | |||
3655 | else | 3657 | else |
3656 | r = -EOPNOTSUPP; | 3658 | r = -EOPNOTSUPP; |
3657 | 3659 | ||
3658 | dm_put_live_table(md, srcu_idx); | 3660 | bdput(bdev); |
3659 | return r; | 3661 | return r; |
3660 | } | 3662 | } |
3661 | 3663 | ||