do_end_io() can be called without interrupts blocked. Signed-Off-By: Alasdair G Kergon [Submitted upstream 2005/11/18] Index: linux-2.6.14/drivers/md/dm-mpath.c =================================================================== --- linux-2.6.14.orig/drivers/md/dm-mpath.c 2005-11-14 16:56:48.000000000 +0000 +++ linux-2.6.14/drivers/md/dm-mpath.c 2005-11-14 17:02:57.000000000 +0000 @@ -1000,6 +1000,7 @@ static int do_end_io(struct multipath *m { struct hw_handler *hwh = &m->hw_handler; unsigned err_flags = MP_FAIL_PATH; /* Default behavior */ + unsigned long flags; if (!error) return 0; /* I/O complete */ @@ -1010,17 +1011,17 @@ static int do_end_io(struct multipath *m if (error == -EOPNOTSUPP) return error; - spin_lock(&m->lock); + spin_lock_irqsave(&m->lock, flags); if (!m->nr_valid_paths) { if (!m->queue_if_no_path) { - spin_unlock(&m->lock); + spin_unlock_irqrestore(&m->lock, flags); return -EIO; } else { - spin_unlock(&m->lock); + spin_unlock_irqrestore(&m->lock, flags); goto requeue; } } - spin_unlock(&m->lock); + spin_unlock_irqrestore(&m->lock, flags); if (hwh->type && hwh->type->error) err_flags = hwh->type->error(hwh, bio); @@ -1042,12 +1043,12 @@ static int do_end_io(struct multipath *m dm_bio_restore(&mpio->details, bio); /* queue for the daemon to resubmit or fail */ - spin_lock(&m->lock); + spin_lock_irqsave(&m->lock, flags); bio_list_add(&m->queued_ios, bio); m->queue_size++; if (!m->queue_io) queue_work(kmultipathd, &m->process_queued_ios); - spin_unlock(&m->lock); + spin_unlock_irqrestore(&m->lock, flags); return 1; /* io not complete */ }