diff options
Diffstat (limited to 'drivers/md/dm.c')
-rw-r--r-- | drivers/md/dm.c | 11 |
1 files changed, 5 insertions, 6 deletions
diff --git a/drivers/md/dm.c b/drivers/md/dm.c index 6264781dc69a..1b5c6047e4f1 100644 --- a/drivers/md/dm.c +++ b/drivers/md/dm.c | |||
@@ -1001,6 +1001,7 @@ static void end_clone_bio(struct bio *clone) | |||
1001 | struct dm_rq_target_io *tio = info->tio; | 1001 | struct dm_rq_target_io *tio = info->tio; |
1002 | struct bio *bio = info->orig; | 1002 | struct bio *bio = info->orig; |
1003 | unsigned int nr_bytes = info->orig->bi_iter.bi_size; | 1003 | unsigned int nr_bytes = info->orig->bi_iter.bi_size; |
1004 | int error = clone->bi_error; | ||
1004 | 1005 | ||
1005 | bio_put(clone); | 1006 | bio_put(clone); |
1006 | 1007 | ||
@@ -1011,13 +1012,13 @@ static void end_clone_bio(struct bio *clone) | |||
1011 | * the remainder. | 1012 | * the remainder. |
1012 | */ | 1013 | */ |
1013 | return; | 1014 | return; |
1014 | else if (bio->bi_error) { | 1015 | else if (error) { |
1015 | /* | 1016 | /* |
1016 | * Don't notice the error to the upper layer yet. | 1017 | * Don't notice the error to the upper layer yet. |
1017 | * The error handling decision is made by the target driver, | 1018 | * The error handling decision is made by the target driver, |
1018 | * when the request is completed. | 1019 | * when the request is completed. |
1019 | */ | 1020 | */ |
1020 | tio->error = bio->bi_error; | 1021 | tio->error = error; |
1021 | return; | 1022 | return; |
1022 | } | 1023 | } |
1023 | 1024 | ||
@@ -2837,8 +2838,6 @@ static void __dm_destroy(struct mapped_device *md, bool wait) | |||
2837 | 2838 | ||
2838 | might_sleep(); | 2839 | might_sleep(); |
2839 | 2840 | ||
2840 | map = dm_get_live_table(md, &srcu_idx); | ||
2841 | |||
2842 | spin_lock(&_minor_lock); | 2841 | spin_lock(&_minor_lock); |
2843 | idr_replace(&_minor_idr, MINOR_ALLOCED, MINOR(disk_devt(dm_disk(md)))); | 2842 | idr_replace(&_minor_idr, MINOR_ALLOCED, MINOR(disk_devt(dm_disk(md)))); |
2844 | set_bit(DMF_FREEING, &md->flags); | 2843 | set_bit(DMF_FREEING, &md->flags); |
@@ -2852,14 +2851,14 @@ static void __dm_destroy(struct mapped_device *md, bool wait) | |||
2852 | * do not race with internal suspend. | 2851 | * do not race with internal suspend. |
2853 | */ | 2852 | */ |
2854 | mutex_lock(&md->suspend_lock); | 2853 | mutex_lock(&md->suspend_lock); |
2854 | map = dm_get_live_table(md, &srcu_idx); | ||
2855 | if (!dm_suspended_md(md)) { | 2855 | if (!dm_suspended_md(md)) { |
2856 | dm_table_presuspend_targets(map); | 2856 | dm_table_presuspend_targets(map); |
2857 | dm_table_postsuspend_targets(map); | 2857 | dm_table_postsuspend_targets(map); |
2858 | } | 2858 | } |
2859 | mutex_unlock(&md->suspend_lock); | ||
2860 | |||
2861 | /* dm_put_live_table must be before msleep, otherwise deadlock is possible */ | 2859 | /* dm_put_live_table must be before msleep, otherwise deadlock is possible */ |
2862 | dm_put_live_table(md, srcu_idx); | 2860 | dm_put_live_table(md, srcu_idx); |
2861 | mutex_unlock(&md->suspend_lock); | ||
2863 | 2862 | ||
2864 | /* | 2863 | /* |
2865 | * Rare, but there may be I/O requests still going to complete, | 2864 | * Rare, but there may be I/O requests still going to complete, |