From: Alasdair Kergon Date: Tue, 27 Jul 2010 21:56:14 +0000 (+0000) Subject: Fix dm_create_lockfile error paths - incorrectly unlinked in-use lockfile. X-Git-Tag: old-v2_02_71~6 X-Git-Url: https://sourceware.org/git/?a=commitdiff_plain;h=5f9d855d3ee97ec93f7df60ee0e3fcd6cb995808;p=lvm2.git Fix dm_create_lockfile error paths - incorrectly unlinked in-use lockfile. (Jan Friesse) --- diff --git a/libdm/libdm-file.c b/libdm/libdm-file.c index 8dbf099c4..b72b2abe0 100644 --- a/libdm/libdm-file.c +++ b/libdm/libdm-file.c @@ -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; }