Commit 63d832c3 authored by Hannes Reinecke's avatar Hannes Reinecke Committed by Mike Snitzer

dm mpath: really fix lockdep warning

lockdep complains about a circular locking.  And indeed, we need to
release the lock before calling dm_table_run_md_queue_async().

As such, commit 4cdd2ad7 ("dm mpath: fix lock order inconsistency in
multipath_ioctl") must also be reverted in addition to fixing the
lock order in the other dm_table_run_md_queue_async() callers.
Reported-by: default avatarBart van Assche <bvanassche@acm.org>
Tested-by: default avatarBart van Assche <bvanassche@acm.org>
Signed-off-by: default avatarHannes Reinecke <hare@suse.de>
Signed-off-by: default avatarMike Snitzer <snitzer@redhat.com>
parent f1daa838
...@@ -445,11 +445,11 @@ static int queue_if_no_path(struct multipath *m, unsigned queue_if_no_path, ...@@ -445,11 +445,11 @@ static int queue_if_no_path(struct multipath *m, unsigned queue_if_no_path,
else else
m->saved_queue_if_no_path = queue_if_no_path; m->saved_queue_if_no_path = queue_if_no_path;
m->queue_if_no_path = queue_if_no_path; m->queue_if_no_path = queue_if_no_path;
if (!m->queue_if_no_path)
dm_table_run_md_queue_async(m->ti->table);
spin_unlock_irqrestore(&m->lock, flags); spin_unlock_irqrestore(&m->lock, flags);
if (!queue_if_no_path)
dm_table_run_md_queue_async(m->ti->table);
return 0; return 0;
} }
...@@ -954,7 +954,7 @@ static int fail_path(struct pgpath *pgpath) ...@@ -954,7 +954,7 @@ static int fail_path(struct pgpath *pgpath)
*/ */
static int reinstate_path(struct pgpath *pgpath) static int reinstate_path(struct pgpath *pgpath)
{ {
int r = 0; int r = 0, run_queue = 0;
unsigned long flags; unsigned long flags;
struct multipath *m = pgpath->pg->m; struct multipath *m = pgpath->pg->m;
...@@ -978,7 +978,7 @@ static int reinstate_path(struct pgpath *pgpath) ...@@ -978,7 +978,7 @@ static int reinstate_path(struct pgpath *pgpath)
if (!m->nr_valid_paths++) { if (!m->nr_valid_paths++) {
m->current_pgpath = NULL; m->current_pgpath = NULL;
dm_table_run_md_queue_async(m->ti->table); run_queue = 1;
} else if (m->hw_handler_name && (m->current_pg == pgpath->pg)) { } else if (m->hw_handler_name && (m->current_pg == pgpath->pg)) {
if (queue_work(kmpath_handlerd, &pgpath->activate_path.work)) if (queue_work(kmpath_handlerd, &pgpath->activate_path.work))
m->pg_init_in_progress++; m->pg_init_in_progress++;
...@@ -991,6 +991,8 @@ static int reinstate_path(struct pgpath *pgpath) ...@@ -991,6 +991,8 @@ static int reinstate_path(struct pgpath *pgpath)
out: out:
spin_unlock_irqrestore(&m->lock, flags); spin_unlock_irqrestore(&m->lock, flags);
if (run_queue)
dm_table_run_md_queue_async(m->ti->table);
return r; return r;
} }
...@@ -1566,8 +1568,8 @@ static int multipath_ioctl(struct dm_target *ti, unsigned int cmd, ...@@ -1566,8 +1568,8 @@ static int multipath_ioctl(struct dm_target *ti, unsigned int cmd,
} }
if (m->pg_init_required) if (m->pg_init_required)
__pg_init_all_paths(m); __pg_init_all_paths(m);
dm_table_run_md_queue_async(m->ti->table);
spin_unlock_irqrestore(&m->lock, flags); spin_unlock_irqrestore(&m->lock, flags);
dm_table_run_md_queue_async(m->ti->table);
} }
return r ? : __blkdev_driver_ioctl(bdev, mode, cmd, arg); return r ? : __blkdev_driver_ioctl(bdev, mode, cmd, arg);
......
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