struct nvme_user_io io;
void *buffer;
int err, opt, dfd = opcode & 1 ? STDIN_FILENO : STDOUT_FILENO,
- long_index = 0;
+ show = 0, dry_run = 0, long_index = 0;
unsigned int data_size = 0;
__u8 prinfo = 0;
{"app-tag", required_argument, 0, 'a'},
{"limited-retry", no_argument, 0, 'l'},
{"force-unit-access", no_argument, 0, 'f'},
+ {"show-command", no_argument, 0, 'v'},
+ {"dry-run", no_argument, 0, 'w'},
{ 0, 0, 0, 0}
};
memset(&io, 0, sizeof(io));
- while ((opt = getopt_long(argc, (char **)argv, "p:s:c:z:r:d:m:a:lf", opts,
+ while ((opt = getopt_long(argc, (char **)argv, "p:s:c:z:r:d:m:a:lfvw", opts,
&long_index)) != -1) {
switch(opt) {
case 's': get_long(optarg, &io.slba); break;
io.control | NVME_RW_FUA;
break;
case 'd':
- dfd = open(optarg, O_RDONLY);
+ if (opcode & 1)
+ dfd = open(optarg, O_RDONLY);
+ else
+ dfd = open(optarg, O_WRONLY | O_CREAT);
if (dfd < 0) {
perror(optarg);
return EINVAL;
}
break;
+ case 'v': show = 1; break;
+ case 'w': dry_run = 1; break;
default:
return EINVAL;
}
io.opcode = opcode;
io.addr = (__u64)buffer;
+
+ if (show) {
+ printf("opcode : %02x\n" , io.opcode);
+ printf("flags : %02x\n" , io.flags);
+ printf("control : %04x\n" , io.control);
+ printf("nblocks : %04x\n" , io.nblocks);
+ printf("rsvd : %04x\n" , io.rsvd);
+ printf("metadata : %p\n" , (void *)io.metadata);
+ printf("addr : %p\n" , (void *)io.addr);
+ printf("sbla : %p\n" , (void *)io.slba);
+ printf("dsmgmt : %08x\n" , io.dsmgmt);
+ printf("reftag : %08x\n" , io.reftag);
+ printf("apptag : %04x\n" , io.apptag);
+ printf("appmask : %04x\n" , io.appmask);
+ if (dry_run)
+ goto free_and_return;
+ }
+
err = ioctl(fd, NVME_IOCTL_SUBMIT_IO, &io);
if (err < 0)
perror("ioctl");
} else
printf("%s: success\n", command);
}
+ free_and_return:
+ free(buffer);
return 0;
}
--- /dev/null
+#!/bin/bash
+
+RAND_BASE=temp.rand
+RAND_WFILE=${RAND_BASE}.write
+RAND_RFILE=${RAND_BASE}.read
+RAND_SIZE=512
+
+green=$(tput bold)$(tput setaf 2)
+red=$(tput bold)$(tput setaf 1)
+rst=$(tput sgr0)
+
+function print_pass_fail {
+ $* > /dev/null 2>&1
+ if (( $? )); then
+ echo ${red}"FAILED!"${rst}
+ echo "Failed running command: "
+ echo " $*"
+ exit 1
+ else
+ echo ${green}"PASSED!"${rst}
+ fi
+}
+
+function run_test {
+ LINE="$*"
+ printf " %-3s %-68s : " "RUN" "${LINE::67}"
+ print_pass_fail $*
+}
+
+make clean > /dev/null || exit -1
+make install > /dev/null || exit -1
+
+run_test dd if=/dev/urandom of=${RAND_WFILE} bs=${RAND_SIZE} count=1
+run_test nvme write /dev/nvme0n1 --start-block=0 --block-count=0 --data-size=${RAND_SIZE} --data ${RAND_WFILE}
+run_test nvme read /dev/nvme0n1 --start-block=0 --block-count=0 --data-size=${RAND_SIZE} --data ${RAND_RFILE}
+run_test diff ${RAND_RFILE} ${RAND_WFILE}
+
+rm ${RAND_RFILE} ${RAND_WFILE} > /dev/null
\ No newline at end of file