summaryrefslogtreecommitdiffstats
path: root/daemons
diff options
context:
space:
mode:
authorZdenek Kabelac <zkabelac@redhat.com>2012-02-15 13:56:47 +0000
committerZdenek Kabelac <zkabelac@redhat.com>2012-02-15 13:56:47 +0000
commit80202ecd980ef50a3bb609a2fb2094bf3d1c97d9 (patch)
treeb1b527c8db79be4f633cde603fe44311fe88617a /daemons
parent5b29e2ac60eb33e7092a4a9309a64e2a1525c234 (diff)
downloadlvm2-80202ecd980ef50a3bb609a2fb2094bf3d1c97d9.tar.gz
lvm2-80202ecd980ef50a3bb609a2fb2094bf3d1c97d9.tar.xz
lvm2-80202ecd980ef50a3bb609a2fb2094bf3d1c97d9.zip
Detect failing fifo
If the fifo died because of dmeventd restart - do not wait for 20s in select - it will not get better and return error immediately.
Diffstat (limited to 'daemons')
-rw-r--r--daemons/dmeventd/libdevmapper-event.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/daemons/dmeventd/libdevmapper-event.c b/daemons/dmeventd/libdevmapper-event.c
index c85ef880..dd95aae9 100644
--- a/daemons/dmeventd/libdevmapper-event.c
+++ b/daemons/dmeventd/libdevmapper-event.c
@@ -232,6 +232,7 @@ static int _daemon_read(struct dm_event_fifos *fifos,
size_t size = 2 * sizeof(uint32_t); /* status + size */
uint32_t *header = alloca(size);
char *buf = (char *)header;
+ struct stat fstatbuf;
while (bytes < size) {
for (i = 0, ret = 0; (i < 20) && (ret < 1); i++) {
@@ -245,6 +246,13 @@ static int _daemon_read(struct dm_event_fifos *fifos,
log_error("Unable to read from event server");
return 0;
}
+ /* Check whether fifo is still alive */
+ if ((ret == 0) &&
+ fstat(fifos->server + 1, &fstatbuf) &&
+ (errno == EBADF)) {
+ log_error("Fifo fd is bad for event server.");
+ return 0;
+ }
}
if (ret < 1) {
log_error("Unable to read from event server.");