diff options
author | Zdenek Kabelac <zkabelac@redhat.com> | 2012-02-15 13:56:47 +0000 |
---|---|---|
committer | Zdenek Kabelac <zkabelac@redhat.com> | 2012-02-15 13:56:47 +0000 |
commit | 80202ecd980ef50a3bb609a2fb2094bf3d1c97d9 (patch) | |
tree | b1b527c8db79be4f633cde603fe44311fe88617a /daemons | |
parent | 5b29e2ac60eb33e7092a4a9309a64e2a1525c234 (diff) | |
download | lvm2-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.c | 8 |
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."); |