From: Fam Zheng <famz@redhat.com>
To: qemu-devel@nongnu.org
Cc: qemu-block@nongnu.org, Kevin Wolf <kwolf@redhat.com>,
rjones@redhat.com, Max Reitz <mreitz@redhat.com>,
"Daniel P. Berrange" <berrange@redhat.com>,
eblake@redhat.com
Subject: [Qemu-devel] [PATCH v11 01/16] osdep: Add qemu_lock_fd and qemu_unlock_fd
Date: Fri, 20 Jan 2017 15:22:55 +0800 [thread overview]
Message-ID: <20170120072310.8009-2-famz@redhat.com> (raw)
In-Reply-To: <20170120072310.8009-1-famz@redhat.com>
They are wrappers of POSIX fcntl "file private locking", with a
convenient "try lock" wrapper implemented with F_OFD_GETLK.
Signed-off-by: Fam Zheng <famz@redhat.com>
---
include/qemu/osdep.h | 3 +++
util/osdep.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 51 insertions(+)
diff --git a/include/qemu/osdep.h b/include/qemu/osdep.h
index 689f253..e864fe8 100644
--- a/include/qemu/osdep.h
+++ b/include/qemu/osdep.h
@@ -297,6 +297,9 @@ int qemu_close(int fd);
#ifndef _WIN32
int qemu_dup(int fd);
#endif
+int qemu_lock_fd(int fd, int64_t start, int64_t len, bool exclusive);
+int qemu_unlock_fd(int fd, int64_t start, int64_t len);
+int qemu_lock_fd_test(int fd, int64_t start, int64_t len, bool exclusive);
#if defined(__HAIKU__) && defined(__i386__)
#define FMT_pid "%ld"
diff --git a/util/osdep.c b/util/osdep.c
index 06fb1cf..3de4a18 100644
--- a/util/osdep.c
+++ b/util/osdep.c
@@ -140,6 +140,54 @@ static int qemu_parse_fdset(const char *param)
{
return qemu_parse_fd(param);
}
+
+static int qemu_lock_fcntl(int fd, int64_t start, int64_t len, int fl_type)
+{
+#ifdef F_OFD_SETLK
+ int ret;
+ struct flock fl = {
+ .l_whence = SEEK_SET,
+ .l_start = start,
+ .l_len = len,
+ .l_type = fl_type,
+ };
+ ret = fcntl(fd, F_OFD_SETLK, &fl);
+ return ret == -1 ? -errno : 0;
+#else
+ return -ENOTSUP;
+#endif
+}
+
+int qemu_lock_fd(int fd, int64_t start, int64_t len, bool exclusive)
+{
+ return qemu_lock_fcntl(fd, start, len, exclusive ? F_WRLCK : F_RDLCK);
+}
+
+int qemu_unlock_fd(int fd, int64_t start, int64_t len)
+{
+ return qemu_lock_fcntl(fd, start, len, F_UNLCK);
+}
+
+int qemu_lock_fd_test(int fd, int64_t start, int64_t len, bool exclusive)
+{
+#ifdef F_OFD_SETLK
+ int ret;
+ struct flock fl = {
+ .l_whence = SEEK_SET,
+ .l_start = start,
+ .l_len = len,
+ .l_type = exclusive ? F_WRLCK : F_RDLCK,
+ };
+ ret = fcntl(fd, F_OFD_GETLK, &fl);
+ if (ret == -1) {
+ return -errno;
+ } else {
+ return fl.l_type == F_UNLCK ? 0 : -EAGAIN;
+ }
+#else
+ return -ENOTSUP;
+#endif
+}
#endif
/*
--
2.9.3
next prev parent reply other threads:[~2017-01-20 7:23 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-01-20 7:22 [Qemu-devel] [PATCH v11 00/16] block: Image locking series Fam Zheng
2017-01-20 7:22 ` Fam Zheng [this message]
2017-01-20 7:22 ` [Qemu-devel] [PATCH v11 02/16] block: Define BDRV_O_SHARE_RW Fam Zheng
2017-01-20 7:22 ` [Qemu-devel] [PATCH v11 03/16] qemu-io: Set "share-rw" flag together with read-only Fam Zheng
2017-01-20 7:22 ` [Qemu-devel] [PATCH v11 04/16] qemu-img: Set "share-rw" flag in read-only commands Fam Zheng
2017-01-20 7:22 ` [Qemu-devel] [PATCH v11 05/16] block: Set "share-rw" flag in drive-backup when sync=none Fam Zheng
2017-01-20 7:23 ` [Qemu-devel] [PATCH v11 06/16] iotests: 055: Don't attach the drive to vm for drive-backup Fam Zheng
2017-01-20 7:23 ` [Qemu-devel] [PATCH v11 07/16] iotests: 030: Read-only open image for getting map Fam Zheng
2017-01-20 7:23 ` [Qemu-devel] [PATCH v11 08/16] iotests: 087: Don't attach test image twice Fam Zheng
2017-01-20 7:23 ` [Qemu-devel] [PATCH v11 09/16] iotests: 085: Avoid image locking conflict Fam Zheng
2017-01-20 7:23 ` [Qemu-devel] [PATCH v11 10/16] iotests: 091: Quit QEMU before checking image Fam Zheng
2017-01-20 7:23 ` [Qemu-devel] [PATCH v11 11/16] iotests: 172: Use separate images for multiple devices Fam Zheng
2017-01-20 7:23 ` [Qemu-devel] [PATCH v11 12/16] tests: Use null-co:// instead of /dev/null as the dummy image Fam Zheng
2017-01-20 7:23 ` [Qemu-devel] [PATCH v11 13/16] tests: Disable image lock in test-replication Fam Zheng
2017-01-20 7:23 ` [Qemu-devel] [PATCH v11 14/16] file-posix: Implement image locking Fam Zheng
2017-01-20 7:23 ` [Qemu-devel] [PATCH v11 15/16] qcow2: Force "no other writer" lock on bs->file Fam Zheng
2017-01-20 7:23 ` [Qemu-devel] [PATCH v11 16/16] tests: Add test-image-lock Fam Zheng
2017-01-20 14:59 ` [Qemu-devel] [PATCH v11 00/16] block: Image locking series no-reply
2017-01-20 16:46 ` Fam Zheng
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20170120072310.8009-2-famz@redhat.com \
--to=famz@redhat.com \
--cc=berrange@redhat.com \
--cc=eblake@redhat.com \
--cc=kwolf@redhat.com \
--cc=mreitz@redhat.com \
--cc=qemu-block@nongnu.org \
--cc=qemu-devel@nongnu.org \
--cc=rjones@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.