@@ -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,23 @@ static void raw_attach_aio_context(BlockDriverState *bs,
#endif
}
+static int raw_lockf(BlockDriverState *bs, BdrvLockfCmd cmd)
+{
+
+ BDRVRawState *s = bs->opaque;
+
+ switch (cmd) {
+ case BDRV_LOCKF_RWLOCK:
+ return qemu_lock_fd(s->fd, 1, 1, false);
+ case BDRV_LOCKF_ROLOCK:
+ return qemu_lock_fd(s->fd, 1, 1, true);
+ case BDRV_LOCKF_UNLOCK:
+ return qemu_unlock_fd(s->fd, 1, 1);
+ default:
+ abort();
+ }
+}
+
#ifdef CONFIG_LINUX_AIO
static int raw_set_aio(void **aio_ctx, int *use_aio, int bdrv_flags)
{
@@ -1952,6 +1970,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,
};
@@ -2407,6 +2427,8 @@ static BlockDriver bdrv_host_device = {
#ifdef __linux__
.bdrv_aio_ioctl = hdev_aio_ioctl,
#endif
+
+ .bdrv_lockf = raw_lockf,
};
#if defined(__linux__) || defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
virtlockd in libvirt locks the first byte, we lock byte 1 to avoid the intervene. Both file and host device protocols are covered. Suggested-by: "Daniel P. Berrange" <berrange@redhat.com> Signed-off-by: Fam Zheng <famz@redhat.com> --- block/raw-posix.c | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+)