/* 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);
}
