DF-5026 / df5026_trigger.c
/* DF-5026 trigger: drive the ips sink device. * * offline <dev> - read @3M: simulate "adapter reset failed" (IPS_OFFLINE) * wedge <dev> - read @2M: bio parks in the queue forever -> D-state * poke <dev> - read @1M: drain the parked bios (external completion) * online <dev> - read @3M again: adapter back online */ #include <fcntl.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <errno.h> #include <string.h> int main(int argc, char **argv) { char buf[512]; ssize_t r; int fd; unsigned long off; if (argc < 3) { fprintf(stderr, "usage: %s offline|wedge|poke|online <device>\n", argv[0]); exit(2); } if (strcmp(argv[1], "offline") == 0 || strcmp(argv[1], "online") == 0) off = 3UL << 20; else if (strcmp(argv[1], "wedge") == 0) off = 2UL << 20; else off = 1UL << 20; fd = open(argv[2], O_RDONLY); if (fd < 0) { perror("open"); exit(1); } r = pread(fd, buf, sizeof(buf), off); fprintf(stderr, "%s: pread@%lu r=%zd errno=%d(%s) — returned only " "after the bio was completed externally\n", argv[1], off, r, r < 0 ? errno : 0, r < 0 ? strerror(errno) : "ok"); return (0); } |