]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
lock-file: various updates 25828/head
authorLennart Poettering <lennart@poettering.net>
Thu, 22 Dec 2022 09:56:56 +0000 (10:56 +0100)
committerLennart Poettering <lennart@poettering.net>
Fri, 23 Dec 2022 16:35:21 +0000 (17:35 +0100)
src/shared/lockfile-util.c

index 5bbccead7f656adda3e6d8bb3bae80a5c00acf72..df099d7d05e33ccb38184dc051163527c88f2206 100644 (file)
@@ -20,15 +20,15 @@ int make_lock_file(const char *p, int operation, LockFile *ret) {
         _cleanup_free_ char *t = NULL;
         int r;
 
+        assert(p);
+        assert(ret);
+
         /*
-         * We use UNPOSIX locks if they are available. They have nice
-         * semantics, and are mostly compatible with NFS. However,
-         * they are only available on new kernels. When we detect we
-         * are running on an older kernel, then we fall back to good
-         * old BSD locks. They also have nice semantics, but are
-         * slightly problematic on NFS, where they are upgraded to
-         * POSIX locks, even though locally they are orthogonal to
-         * POSIX locks.
+         * We use UNPOSIX locks if they are available. They have nice semantics, and are mostly compatible
+         * with NFS. However, they are only available on new kernels. When we detect we are running on an
+         * older kernel, then we fall back to good old BSD locks. They also have nice semantics, but are
+         * slightly problematic on NFS, where they are upgraded to POSIX locks, even though locally they are
+         * orthogonal to POSIX locks.
          */
 
         t = strdup(p);
@@ -48,23 +48,18 @@ int make_lock_file(const char *p, int operation, LockFile *ret) {
 
                 r = fcntl(fd, (operation & LOCK_NB) ? F_OFD_SETLK : F_OFD_SETLKW, &fl);
                 if (r < 0) {
-
                         /* If the kernel is too old, use good old BSD locks */
-                        if (errno == EINVAL)
+                        if (errno == EINVAL || ERRNO_IS_NOT_SUPPORTED(errno))
                                 r = flock(fd, operation);
-
                         if (r < 0)
                                 return errno == EAGAIN ? -EBUSY : -errno;
                 }
 
-                /* If we acquired the lock, let's check if the file
-                 * still exists in the file system. If not, then the
-                 * previous exclusive owner removed it and then closed
-                 * it. In such a case our acquired lock is worthless,
-                 * hence try again. */
+                /* If we acquired the lock, let's check if the file still exists in the file system. If not,
+                 * then the previous exclusive owner removed it and then closed it. In such a case our
+                 * acquired lock is worthless, hence try again. */
 
-                r = fstat(fd, &st);
-                if (r < 0)
+                if (fstat(fd, &st) < 0)
                         return -errno;
                 if (st.st_nlink > 0)
                         break;
@@ -72,12 +67,11 @@ int make_lock_file(const char *p, int operation, LockFile *ret) {
                 fd = safe_close(fd);
         }
 
-        ret->path = t;
-        ret->fd = fd;
-        ret->operation = operation;
-
-        fd = -EBADF;
-        t = NULL;
+        *ret = (LockFile) {
+                .path = TAKE_PTR(t),
+                .fd = TAKE_FD(fd),
+                .operation = operation,
+        };
 
         return r;
 }
@@ -124,7 +118,7 @@ void release_lock_file(LockFile *f) {
                         };
 
                         r = fcntl(f->fd, F_OFD_SETLK, &fl);
-                        if (r < 0 && errno == EINVAL)
+                        if (r < 0 && (errno == EINVAL || ERRNO_IS_NOT_SUPPORTED(errno)))
                                 r = flock(f->fd, LOCK_EX|LOCK_NB);
 
                         if (r >= 0)