[PATCH] device-mapper: Fix queue_if_no_path initialisation

From: Alasdair G Kergon
Date: Mon Sep 26 2005 - 16:57:55 EST


When creating a multipath device, if the queue_if_no_path parameter
is specified it gets ignored.

While the queue_if_no_path variable is correctly set to 1,
the saved_queue_if_no_path gets set to 0. When the device is
subsequently made live (resumed), the saved value (0) always
overwrites the live value (1) so the option *always* gets turned off.

The fix adds a parameter to the queue_if_no_path() function to indicate
whether the previous value should be preserved or not - if not, as
when the device is being set up, the saved value is set to the new value (1).

Signed-Off-By: Alasdair G Kergon <agk@xxxxxxxxxx>

Index: linux-2.6.14-rc2/drivers/md/dm-mpath.c
===================================================================
--- linux-2.6.14-rc2.orig/drivers/md/dm-mpath.c 2005-09-20 04:00:41.000000000 +0100
+++ linux-2.6.14-rc2/drivers/md/dm-mpath.c 2005-09-26 22:43:00.000000000 +0100
@@ -329,13 +329,17 @@
/*
* If we run out of usable paths, should we queue I/O or error it?
*/
-static int queue_if_no_path(struct multipath *m, unsigned queue_if_no_path)
+static int queue_if_no_path(struct multipath *m, unsigned queue_if_no_path,
+ unsigned save_old_value)
{
unsigned long flags;

spin_lock_irqsave(&m->lock, flags);

- m->saved_queue_if_no_path = m->queue_if_no_path;
+ if (save_old_value)
+ m->saved_queue_if_no_path = m->queue_if_no_path;
+ else
+ m->saved_queue_if_no_path = queue_if_no_path;
m->queue_if_no_path = queue_if_no_path;
if (!m->queue_if_no_path && m->queue_size)
queue_work(kmultipathd, &m->process_queued_ios);
@@ -677,7 +681,7 @@
return 0;

if (!strnicmp(shift(as), MESG_STR("queue_if_no_path")))
- return queue_if_no_path(m, 1);
+ return queue_if_no_path(m, 1, 0);
else {
ti->error = "Unrecognised multipath feature request";
return -EINVAL;
@@ -1077,7 +1081,7 @@
{
struct multipath *m = (struct multipath *) ti->private;

- queue_if_no_path(m, 0);
+ queue_if_no_path(m, 0, 1);
}

/*
@@ -1222,9 +1226,9 @@

if (argc == 1) {
if (!strnicmp(argv[0], MESG_STR("queue_if_no_path")))
- return queue_if_no_path(m, 1);
+ return queue_if_no_path(m, 1, 0);
else if (!strnicmp(argv[0], MESG_STR("fail_if_no_path")))
- return queue_if_no_path(m, 0);
+ return queue_if_no_path(m, 0, 0);
}

if (argc != 2)
-
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/