[PATCH] device-mapper multipath: Use private workqueue

From: Alasdair G Kergon
Date: Wed May 04 2005 - 12:19:59 EST


dm-mpath.c needs to use a private workqueue (like other dm targets
already do) to avoid interfering with users of the default workqueue.

Signed-Off-By: Alasdair G Kergon <agk@xxxxxxxxxx>
Acked-by: Jens Axboe <axboe@xxxxxxx>
Signed-off-by: Lars Marowsky-Bree <lmb@xxxxxxx>
Signed-off-by: mikenc@xxxxxxxxxx

--- diff/drivers/md/dm-mpath.c 2005-04-04 17:38:05.000000000 +0100
+++ source/drivers/md/dm-mpath.c 2005-04-21 17:32:53.000000000 +0100
@@ -101,6 +101,7 @@

static kmem_cache_t *_mpio_cache;

+struct workqueue_struct *kmultipathd;
static void process_queued_ios(void *data);
static void trigger_event(void *data);

@@ -308,7 +309,7 @@
bio_list_add(&m->queued_ios, bio);
m->queue_size++;
if (m->pg_init_required || !m->queue_io)
- schedule_work(&m->process_queued_ios);
+ queue_work(kmultipathd, &m->process_queued_ios);
pgpath = NULL;
r = 0;
} else if (!pgpath)
@@ -334,7 +335,7 @@

m->queue_if_no_path = queue_if_no_path;
if (!m->queue_if_no_path)
- schedule_work(&m->process_queued_ios);
+ queue_work(kmultipathd, &m->process_queued_ios);

spin_unlock_irqrestore(&m->lock, flags);

@@ -800,7 +801,7 @@
if (pgpath == m->current_pgpath)
m->current_pgpath = NULL;

- schedule_work(&m->trigger_event);
+ queue_work(kmultipathd, &m->trigger_event);

out:
spin_unlock_irqrestore(&m->lock, flags);
@@ -837,9 +838,9 @@

m->current_pgpath = NULL;
if (!m->nr_valid_paths++)
- schedule_work(&m->process_queued_ios);
+ queue_work(kmultipathd, &m->process_queued_ios);

- schedule_work(&m->trigger_event);
+ queue_work(kmultipathd, &m->trigger_event);

out:
spin_unlock_irqrestore(&m->lock, flags);
@@ -883,7 +884,7 @@

spin_unlock_irqrestore(&m->lock, flags);

- schedule_work(&m->trigger_event);
+ queue_work(kmultipathd, &m->trigger_event);
}

/*
@@ -913,7 +914,7 @@
}
spin_unlock_irqrestore(&m->lock, flags);

- schedule_work(&m->trigger_event);
+ queue_work(kmultipathd, &m->trigger_event);
return 0;
}

@@ -968,7 +969,7 @@
m->current_pgpath = NULL;
m->current_pg = NULL;
}
- schedule_work(&m->process_queued_ios);
+ queue_work(kmultipathd, &m->process_queued_ios);
spin_unlock_irqrestore(&m->lock, flags);
}

@@ -1018,7 +1019,7 @@
bio_list_add(&m->queued_ios, bio);
m->queue_size++;
if (!m->queue_io)
- schedule_work(&m->process_queued_ios);
+ queue_work(kmultipathd, &m->process_queued_ios);
spin_unlock(&m->lock);

return 1; /* io not complete */
@@ -1057,7 +1058,7 @@
spin_lock_irqsave(&m->lock, flags);
m->suspended = 1;
if (m->queue_if_no_path)
- schedule_work(&m->process_queued_ios);
+ queue_work(kmultipathd, &m->process_queued_ios);
spin_unlock_irqrestore(&m->lock, flags);
}

@@ -1274,6 +1275,15 @@
return -EINVAL;
}

+ kmultipathd = create_workqueue("kmpathd");
+ if (!kmultipathd) {
+ DMERR("%s: failed to create workqueue kmpathd",
+ multipath_target.name);
+ dm_unregister_target(&multipath_target);
+ kmem_cache_destroy(_mpio_cache);
+ return -ENOMEM;
+ }
+
DMINFO("dm-multipath version %u.%u.%u loaded",
multipath_target.version[0], multipath_target.version[1],
multipath_target.version[2]);
@@ -1285,6 +1295,8 @@
{
int r;

+ destroy_workqueue(kmultipathd);
+
r = dm_unregister_target(&multipath_target);
if (r < 0)
DMERR("%s: target unregister failed %d",
-
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/