Commit fe9cf30e authored by Alasdair G Kergon's avatar Alasdair G Kergon

dm mpath: move trigger_event to system workqueue

The same workqueue is used both for sending uevents and processing queued I/O.
Deadlock has been reported in RHEL5 when sending a uevent was blocked waiting
for the queued I/O to be processed.  Use scheduled_work() for the asynchronous
uevents instead.
Signed-off-by: default avatarAlasdair G Kergon <agk@redhat.com>
parent 784aae73
...@@ -889,7 +889,7 @@ static int fail_path(struct pgpath *pgpath) ...@@ -889,7 +889,7 @@ static int fail_path(struct pgpath *pgpath)
dm_path_uevent(DM_UEVENT_PATH_FAILED, m->ti, dm_path_uevent(DM_UEVENT_PATH_FAILED, m->ti,
pgpath->path.dev->name, m->nr_valid_paths); pgpath->path.dev->name, m->nr_valid_paths);
queue_work(kmultipathd, &m->trigger_event); schedule_work(&m->trigger_event);
queue_work(kmultipathd, &pgpath->deactivate_path); queue_work(kmultipathd, &pgpath->deactivate_path);
out: out:
...@@ -932,7 +932,7 @@ static int reinstate_path(struct pgpath *pgpath) ...@@ -932,7 +932,7 @@ static int reinstate_path(struct pgpath *pgpath)
dm_path_uevent(DM_UEVENT_PATH_REINSTATED, m->ti, dm_path_uevent(DM_UEVENT_PATH_REINSTATED, m->ti,
pgpath->path.dev->name, m->nr_valid_paths); pgpath->path.dev->name, m->nr_valid_paths);
queue_work(kmultipathd, &m->trigger_event); schedule_work(&m->trigger_event);
out: out:
spin_unlock_irqrestore(&m->lock, flags); spin_unlock_irqrestore(&m->lock, flags);
...@@ -976,7 +976,7 @@ static void bypass_pg(struct multipath *m, struct priority_group *pg, ...@@ -976,7 +976,7 @@ static void bypass_pg(struct multipath *m, struct priority_group *pg,
spin_unlock_irqrestore(&m->lock, flags); spin_unlock_irqrestore(&m->lock, flags);
queue_work(kmultipathd, &m->trigger_event); schedule_work(&m->trigger_event);
} }
/* /*
...@@ -1006,7 +1006,7 @@ static int switch_pg_num(struct multipath *m, const char *pgstr) ...@@ -1006,7 +1006,7 @@ static int switch_pg_num(struct multipath *m, const char *pgstr)
} }
spin_unlock_irqrestore(&m->lock, flags); spin_unlock_irqrestore(&m->lock, flags);
queue_work(kmultipathd, &m->trigger_event); schedule_work(&m->trigger_event);
return 0; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment