diff options
author | Mike Snitzer <snitzer@redhat.com> | 2017-01-25 10:24:52 -0500 |
---|---|---|
committer | Mike Snitzer <snitzer@redhat.com> | 2017-02-03 10:18:43 -0500 |
commit | 4087a1fffe38106e10646606a27f10d40451862d (patch) | |
tree | bba4836d57a0ff1922c1831c62ba22b6bfd43794 /drivers | |
parent | d19a55ccad15a486ffe03030570744e5d5bd9f8e (diff) |
dm rq: cope with DM device destruction while in dm_old_request_fn()
Fixes a crash in dm_table_find_target() due to a NULL struct dm_table
being passed from dm_old_request_fn() that races with DM device
destruction.
Reported-by: artem@flashgrid.io
Signed-off-by: Mike Snitzer <snitzer@redhat.com>
Cc: stable@vger.kernel.org
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/md/dm-rq.c | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/drivers/md/dm-rq.c b/drivers/md/dm-rq.c index 9d7275fb541a..6e702fc69a83 100644 --- a/drivers/md/dm-rq.c +++ b/drivers/md/dm-rq.c | |||
@@ -779,6 +779,10 @@ static void dm_old_request_fn(struct request_queue *q) | |||
779 | int srcu_idx; | 779 | int srcu_idx; |
780 | struct dm_table *map = dm_get_live_table(md, &srcu_idx); | 780 | struct dm_table *map = dm_get_live_table(md, &srcu_idx); |
781 | 781 | ||
782 | if (unlikely(!map)) { | ||
783 | dm_put_live_table(md, srcu_idx); | ||
784 | return; | ||
785 | } | ||
782 | ti = dm_table_find_target(map, pos); | 786 | ti = dm_table_find_target(map, pos); |
783 | dm_put_live_table(md, srcu_idx); | 787 | dm_put_live_table(md, srcu_idx); |
784 | } | 788 | } |