block: Add SG_IO device check in refresh_total_sectors()
authorNicholas Bellinger <nab@linux-iscsi.org>
Mon, 17 May 2010 16:46:04 +0000 (09:46 -0700)
committerKevin Wolf <kwolf@redhat.com>
Fri, 21 May 2010 09:49:19 +0000 (11:49 +0200)
This patch adds a special case check for scsi-generic devices in
refresh_total_sectors() to skip the subsequent BlockDriver->bdrv_getlength()
that will be returning -ESPIPE from block/raw-posic.c:raw_getlength() for
BlockDriverState->sg=1 devices.

Signed-off-by: Nicholas A. Bellinger <nab@linux-iscsi.org>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
block.c

diff --git a/block.c b/block.c
index 6a95768e81e17927b7c62c156f64f109ac8ddfe0..0b0966c5715034581f1b723601c55cbefb7d4379 100644 (file)
--- a/block.c
+++ b/block.c
@@ -361,6 +361,10 @@ static int refresh_total_sectors(BlockDriverState *bs, int64_t hint)
 {
     BlockDriver *drv = bs->drv;
 
+    /* Do not attempt drv->bdrv_getlength() on scsi-generic devices */
+    if (bs->sg)
+        return 0;
+
     /* query actual device if possible, otherwise just trust the hint */
     if (drv->bdrv_getlength) {
         int64_t length = drv->bdrv_getlength(bs);