mirror of
https://git.proxmox.com/git/mirror_lxc
synced 2025-07-31 08:43:14 +00:00
lxclock: use thread-safe *_OFD_* fcntl() locks
If they aren't available fallback to BSD flock()s. Closes #2245. Signed-off-by: Christian Brauner <christian.brauner@ubuntu.com>
This commit is contained in:
parent
16c92537a5
commit
b19aabf5be
@ -55,7 +55,7 @@ static inline void dump_stacktrace(void)
|
||||
strings = backtrace_symbols(array, size);
|
||||
|
||||
/* Using fprintf here as our logging module is not thread safe. */
|
||||
fprintf(stderr, "\tObtained %zu stack frames.\n", size);
|
||||
fprintf(stderr, "\tObtained %zu stack frames\n", size);
|
||||
|
||||
for (i = 0; i < size; i++)
|
||||
fprintf(stderr, "\t\t%s\n", strings[i]);
|
||||
@ -195,7 +195,7 @@ int lxclock(struct lxc_lock *l, int timeout)
|
||||
case LXC_LOCK_ANON_SEM:
|
||||
if (!timeout) {
|
||||
ret = sem_wait(l->u.sem);
|
||||
if (ret == -1)
|
||||
if (ret < 0)
|
||||
saved_errno = errno;
|
||||
} else {
|
||||
struct timespec ts;
|
||||
@ -205,7 +205,7 @@ int lxclock(struct lxc_lock *l, int timeout)
|
||||
}
|
||||
ts.tv_sec += timeout;
|
||||
ret = sem_timedwait(l->u.sem, &ts);
|
||||
if (ret == -1)
|
||||
if (ret < 0)
|
||||
saved_errno = errno;
|
||||
}
|
||||
break;
|
||||
@ -220,21 +220,22 @@ int lxclock(struct lxc_lock *l, int timeout)
|
||||
goto out;
|
||||
}
|
||||
if (l->u.f.fd == -1) {
|
||||
l->u.f.fd = open(l->u.f.fname, O_RDWR|O_CREAT,
|
||||
S_IWUSR | S_IRUSR);
|
||||
l->u.f.fd = open(l->u.f.fname, O_CREAT | O_RDWR | O_NOFOLLOW | O_CLOEXEC | O_NOCTTY, S_IWUSR | S_IRUSR);
|
||||
if (l->u.f.fd == -1) {
|
||||
ERROR("Error opening %s", l->u.f.fname);
|
||||
saved_errno = errno;
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
memset(&lk, 0, sizeof(struct flock));
|
||||
lk.l_type = F_WRLCK;
|
||||
lk.l_whence = SEEK_SET;
|
||||
lk.l_start = 0;
|
||||
lk.l_len = 0;
|
||||
ret = fcntl(l->u.f.fd, F_SETLKW, &lk);
|
||||
if (ret == -1)
|
||||
ret = fcntl(l->u.f.fd, F_OFD_SETLKW, &lk);
|
||||
if (ret < 0) {
|
||||
if (errno == EINVAL)
|
||||
ret = flock(l->u.f.fd, LOCK_EX);
|
||||
saved_errno = errno;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
@ -259,13 +260,15 @@ int lxcunlock(struct lxc_lock *l)
|
||||
break;
|
||||
case LXC_LOCK_FLOCK:
|
||||
if (l->u.f.fd != -1) {
|
||||
memset(&lk, 0, sizeof(struct flock));
|
||||
lk.l_type = F_UNLCK;
|
||||
lk.l_whence = SEEK_SET;
|
||||
lk.l_start = 0;
|
||||
lk.l_len = 0;
|
||||
ret = fcntl(l->u.f.fd, F_SETLK, &lk);
|
||||
if (ret < 0)
|
||||
ret = fcntl(l->u.f.fd, F_OFD_SETLK, &lk);
|
||||
if (ret < 0) {
|
||||
if (errno == EINVAL)
|
||||
ret = flock(l->u.f.fd, LOCK_EX | LOCK_NB);
|
||||
saved_errno = errno;
|
||||
}
|
||||
close(l->u.f.fd);
|
||||
l->u.f.fd = -1;
|
||||
} else
|
||||
|
@ -23,12 +23,25 @@
|
||||
#ifndef __LXC_LXCLOCK_H
|
||||
#define __LXC_LXCLOCK_H
|
||||
|
||||
#include <fcntl.h> /* For O_* constants */
|
||||
#include <sys/stat.h> /* For mode constants */
|
||||
#include <sys/file.h>
|
||||
#include <fcntl.h>
|
||||
#include <semaphore.h>
|
||||
#include <string.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/file.h>
|
||||
#include <time.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#ifndef F_OFD_GETLK
|
||||
#define F_OFD_GETLK 36
|
||||
#endif
|
||||
|
||||
#ifndef F_OFD_SETLK
|
||||
#define F_OFD_SETLK 37
|
||||
#endif
|
||||
|
||||
#ifndef F_OFD_SETLKW
|
||||
#define F_OFD_SETLKW 38
|
||||
#endif
|
||||
|
||||
#define LXC_LOCK_ANON_SEM 1 /*!< Anonymous semaphore lock */
|
||||
#define LXC_LOCK_FLOCK 2 /*!< flock(2) lock */
|
||||
|
Loading…
Reference in New Issue
Block a user