virtlockd in libvirt locks the first byte, we lock byte 1 to avoid the intervene.
Suggested-by: "Daniel P. Berrange" <berra...@redhat.com> Signed-off-by: Fam Zheng <f...@redhat.com> --- block/raw-posix.c | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/block/raw-posix.c b/block/raw-posix.c index 906d5c9..3a2c17f 100644 --- a/block/raw-posix.c +++ b/block/raw-posix.c @@ -35,6 +35,7 @@ #include "raw-aio.h" #include "qapi/util.h" #include "qapi/qmp/qstring.h" +#include "glib.h" #if defined(__APPLE__) && (__MACH__) #include <paths.h> @@ -397,6 +398,38 @@ static void raw_attach_aio_context(BlockDriverState *bs, #endif } +static int raw_lockf(BlockDriverState *bs, BdrvLockfCmd cmd) +{ + + BDRVRawState *s = bs->opaque; + int ret; + struct flock fl = (struct flock) { + .l_whence = SEEK_SET, + /* Locking byte 1 avoids interfereing with virtlockd. */ + .l_start = 1, + .l_len = 1, + }; + + switch (cmd) { + case BDRV_LOCKF_RWLOCK: + fl.l_type = F_WRLCK; + break; + case BDRV_LOCKF_ROLOCK: + fl.l_type = F_RDLCK; + break; + case BDRV_LOCKF_UNLOCK: + fl.l_type = F_UNLCK; + break; + default: + abort(); + } + ret = fcntl(s->fd, F_SETLK, &fl); + if (ret) { + ret = -errno; + } + return ret; +} + #ifdef CONFIG_LINUX_AIO static int raw_set_aio(void **aio_ctx, int *use_aio, int bdrv_flags) { @@ -1960,6 +1993,8 @@ BlockDriver bdrv_file = { .bdrv_detach_aio_context = raw_detach_aio_context, .bdrv_attach_aio_context = raw_attach_aio_context, + .bdrv_lockf = raw_lockf, + .create_opts = &raw_create_opts, }; -- 2.8.0