[PATCH] device-mapper dm-mpath: endio spinlock fix

do_end_io() can be called without interrupts blocked.

Signed-off-by: Alasdair G Kergon <agk@redhat.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>

authored by Stefan Bader and committed by Linus Torvalds 640eb3b0 0e56822d

+7 -6
+7 -6
drivers/md/dm-mpath.c
··· 1000 1000 { 1001 1001 struct hw_handler *hwh = &m->hw_handler; 1002 1002 unsigned err_flags = MP_FAIL_PATH; /* Default behavior */ 1003 + unsigned long flags; 1003 1004 1004 1005 if (!error) 1005 1006 return 0; /* I/O complete */ ··· 1011 1010 if (error == -EOPNOTSUPP) 1012 1011 return error; 1013 1012 1014 - spin_lock(&m->lock); 1013 + spin_lock_irqsave(&m->lock, flags); 1015 1014 if (!m->nr_valid_paths) { 1016 1015 if (!m->queue_if_no_path) { 1017 - spin_unlock(&m->lock); 1016 + spin_unlock_irqrestore(&m->lock, flags); 1018 1017 return -EIO; 1019 1018 } else { 1020 - spin_unlock(&m->lock); 1019 + spin_unlock_irqrestore(&m->lock, flags); 1021 1020 goto requeue; 1022 1021 } 1023 1022 } 1024 - spin_unlock(&m->lock); 1023 + spin_unlock_irqrestore(&m->lock, flags); 1025 1024 1026 1025 if (hwh->type && hwh->type->error) 1027 1026 err_flags = hwh->type->error(hwh, bio); ··· 1041 1040 dm_bio_restore(&mpio->details, bio); 1042 1041 1043 1042 /* queue for the daemon to resubmit or fail */ 1044 - spin_lock(&m->lock); 1043 + spin_lock_irqsave(&m->lock, flags); 1045 1044 bio_list_add(&m->queued_ios, bio); 1046 1045 m->queue_size++; 1047 1046 if (!m->queue_io) 1048 1047 queue_work(kmultipathd, &m->process_queued_ios); 1049 - spin_unlock(&m->lock); 1048 + spin_unlock_irqrestore(&m->lock, flags); 1050 1049 1051 1050 return 1; /* io not complete */ 1052 1051 }