| From a1989b330093578ea5470bea0a00f940c444c466 Mon Sep 17 00:00:00 2001 |
| From: Hannes Reinecke <hare@suse.de> |
| Date: Wed, 26 Feb 2014 10:07:04 +0100 |
| Subject: dm mpath: fix stalls when handling invalid ioctls |
| |
| From: Hannes Reinecke <hare@suse.de> |
| |
| commit a1989b330093578ea5470bea0a00f940c444c466 upstream. |
| |
| An invalid ioctl will never be valid, irrespective of whether multipath |
| has active paths or not. So for invalid ioctls we do not have to wait |
| for multipath to activate any paths, but can rather return an error |
| code immediately. This fix resolves numerous instances of: |
| |
| udevd[]: worker [] unexpectedly returned with status 0x0100 |
| |
| that have been seen during testing. |
| |
| Signed-off-by: Hannes Reinecke <hare@suse.de> |
| Signed-off-by: Mike Snitzer <snitzer@redhat.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/md/dm-mpath.c | 7 +++++-- |
| 1 file changed, 5 insertions(+), 2 deletions(-) |
| |
| --- a/drivers/md/dm-mpath.c |
| +++ b/drivers/md/dm-mpath.c |
| @@ -1626,8 +1626,11 @@ static int multipath_ioctl(struct dm_tar |
| /* |
| * Only pass ioctls through if the device sizes match exactly. |
| */ |
| - if (!r && ti->len != i_size_read(bdev->bd_inode) >> SECTOR_SHIFT) |
| - r = scsi_verify_blk_ioctl(NULL, cmd); |
| + if (!bdev || ti->len != i_size_read(bdev->bd_inode) >> SECTOR_SHIFT) { |
| + int err = scsi_verify_blk_ioctl(NULL, cmd); |
| + if (err) |
| + r = err; |
| + } |
| |
| if (r == -ENOTCONN && !fatal_signal_pending(current)) |
| queue_work(kmultipathd, &m->process_queued_ios); |