|
@@ -1555,6 +1555,7 @@ static int multipath_ioctl(struct dm_target *ti, unsigned int cmd,
|
|
|
unsigned long arg)
|
|
|
{
|
|
|
struct multipath *m = ti->private;
|
|
|
+ struct pgpath *pgpath;
|
|
|
struct block_device *bdev;
|
|
|
fmode_t mode;
|
|
|
unsigned long flags;
|
|
@@ -1570,12 +1571,14 @@ again:
|
|
|
if (!m->current_pgpath)
|
|
|
__choose_pgpath(m, 0);
|
|
|
|
|
|
- if (m->current_pgpath) {
|
|
|
- bdev = m->current_pgpath->path.dev->bdev;
|
|
|
- mode = m->current_pgpath->path.dev->mode;
|
|
|
+ pgpath = m->current_pgpath;
|
|
|
+
|
|
|
+ if (pgpath) {
|
|
|
+ bdev = pgpath->path.dev->bdev;
|
|
|
+ mode = pgpath->path.dev->mode;
|
|
|
}
|
|
|
|
|
|
- if (m->queue_io)
|
|
|
+ if ((pgpath && m->queue_io) || (!pgpath && m->queue_if_no_path))
|
|
|
r = -EAGAIN;
|
|
|
else if (!bdev)
|
|
|
r = -EIO;
|