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

From: Alasdair G Kergon
Date: Fri Nov 18 2005 - 09:54:16 EST


do_end_io() can be called without interrupts blocked.

From: Stefan Bader <Stefan.Bader@xxxxxxxxxx>
Signed-Off-By: Alasdair G Kergon <agk@xxxxxxxxxx>

Index: linux-2.6.14/drivers/md/dm-mpath.c
===================================================================
--- linux-2.6.14.orig/drivers/md/dm-mpath.c 2005-10-28 01:02:08.000000000 +0100
+++ linux-2.6.14/drivers/md/dm-mpath.c 2005-11-17 22:22:28.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);
@@ -1040,12 +1041,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 */
}
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/