From patchwork Tue Jan 4 14:33:30 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Juan Quintela X-Patchwork-Id: 77480 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [199.232.76.165]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id D0ADAB6F14 for ; Wed, 5 Jan 2011 01:40:38 +1100 (EST) Received: from localhost ([127.0.0.1]:58658 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1Pa83w-0003AB-6Q for incoming@patchwork.ozlabs.org; Tue, 04 Jan 2011 09:40:36 -0500 Received: from [140.186.70.92] (port=41260 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1Pa7y8-0000AG-Nf for qemu-devel@nongnu.org; Tue, 04 Jan 2011 09:34:39 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Pa7y6-0004Zr-MF for qemu-devel@nongnu.org; Tue, 04 Jan 2011 09:34:36 -0500 Received: from mx1.redhat.com ([209.132.183.28]:13785) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Pa7y6-0004Ze-CS for qemu-devel@nongnu.org; Tue, 04 Jan 2011 09:34:34 -0500 Received: from int-mx01.intmail.prod.int.phx2.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by mx1.redhat.com (8.13.8/8.13.8) with ESMTP id p04EYXui012234 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Tue, 4 Jan 2011 09:34:33 -0500 Received: from neno.mitica (ovpn-113-93.phx2.redhat.com [10.3.113.93]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id p04EYQ25004900; Tue, 4 Jan 2011 09:34:32 -0500 From: Juan Quintela To: qemu-devel@nongnu.org Date: Tue, 4 Jan 2011 15:33:30 +0100 Message-Id: <95fe2a778152f50d942dcb17872927247195d0b1.1294150511.git.quintela@redhat.com> In-Reply-To: References: In-Reply-To: References: X-Scanned-By: MIMEDefang 2.67 on 10.5.11.11 X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. Subject: [Qemu-devel] [PATCH 5/5] drive_open: Add invalidate option for block devices X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Linux allows to invalidate block devices. This is needed for the incoming migration part. Signed-off-by: Juan Quintela --- block.h | 2 ++ block/raw-posix.c | 24 ++++++++++++++++++++++++ blockdev.c | 9 +++++---- 3 files changed, 31 insertions(+), 4 deletions(-) diff --git a/block.h b/block.h index f923add..5ac96a5 100644 --- a/block.h +++ b/block.h @@ -34,6 +34,8 @@ typedef struct QEMUSnapshotInfo { #define BDRV_O_NATIVE_AIO 0x0080 /* use native AIO instead of the thread pool */ #define BDRV_O_NO_BACKING 0x0100 /* don't open the backing file */ #define BDRV_O_NO_FLUSH 0x0200 /* disable flushing on this disk */ +#define BDRV_O_INVALIDATE 0x0400 /* invalidate buffer cache for this device. + re-read things from server */ #define BDRV_O_CACHE_MASK (BDRV_O_NOCACHE | BDRV_O_CACHE_WB | BDRV_O_NO_FLUSH) diff --git a/block/raw-posix.c b/block/raw-posix.c index 6b72470..9439cf1 100644 --- a/block/raw-posix.c +++ b/block/raw-posix.c @@ -51,6 +51,7 @@ #include #include #include +#include #endif #if defined (__FreeBSD__) || defined(__FreeBSD_kernel__) #include @@ -168,6 +169,29 @@ static int raw_open_common(BlockDriverState *bs, const char *filename, s->fd = fd; s->aligned_buf = NULL; +#ifdef __linux__ + if ((bdrv_flags & BDRV_O_INVALIDATE)) { + struct stat buf; + int res; + + res = fstat(fd, &buf); + + if (res < 0) { + return -errno; + } + + if (S_ISBLK(buf.st_mode)) { + printf("we are in a block device: %s\n", filename); + res = ioctl(fd, BLKFLSBUF, 0); + if (res < 0) { + fprintf(stderr, "qemu: buffer invalidation of %s" + " failed with error %d\n", filename, errno); + return -errno; + } + } + } +#endif /* __linux__ */ + if ((bdrv_flags & BDRV_O_NOCACHE)) { /* * Allocate a buffer for read/modify/write cycles. Chose the size diff --git a/blockdev.c b/blockdev.c index 3f3df7a..94920b8 100644 --- a/blockdev.c +++ b/blockdev.c @@ -137,9 +137,10 @@ static int parse_block_error_action(const char *buf, int is_read) } } -static int drive_open(DriveInfo *dinfo) +static int drive_open(DriveInfo *dinfo, int extra_flags) { - int res = bdrv_open(dinfo->bdrv, dinfo->file, dinfo->bdrv_flags, dinfo->drv); + int res = bdrv_open(dinfo->bdrv, dinfo->file, + dinfo->bdrv_flags | extra_flags, dinfo->drv); if (res < 0) { fprintf(stderr, "qemu: could not open disk image %s: %s\n", @@ -156,7 +157,7 @@ int drives_reinit(void) if (dinfo->opened && !bdrv_is_read_only(dinfo->bdrv)) { int res; bdrv_close(dinfo->bdrv); - res = drive_open(dinfo); + res = drive_open(dinfo, BDRV_O_INVALIDATE); if (res) { fprintf(stderr, "qemu: re-open of %s failed wth error %d\n", dinfo->file, res); @@ -522,7 +523,7 @@ DriveInfo *drive_init(QemuOpts *opts, int default_to_scsi, int *fatal_error) dinfo->drv = drv; dinfo->opened = 1; - if (drive_open(dinfo) < 0) { + if (drive_open(dinfo, 0) < 0) { goto error; }