Message ID | 1273930252-12673-1-git-send-email-nab@linux-iscsi.org |
---|---|
State | New |
Headers | show |
On Sat, May 15, 2010 at 06:30:52AM -0700, Nicholas A. Bellinger wrote: > From: Nicholas Bellinger <nab@linux-iscsi.org> > > This patch adds a special BlockDriverState->sg check in block.c:find_image_format() > after bdrv_file_open() -> block/raw-posix.c:hdev_open() has been called to determine > if we are dealing with a Linux host scsi-generic device or not. > > The patch then returns the BlockDriver * from find_protocol(), skipping the subsequent > bdrv_read() and rest of find_image_format(). That's not quite correct as we don't want to expose formats directly. Returning bdrv_find_format("raw"); should fix it for now, although I really hate having these special cases in block.c.
On Sun, 2010-05-16 at 15:29 +0200, Christoph Hellwig wrote: > On Sat, May 15, 2010 at 06:30:52AM -0700, Nicholas A. Bellinger wrote: > > From: Nicholas Bellinger <nab@linux-iscsi.org> > > > > This patch adds a special BlockDriverState->sg check in block.c:find_image_format() > > after bdrv_file_open() -> block/raw-posix.c:hdev_open() has been called to determine > > if we are dealing with a Linux host scsi-generic device or not. > > > > The patch then returns the BlockDriver * from find_protocol(), skipping the subsequent > > bdrv_read() and rest of find_image_format(). > > That's not quite correct as we don't want to expose formats directly. > Returning > > bdrv_find_format("raw"); > > should fix it for now, Ahh, that makes more sense.. Attached is updated patch #1: [PATCH 1/2] [block]: Make find_image_format() return 'raw' BlockDriver for SG_IO devices > although I really hate having these special > cases in block.c. Indeed having BlockDriverState->sg kinda feels kinda like a hack to begin with, but it appears this is currently QEMU's way of telling block code to disable internal SCSI CDB emulation for devices. Best, --nab
diff --git a/block.c b/block.c index 48305b7..02a22f6 100644 --- a/block.c +++ b/block.c @@ -332,6 +332,13 @@ static BlockDriver *find_image_format(const char *filename) ret = bdrv_file_open(&bs, filename, 0); if (ret < 0) return NULL; + /* + * For scsi-generic we skip the read and return *drv from + * find_protocol(). + */ + if (bs->sg) + return drv; + ret = bdrv_pread(bs, 0, buf, sizeof(buf)); bdrv_delete(bs); if (ret < 0) {