create a new lxc_check_lock function

added in src/lock.c to replace call to lxc_get_lock and lxc_put_lock,
when only need to check if container is active or not.

Signed-off-by: Michel Normand <normand@fr.ibm.com>
Signed-off-by: Daniel Lezcano <dlezcano@fr.ibm.com>
This commit is contained in:
Michel Normand 2009-05-17 13:43:51 +02:00 committed by Daniel Lezcano
parent d737c07495
commit 305dbab7e6
5 changed files with 48 additions and 36 deletions

View File

@ -51,18 +51,13 @@ int lxc_checkpoint(const char *name, const char *statefile,
{ {
char init[MAXPATHLEN]; char init[MAXPATHLEN];
char val[MAXPIDLEN]; char val[MAXPIDLEN];
int fd, lock, ret = -1; int fd, ret = -1;
size_t pid; size_t pid;
lock = lxc_get_lock(name); if (lxc_check_lock(name) < 0) {
if (lock >= 0) { return -1;
lxc_put_lock(lock);
return -LXC_ERROR_ESRCH;
} }
if (lock < 0 && lock != -LXC_ERROR_EBUSY)
return lock;
snprintf(init, MAXPATHLEN, LXCPATH "/%s/init", name); snprintf(init, MAXPATHLEN, LXCPATH "/%s/init", name);
fd = open(init, O_RDONLY); fd = open(init, O_RDONLY);
if (fd < 0) { if (fd < 0) {

View File

@ -33,7 +33,9 @@
#include "error.h" #include "error.h"
#include <lxc/lxc.h> #include <lxc/lxc.h>
int lxc_get_lock(const char *name) lxc_log_define(lxc_lock, lxc);
static int __lxc_get_lock(const char *name)
{ {
char lock[MAXPATHLEN]; char lock[MAXPATHLEN];
int fd, ret; int fd, ret;
@ -41,31 +43,37 @@ int lxc_get_lock(const char *name)
snprintf(lock, MAXPATHLEN, LXCPATH "/%s", name); snprintf(lock, MAXPATHLEN, LXCPATH "/%s", name);
/* need to check access because of cap_dac_override */ /* need to check access because of cap_dac_override */
if (access(lock, R_OK |W_OK | X_OK)) { if (access(lock, R_OK |W_OK | X_OK))
ret = errno; return -errno;
goto out_err;
}
fd = open(lock, O_RDONLY|O_DIRECTORY, S_IRUSR|S_IWUSR); fd = open(lock, O_RDONLY|O_DIRECTORY, S_IRUSR|S_IWUSR);
if (fd < 0) { if (fd < 0)
ret = errno; return -errno;
goto out_err;
}
fcntl(fd, F_SETFD, FD_CLOEXEC); fcntl(fd, F_SETFD, FD_CLOEXEC);
if (flock(fd, LOCK_EX|LOCK_NB)) { if (flock(fd, LOCK_EX|LOCK_NB)) {
ret = errno; ret = -errno;
close(fd); close(fd);
goto out_err; goto out;
} }
ret = fd; ret = fd;
out: out:
return ret; return ret;
}
int lxc_get_lock(const char *name)
{
int ret;
ret = __lxc_get_lock(name);
if (ret < 0)
goto out_err;
out:
return ret;
out_err: out_err:
switch (ret) { switch (-ret) {
case EWOULDBLOCK: case EWOULDBLOCK:
ret = -LXC_ERROR_EBUSY; ret = -LXC_ERROR_EBUSY;
goto out; goto out;
@ -81,6 +89,23 @@ out_err:
} }
} }
int lxc_check_lock(const char *name)
{
int ret;
ret = __lxc_get_lock(name);
if (ret >= 0) {
ERROR("container '%s' is not active", name);
lxc_put_lock(ret);
return -1;
}
if (ret != -EWOULDBLOCK) {
ERROR("container '%s' : %s", name, strerror(-ret));
return -1;
}
return 0;
}
void lxc_put_lock(int lock) void lxc_put_lock(int lock)
{ {
flock(lock, LOCK_UN); flock(lock, LOCK_UN);

View File

@ -24,7 +24,7 @@
#define _lock_h #define _lock_h
extern int lxc_get_lock(const char *name); extern int lxc_get_lock(const char *name);
extern int lxc_check_lock(const char *name);
extern void lxc_put_lock(int lock); extern void lxc_put_lock(int lock);
#endif #endif

View File

@ -65,10 +65,8 @@ int main(int argc, char *argv[])
return 1; return 1;
err = lxc_stop(name); err = lxc_stop(name);
if (err) { if (err)
fprintf(stderr, "%s\n", lxc_strerror(err));
return 1; return 1;
}
return 0; return 0;
} }

View File

@ -42,17 +42,11 @@ int lxc_stop(const char *name)
{ {
char init[MAXPATHLEN]; char init[MAXPATHLEN];
char val[MAXPIDLEN]; char val[MAXPIDLEN];
int fd, lock, ret = -LXC_ERROR_INTERNAL; int fd, ret = -LXC_ERROR_INTERNAL;
size_t pid; size_t pid;
lock = lxc_get_lock(name); if (lxc_check_lock(name) < 0)
if (lock >= 0) { return ret;
lxc_put_lock(lock);
return -LXC_ERROR_ESRCH;
}
if (lock < 0 && lock != -LXC_ERROR_EBUSY)
return lock;
snprintf(init, MAXPATHLEN, LXCPATH "/%s/init", name); snprintf(init, MAXPATHLEN, LXCPATH "/%s/init", name);
fd = open(init, O_RDONLY); fd = open(init, O_RDONLY);