[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-block] [PATCH 01/14] osdep: Add qemu_lock_fd and qemu_unlock_f
From: |
Fam Zheng |
Subject: |
Re: [Qemu-block] [PATCH 01/14] osdep: Add qemu_lock_fd and qemu_unlock_fd |
Date: |
Thu, 8 Dec 2016 14:53:32 +0800 |
User-agent: |
Mutt/1.7.1 (2016-10-04) |
On Fri, 12/02 01:30, Max Reitz wrote:
> On 31.10.2016 16:38, Fam Zheng wrote:
> > They are wrappers of POSIX fcntl "file private locking".
> >
> > Signed-off-by: Fam Zheng <address@hidden>
> > ---
> > include/qemu/osdep.h | 2 ++
> > util/osdep.c | 29 +++++++++++++++++++++++++++++
> > 2 files changed, 31 insertions(+)
> >
> > diff --git a/include/qemu/osdep.h b/include/qemu/osdep.h
> > index 0e3c330..f15e122 100644
> > --- a/include/qemu/osdep.h
> > +++ b/include/qemu/osdep.h
> > @@ -294,6 +294,8 @@ 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);
> >
> > #if defined(__HAIKU__) && defined(__i386__)
> > #define FMT_pid "%ld"
> > diff --git a/util/osdep.c b/util/osdep.c
> > index 06fb1cf..b85a490 100644
> > --- a/util/osdep.c
> > +++ b/util/osdep.c
> > @@ -140,6 +140,35 @@ 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,
> > + };
> > + do {
> > + ret = fcntl(fd, F_OFD_SETLK, &fl);
> > + } while (ret == -1 && errno == EINTR);
>
> As I've asked in the last version: Can EINTR happen at all? My man page
> tells me it's possible only with F(_OFD)_SETLKW.
I think you are right, let's drop the condition.
Fam
>
> Max
>
> > + 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);
> > +}
> > #endif
> >
> > /*
> >
>
>