virtlockd in libvirt locks the first byte, we lock byte 1 to avoid
the intervene.
Suggested-by: "Daniel P. Berrange" <address@hidden>
Signed-off-by: Fam Zheng <address@hidden>
---
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,
};