[dm-devel] (no subject)
Mike Christie
mikenc at us.ibm.com
Fri Dec 26 12:32:01 UTC 2003
Hi Joe,
For the test in multipath_map:
if (m->current_path && atomic_dec_and_test(&m->count))
atomic_dec_and_test returns true when count is zero, so I was seeing a
new path selected every multipath_map call. The attached patch built
against udm3 cleans up multipath_map and fixes this bug.
Mike Christie
mikenc at us.ibm.com
-------------- next part --------------
--- linux-2.6.0-test10/drivers/md/dm-mpath.c 2003-12-23 01:48:00.628636037 -0800
+++ linux-2.6.0-test10-udm3/drivers/md/dm-mpath.c 2003-12-23 01:46:32.357982181 -0800
@@ -598,19 +598,16 @@ static int multipath_map(struct dm_targe
/*
* Do we need to choose a new path?
*/
- if (m->current_path && atomic_dec_and_test(&m->count))
- path = m->current_path;
-
- else {
+ if (!m->current_path || atomic_dec_and_test(&m->count)) {
if (__choose_path(m)) {
/* no paths */
spin_unlock_irqrestore(&m->path_lock, flags);
return -EIO;
- } else
- path = m->current_path;
+ }
}
- spin_unlock_irqrestore(&m->path_lock, flags);
+ path = m->current_path;
+ spin_unlock_irqrestore(&m->path_lock, flags);
/* map */
bio->bi_rw |= (1 << BIO_RW_FAILFAST);
bio->bi_bdev = path->dev->bdev;
More information about the dm-devel
mailing list