| From 876fbba1db4a377f050a2bb49b474c7527b2995d Mon Sep 17 00:00:00 2001 |
| From: Mike Snitzer <snitzer@redhat.com> |
| Date: Sun, 25 Sep 2011 23:26:17 +0100 |
| Subject: dm table: avoid crash if integrity profile changes |
| |
| From: Mike Snitzer <snitzer@redhat.com> |
| |
| commit 876fbba1db4a377f050a2bb49b474c7527b2995d upstream. |
| |
| Commit a63a5cf (dm: improve block integrity support) introduced a |
| two-phase initialization of a DM device's integrity profile. This |
| patch avoids dereferencing a NULL 'template_disk' pointer in |
| blk_integrity_register() if there is an integrity profile mismatch in |
| dm_table_set_integrity(). |
| |
| This can occur if the integrity profiles for stacked devices in a DM |
| table are changed between the call to dm_table_prealloc_integrity() and |
| dm_table_set_integrity(). |
| |
| Reported-by: Zdenek Kabelac <zkabelac@redhat.com> |
| Signed-off-by: Mike Snitzer <snitzer@redhat.com> |
| Signed-off-by: Alasdair G Kergon <agk@redhat.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| drivers/md/dm-table.c | 13 +++++++------ |
| 1 file changed, 7 insertions(+), 6 deletions(-) |
| |
| --- a/drivers/md/dm-table.c |
| +++ b/drivers/md/dm-table.c |
| @@ -1184,14 +1184,15 @@ static void dm_table_set_integrity(struc |
| return; |
| |
| template_disk = dm_table_get_integrity_disk(t, true); |
| - if (!template_disk && |
| - blk_integrity_is_initialized(dm_disk(t->md))) { |
| + if (template_disk) |
| + blk_integrity_register(dm_disk(t->md), |
| + blk_get_integrity(template_disk)); |
| + else if (blk_integrity_is_initialized(dm_disk(t->md))) |
| DMWARN("%s: device no longer has a valid integrity profile", |
| dm_device_name(t->md)); |
| - return; |
| - } |
| - blk_integrity_register(dm_disk(t->md), |
| - blk_get_integrity(template_disk)); |
| + else |
| + DMWARN("%s: unable to establish an integrity profile", |
| + dm_device_name(t->md)); |
| } |
| |
| void dm_table_set_restrictions(struct dm_table *t, struct request_queue *q, |