1
0
mirror of git://sourceware.org/git/lvm2.git synced 2025-03-28 02:50:41 +03:00

tests: testing usable of /dev/kmsg

It's not so easy to recongnize unusable /dev/kmsg
Reorder the code in a way if the first regular read of /dev/kmsg
fail, fallback to klogctl interface.

Call drain_dmesg also for the case there is no user log output.
This commit is contained in:
Zdenek Kabelac 2014-03-04 17:50:17 +01:00
parent 9a99cb8c79
commit 08aedff1fc

@ -260,24 +260,6 @@ static int drain(int fd)
static int drain_fds(int fd1, int fd2, long timeout)
{
int ret;
fd_set set;
struct timeval selectwait = { .tv_usec = timeout };
FD_ZERO(&set);
FD_SET(fd1, &set);
if (fd2 >= 0)
FD_SET(fd2, &set);
if ((ret = select(fd2 > fd1 ? fd2 + 1 : fd1 + 1, &set, NULL, NULL, &selectwait)) <= 0)
return ret;
if (FD_ISSET(fd1, &set) && drain(fd1) > 0)
return fd1 + 1;
if (fd2 >= 0 && FD_ISSET(fd2, &set) && drain(fd2) > 0)
return fd2 + 1;
return -1;
}
@ -422,6 +404,7 @@ static void run(int i, char *f) {
int collect_debug = 0;
int fd_debuglog = -1;
int fd_kmsg;
fd_set set;
int ret;
//close(fds[1]);
@ -439,11 +422,6 @@ static void run(int i, char *f) {
if ((fd_kmsg = open("/dev/kmsg", O_RDONLY | O_NONBLOCK)) < 0) {
if (errno != ENOENT) /* Older kernels (<3.5) do not support /dev/kmsg */
perror("open /dev/kmsg");
} else if (read(fd_kmsg, NULL, 0) == -1) {
/* There is /dev/kmsg, but unreadable -> ignore it (RHEL6?) */
/* Expected error, stay quiet so log looks nice, perror("read /dev/kmsg"); */
close(fd_kmsg);
fd_kmsg = -1;
} else if (lseek(fd_kmsg, 0L, SEEK_END) == (off_t) -1)
perror("lseek /dev/kmsg");
@ -452,6 +430,8 @@ static void run(int i, char *f) {
clear_dmesg();
while ((w = wait4(pid, &st, WNOHANG, &usage)) == 0) {
struct timeval selectwait = { .tv_usec = 500000 }; /* 0.5s */
if ((fullbuffer && fullbuffer++ == 8000) ||
(no_write > 180 * 2)) /* a 3 minute timeout */
{
@ -475,7 +455,15 @@ static void run(int i, char *f) {
break;
}
if ((ret = drain_fds(fds[0], fd_kmsg, 500000)) <= 0) {
if (clobber_dmesg)
drain_dmesg();
FD_ZERO(&set);
FD_SET(fds[0], &set);
if (fd_kmsg >= 0)
FD_SET(fd_kmsg, &set);
if ((ret = select(fd_kmsg > fds[0] ? fd_kmsg + 1 : fds[0] + 1, &set, NULL, NULL, &selectwait)) <= 0) {
/* Still checking debug log size if it's not growing too much */
if (!unlimited && testdirdebug[0] &&
(stat(testdirdebug, &statbuf) == 0) &&
@ -484,13 +472,18 @@ static void run(int i, char *f) {
statbuf.st_size);
goto timeout;
}
no_write++;
continue;
} else if (ret == (fds[0] + 1))
}
if (FD_ISSET(fds[0], &set) && drain(fds[0]) > 0)
no_write = 0;
if (clobber_dmesg)
drain_dmesg();
else if (fd_kmsg >= 0 && FD_ISSET(fd_kmsg, &set) && (drain(fd_kmsg) < 0)) {
close(fd_kmsg);
fd_kmsg = -1; /* Likely /dev/kmsg is not readable */
if ((clobber_dmesg = strcmp(getenv("LVM_TEST_CAN_CLOBBER_DMESG") ? : "0", "0")))
clear_dmesg();
}
}
if (w != pid) {
perror("waitpid");