]> sourceware.org Git - lvm2.git/commitdiff
Fix dm_create_lockfile error paths - incorrectly unlinked in-use lockfile.
authorAlasdair Kergon <agk@redhat.com>
Tue, 27 Jul 2010 21:56:14 +0000 (21:56 +0000)
committerAlasdair Kergon <agk@redhat.com>
Tue, 27 Jul 2010 21:56:14 +0000 (21:56 +0000)
(Jan Friesse)

libdm/libdm-file.c

index 8dbf099c4985457b9199ab2657a1efd8a5f4fc04..b72b2abe0eed0adf79ea67b47eae1619e6431ff3 100644 (file)
@@ -104,21 +104,29 @@ int dm_create_lockfile(const char *lockfile)
        lock.l_start = 0;
        lock.l_whence = SEEK_SET;
        lock.l_len = 0;
+retry_fcntl:
        if (fcntl(fd, F_SETLK, &lock) < 0) {
-               if (errno != EACCES && errno != EAGAIN)
+               switch (errno) {
+               case EINTR:
+                       goto retry_fcntl;
+                       break;
+               case EACCES:
+               case EAGAIN:
                        log_error("Cannot lock lockfile [%s], error was [%s]",
                                   lockfile, strerror(errno));
-               else
+                       break;
+               default:
                        log_error("process is already running");
+               }
 
-               goto fail;
+               goto fail_close;
        }
 
        if (ftruncate(fd, 0) < 0) {
                log_error("Cannot truncate pidfile [%s], error was [%s]",
                          lockfile, strerror(errno));
 
-               goto fail;
+               goto fail_close_unlink;
        }
 
        memset(buffer, 0, sizeof(buffer));
@@ -131,7 +139,7 @@ int dm_create_lockfile(const char *lockfile)
                log_error("Cannot write pid to pidfile [%s], error was [%s]",
                          lockfile, strerror(errno));
 
-               goto fail;
+               goto fail_close_unlink;
        }
 
        if ((write_out == 0) || (write_out < bufferlen)) {
@@ -139,30 +147,31 @@ int dm_create_lockfile(const char *lockfile)
                          "[%" PRIsize_t "] bytes, expected [%" PRIsize_t "]\n",
                          lockfile, write_out, bufferlen);
 
-               goto fail;
+               goto fail_close_unlink;
        }
 
        if ((value = fcntl(fd, F_GETFD, 0)) < 0) {
                log_error("Cannot get close-on-exec flag from pidfile [%s], "
                          "error was [%s]", lockfile, strerror(errno));
 
-               goto fail;
+               goto fail_close_unlink;
        }
        value |= FD_CLOEXEC;
        if (fcntl(fd, F_SETFD, value) < 0) {
                log_error("Cannot set close-on-exec flag from pidfile [%s], "
                          "error was [%s]", lockfile, strerror(errno));
 
-               goto fail;
+               goto fail_close_unlink;
        }
 
        return 1;
 
-fail:
-       if (close(fd))
-               stack;
+fail_close_unlink:
        if (unlink(lockfile))
                stack;
+fail_close:
+       if (close(fd))
+               stack;
 
        return 0;
 }
This page took 0.041143 seconds and 5 git commands to generate.