[lvm-devel] dev-prajnoha-selout - locking: use sigaction signal handling
Peter Rajnoha
prajnoha at fedoraproject.org
Fri May 9 06:56:20 UTC 2014
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=04b29a3587737375303f2f37b41a33e181ac8623
Commit: 04b29a3587737375303f2f37b41a33e181ac8623
Parent: 9d64573da135b489e1b3079612e77363526ca44d
Author: Zdenek Kabelac <zkabelac at redhat.com>
AuthorDate: Fri May 2 17:27:51 2014 +0200
Committer: Zdenek Kabelac <zkabelac at redhat.com>
CommitterDate: Wed May 7 14:01:13 2014 +0200
locking: use sigaction signal handling
Use sigint_allow/restore function instead of duplicating code
and switch to use only sigactiction based signal handling.
---
WHATS_NEW | 1 +
lib/locking/file_locking.c | 3 --
lib/misc/lvm-flock.c | 9 +++++--
lib/misc/lvm-signal.c | 54 --------------------------------------------
4 files changed, 7 insertions(+), 60 deletions(-)
diff --git a/WHATS_NEW b/WHATS_NEW
index 37225fe..1cb97d9 100644
--- a/WHATS_NEW
+++ b/WHATS_NEW
@@ -1,5 +1,6 @@
Version 2.02.107 -
==================================
+ Use only sigaction handler and drop duplicate signal handler.
Separate signal handling and flock code out into lib/misc.
Don't start dmeventd checking seg_monitor and monitoring is disabled.
Catch CTRL-c during pvremove prompts.
diff --git a/lib/locking/file_locking.c b/lib/locking/file_locking.c
index d3794db..d79d7a9 100644
--- a/lib/locking/file_locking.c
+++ b/lib/locking/file_locking.c
@@ -160,8 +160,5 @@ int init_file_locking(struct locking_type *locking, struct cmd_context *cmd,
if ((access(_lock_dir, R_OK | W_OK | X_OK) == -1) && (errno == EROFS))
return 0;
- if (!init_signals(suppress_messages))
- return_0;
-
return 1;
}
diff --git a/lib/misc/lvm-flock.c b/lib/misc/lvm-flock.c
index ca05e1c..8b70a0c 100644
--- a/lib/misc/lvm-flock.c
+++ b/lib/misc/lvm-flock.c
@@ -111,12 +111,15 @@ static int _do_flock(const char *file, int *fd, int operation, uint32_t nonblock
if (nonblock)
operation |= LOCK_NB;
else
- install_ctrl_c_handler();
+ sigint_allow();
r = flock(*fd, operation);
old_errno = errno;
- if (!nonblock)
- remove_ctrl_c_handler();
+ if (!nonblock) {
+ sigint_restore();
+ if (sigint_caught())
+ log_error("Giving up waiting for lock.");
+ }
if (r) {
errno = old_errno;
diff --git a/lib/misc/lvm-signal.c b/lib/misc/lvm-signal.c
index 690733b..679f089 100644
--- a/lib/misc/lvm-signal.c
+++ b/lib/misc/lvm-signal.c
@@ -18,10 +18,6 @@
#include <signal.h>
-static sig_t _oldhandler;
-static sigset_t _fullsigset, _intsigset;
-static volatile sig_atomic_t _handler_installed;
-
static sigset_t _oldset;
static int _signals_blocked = 0;
static volatile sig_atomic_t _sigint_caught = 0;
@@ -29,56 +25,6 @@ static volatile sig_atomic_t _handler_installed2;
static struct sigaction _oldhandler2;
static int _oldmasked;
-void remove_ctrl_c_handler(void)
-{
- siginterrupt(SIGINT, 0);
- if (!_handler_installed)
- return;
-
- _handler_installed = 0;
-
- sigprocmask(SIG_SETMASK, &_fullsigset, NULL);
- if (signal(SIGINT, _oldhandler) == SIG_ERR)
- log_sys_error("signal", "_remove_ctrl_c_handler");
-}
-
-static void _trap_ctrl_c(int sig __attribute__((unused)))
-{
- remove_ctrl_c_handler();
-
- log_error("CTRL-c detected: giving up waiting for lock");
-}
-
-void install_ctrl_c_handler(void)
-{
- _handler_installed = 1;
-
- if ((_oldhandler = signal(SIGINT, _trap_ctrl_c)) == SIG_ERR) {
- _handler_installed = 0;
- return;
- }
-
- sigprocmask(SIG_SETMASK, &_intsigset, NULL);
- siginterrupt(SIGINT, 1);
-}
-
-int init_signals(int suppress_messages)
-{
- if (sigfillset(&_intsigset) || sigfillset(&_fullsigset)) {
- log_sys_error_suppress(suppress_messages, "sigfillset",
- "init_signals");
- return 0;
- }
-
- if (sigdelset(&_intsigset, SIGINT)) {
- log_sys_error_suppress(suppress_messages, "sigdelset",
- "init_signals");
- return 0;
- }
-
- return 1;
-}
-
static void _catch_sigint(int unused __attribute__((unused)))
{
_sigint_caught = 1;
More information about the lvm-devel
mailing list