From mboxrd@z Thu Jan 1 00:00:00 1970 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 From: "Denis V. Lunev" Date: Wed, 23 Dec 2015 10:46:53 +0300 Message-Id: <1450856816-9816-3-git-send-email-den@openvz.org> 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> Subject: [Qemu-devel] [PATCH 2/5] block: implemented bdrv_lock_image for raw file List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Kevin Wolf , Fam Zheng , qemu-devel@nongnu.org, Max Reitz , Olga Krishtal , "Denis V. Lunev" 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, -- 2.1.4