diff options
| -rw-r--r-- | drivers/md/dm-mpath.c | 11 | 
1 files changed, 7 insertions, 4 deletions
diff --git a/drivers/md/dm-mpath.c b/drivers/md/dm-mpath.c index d8abb90a6c2..034233eefc8 100644 --- a/drivers/md/dm-mpath.c +++ b/drivers/md/dm-mpath.c @@ -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;  |