From patchwork Wed Dec 23 07:46:53 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Denis V. Lunev" X-Patchwork-Id: 560381 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 51062140BC1 for ; Wed, 23 Dec 2015 18:49:58 +1100 (AEDT) Received: from localhost ([::1]:54744 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aBeBI-0000jT-D2 for incoming@patchwork.ozlabs.org; Wed, 23 Dec 2015 02:49:56 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:39697) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aBe8i-0004KS-Ep for qemu-devel@nongnu.org; Wed, 23 Dec 2015 02:47:17 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1aBe8h-0006lV-7d for qemu-devel@nongnu.org; Wed, 23 Dec 2015 02:47:16 -0500 Received: from mailhub.sw.ru ([195.214.232.25]:17753 helo=relay.sw.ru) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aBe8g-0006kd-Rf for qemu-devel@nongnu.org; Wed, 23 Dec 2015 02:47:15 -0500 Received: from irbis.sw.ru ([10.30.2.139]) by relay.sw.ru (8.13.4/8.13.4) with ESMTP id tBN7kuRb003382; Wed, 23 Dec 2015 10:47:01 +0300 (MSK) From: "Denis V. Lunev" To: Date: Wed, 23 Dec 2015 10:46:53 +0300 Message-Id: <1450856816-9816-3-git-send-email-den@openvz.org> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1450856816-9816-1-git-send-email-den@openvz.org> References: <567A4EB0.1040807@parallels.com> <1450856816-9816-1-git-send-email-den@openvz.org> X-detected-operating-system: by eggs.gnu.org: OpenBSD 3.x X-Received-From: 195.214.232.25 Cc: Kevin Wolf , Fam Zheng , qemu-devel@nongnu.org, Max Reitz , Olga Krishtal , "Denis V. Lunev" Subject: [Qemu-devel] [PATCH 2/5] block: implemented bdrv_lock_image for raw file X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org From: Olga Krishtal To lock the image file flock (LockFileEx) is used. We lock file handle/descriptor. If lock is failed - an error is returned. In win32 realization we can lock reagion of bytes within the file. For this reason we at first have to get file size and only than lock it. Signed-off-by: Olga Krishtal Signed-off-by: Denis V. Lunev CC: Kevin Wolf CC: Max Reitz CC: Eric Blake CC: Fam Zheng --- block/raw-posix.c | 15 +++++++++++++++ block/raw-win32.c | 19 +++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/block/raw-posix.c b/block/raw-posix.c index 076d070..6226a5c 100644 --- a/block/raw-posix.c +++ b/block/raw-posix.c @@ -33,6 +33,7 @@ #include "raw-aio.h" #include "qapi/util.h" #include "qapi/qmp/qstring.h" +#include #if defined(__APPLE__) && (__MACH__) #include @@ -576,6 +577,19 @@ fail: return ret; } +static int raw_lock_image(BlockDriverState *bs, BdrvLockImage lock) +{ + int ret; + if (lock != BDRV_LOCK_IMAGE_LOCKFILE) { + return -ENOTSUP; + } + ret = flock(((BDRVRawState *)(bs->opaque))->fd, LOCK_EX|LOCK_NB); + if (ret != 0) { + return -ret; + } + return ret; +} + static int raw_open(BlockDriverState *bs, QDict *options, int flags, Error **errp) { @@ -1946,6 +1960,7 @@ BlockDriver bdrv_file = { .bdrv_co_get_block_status = raw_co_get_block_status, .bdrv_co_write_zeroes = raw_co_write_zeroes, + .bdrv_lock_image = raw_lock_image, .bdrv_aio_readv = raw_aio_readv, .bdrv_aio_writev = raw_aio_writev, .bdrv_aio_flush = raw_aio_flush, diff --git a/block/raw-win32.c b/block/raw-win32.c index 2d0907a..d05160a 100644 --- a/block/raw-win32.c +++ b/block/raw-win32.c @@ -370,6 +370,24 @@ fail: return ret; } +static int raw_lock_image(BlockDriverState *bs, BdrvLockImage lock) +{ + DWORD size_high = 0, size_low = 0; + BDRVRawState *s = bs->opaque; + if (lock != BDRV_LOCK_IMAGE_LOCKFILE) { + return -ENOTSUP; + } + size_low = GetFileSize(s->hfile, &size_high); + if (GetLastError() != 0) { + return -EINVAL; + } + if (!LockFileEx(s->hfile, LOCKFILE_EXCLUSIVE_LOCK|LOCKFILE_FAIL_IMMEDIATELY, + 0, size_high, size_low, NULL)) { + return -EINVAL; + } + return 0; +} + static BlockAIOCB *raw_aio_readv(BlockDriverState *bs, int64_t sector_num, QEMUIOVector *qiov, int nb_sectors, BlockCompletionFunc *cb, void *opaque) @@ -552,6 +570,7 @@ BlockDriver bdrv_file = { .bdrv_create = raw_create, .bdrv_has_zero_init = bdrv_has_zero_init_1, + .bdrv_lock_image = raw_lock_image, .bdrv_aio_readv = raw_aio_readv, .bdrv_aio_writev = raw_aio_writev, .bdrv_aio_flush = raw_aio_flush,