aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/md/dm.c
diff options
context:
space:
mode:
authorMike Snitzer <snitzer@redhat.com>2016-02-18 16:13:51 -0500
committerMike Snitzer <snitzer@redhat.com>2016-02-21 20:27:51 -0500
commit956a4025808df4abfe2fe25a11feb4c8f33fc336 (patch)
tree986069505785621f1dc0925ba363e5fc13e19c19 /drivers/md/dm.c
parent664820265d70a759dceca87b6eb200cd2b93cda8 (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.c56
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
559static int dm_get_live_table_for_ioctl(struct mapped_device *md, 559static 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
567retry: 567retry:
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
592out: 594out:
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);
623out: 625out:
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
3554static int dm_pr_register(struct block_device *bdev, u64 old_key, u64 new_key, 3556static 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
3576static int dm_pr_reserve(struct block_device *bdev, u64 key, enum pr_type type, 3578static 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
3619static int dm_pr_preempt(struct block_device *bdev, u64 old_key, u64 new_key, 3621static 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