lock-util: make global lock return parameter to image_path_lock() optional
When adding unprivileged nspawn support we don't really want a global lock file, since we cannot even access the dir they are stored in, hence make the concept optional. Some minor other modernizations.
This commit is contained in:
@@ -17,7 +17,7 @@ static inline int make_lock_file(const char *p, int operation, LockFile *ret) {
|
||||
int make_lock_file_for(const char *p, int operation, LockFile *ret);
|
||||
void release_lock_file(LockFile *f);
|
||||
|
||||
#define LOCK_FILE_INIT { .dir_fd = -EBADF, .fd = -EBADF }
|
||||
#define LOCK_FILE_INIT (LockFile) { .dir_fd = -EBADF, .fd = -EBADF }
|
||||
|
||||
/* POSIX locks with the same interface as flock(). */
|
||||
int posix_lock(int fd, int operation);
|
||||
|
||||
+28
-18
@@ -1295,7 +1295,12 @@ static void make_lock_dir(void) {
|
||||
(void) mkdir("/run/systemd/nspawn/locks", 0700);
|
||||
}
|
||||
|
||||
int image_path_lock(const char *path, int operation, LockFile *global, LockFile *local) {
|
||||
int image_path_lock(
|
||||
const char *path,
|
||||
int operation,
|
||||
LockFile *ret_global,
|
||||
LockFile *ret_local) {
|
||||
|
||||
_cleanup_free_ char *p = NULL;
|
||||
LockFile t = LOCK_FILE_INIT;
|
||||
struct stat st;
|
||||
@@ -1303,8 +1308,7 @@ int image_path_lock(const char *path, int operation, LockFile *global, LockFile
|
||||
int r;
|
||||
|
||||
assert(path);
|
||||
assert(global);
|
||||
assert(local);
|
||||
assert(ret_local);
|
||||
|
||||
/* Locks an image path. This actually creates two locks: one "local" one, next to the image path
|
||||
* itself, which might be shared via NFS. And another "global" one, in /run, that uses the
|
||||
@@ -1326,7 +1330,9 @@ int image_path_lock(const char *path, int operation, LockFile *global, LockFile
|
||||
}
|
||||
|
||||
if (getenv_bool("SYSTEMD_NSPAWN_LOCK") == 0) {
|
||||
*local = *global = (LockFile) LOCK_FILE_INIT;
|
||||
*ret_local = LOCK_FILE_INIT;
|
||||
if (ret_global)
|
||||
*ret_global = LOCK_FILE_INIT;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1342,19 +1348,23 @@ int image_path_lock(const char *path, int operation, LockFile *global, LockFile
|
||||
if (exclusive)
|
||||
return -EBUSY;
|
||||
|
||||
*local = *global = (LockFile) LOCK_FILE_INIT;
|
||||
*ret_local = LOCK_FILE_INIT;
|
||||
if (ret_global)
|
||||
*ret_global = LOCK_FILE_INIT;
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (stat(path, &st) >= 0) {
|
||||
if (S_ISBLK(st.st_mode))
|
||||
r = asprintf(&p, "/run/systemd/nspawn/locks/block-%u:%u", major(st.st_rdev), minor(st.st_rdev));
|
||||
else if (S_ISDIR(st.st_mode) || S_ISREG(st.st_mode))
|
||||
r = asprintf(&p, "/run/systemd/nspawn/locks/inode-%lu:%lu", (unsigned long) st.st_dev, (unsigned long) st.st_ino);
|
||||
else
|
||||
return -ENOTTY;
|
||||
if (r < 0)
|
||||
return -ENOMEM;
|
||||
if (ret_global) {
|
||||
if (stat(path, &st) >= 0) {
|
||||
if (S_ISBLK(st.st_mode))
|
||||
r = asprintf(&p, "/run/systemd/nspawn/locks/block-%u:%u", major(st.st_rdev), minor(st.st_rdev));
|
||||
else if (S_ISDIR(st.st_mode) || S_ISREG(st.st_mode))
|
||||
r = asprintf(&p, "/run/systemd/nspawn/locks/inode-%lu:%lu", (unsigned long) st.st_dev, (unsigned long) st.st_ino);
|
||||
else
|
||||
return -ENOTTY;
|
||||
if (r < 0)
|
||||
return -ENOMEM;
|
||||
}
|
||||
}
|
||||
|
||||
/* For block devices we don't need the "local" lock, as the major/minor lock above should be
|
||||
@@ -1372,15 +1382,15 @@ int image_path_lock(const char *path, int operation, LockFile *global, LockFile
|
||||
if (p) {
|
||||
make_lock_dir();
|
||||
|
||||
r = make_lock_file(p, operation, global);
|
||||
r = make_lock_file(p, operation, ret_global);
|
||||
if (r < 0) {
|
||||
release_lock_file(&t);
|
||||
return r;
|
||||
}
|
||||
} else
|
||||
*global = (LockFile) LOCK_FILE_INIT;
|
||||
} else if (ret_global)
|
||||
*ret_global = LOCK_FILE_INIT;
|
||||
|
||||
*local = t;
|
||||
*ret_local = t;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user