From patchwork Mon Dec 31 12:16:12 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Subject: [RFC,1/3] xen_disk: handle disk files on ramfs/tmpfs From: Roger Pau Monne X-Patchwork-Id: 208847 Message-Id: <1356956174-23548-2-git-send-email-roger.pau@citrix.com> To: Cc: Anthony PERARD , xen-devel@lists.xen.org, Stefano Stabellini , Roger Pau Monne Date: Mon, 31 Dec 2012 13:16:12 +0100 Files that reside on ramfs or tmpfs cannot be opened with O_DIRECT, if first call to bdrv_open fails with errno = EINVAL, try a second call without BDRV_O_NOCACHE. Signed-off-by: Roger Pau Monné Cc: xen-devel@lists.xen.org Cc: Stefano Stabellini Cc: Anthony PERARD --- hw/xen_disk.c | 16 +++++++++++++--- 1 files changed, 13 insertions(+), 3 deletions(-) diff --git a/hw/xen_disk.c b/hw/xen_disk.c index e6bb2f2..a159ee5 100644 --- a/hw/xen_disk.c +++ b/hw/xen_disk.c @@ -562,7 +562,7 @@ static void blk_alloc(struct XenDevice *xendev) static int blk_init(struct XenDevice *xendev) { struct XenBlkDev *blkdev = container_of(xendev, struct XenBlkDev, xendev); - int index, qflags, info = 0; + int index, qflags, info = 0, rc; /* read xenstore entries */ if (blkdev->params == NULL) { @@ -625,8 +625,18 @@ static int blk_init(struct XenDevice *xendev) xen_be_printf(&blkdev->xendev, 2, "create new bdrv (xenbus setup)\n"); blkdev->bs = bdrv_new(blkdev->dev); if (blkdev->bs) { - if (bdrv_open(blkdev->bs, blkdev->filename, qflags, - bdrv_find_whitelisted_format(blkdev->fileproto)) != 0) { + rc = bdrv_open(blkdev->bs, blkdev->filename, qflags, + bdrv_find_whitelisted_format(blkdev->fileproto)); + if (rc != 0 && errno == EINVAL) { + /* Files on ramfs or tmpfs cannot be opened with O_DIRECT, + * remove the BDRV_O_NOCACHE flag, and try to open + * the file again. + */ + qflags &= ~BDRV_O_NOCACHE; + rc = bdrv_open(blkdev->bs, blkdev->filename, qflags, + bdrv_find_whitelisted_format(blkdev->fileproto)); + } + if (rc != 0) { bdrv_delete(blkdev->bs); blkdev->bs = NULL; }