]> www.infradead.org Git - users/sagi/nvme-cli.git/commitdiff
Regression and improvements to nvme-read and nvme-write
authorStephen Bates <stephen.bates@pmcs.com>
Sat, 7 Feb 2015 03:52:24 +0000 (03:52 +0000)
committerStephen Bates <stephen.bates@pmcs.com>
Sat, 7 Feb 2015 03:52:24 +0000 (03:52 +0000)
Added a short pass/fail regression for commit testing. Added the
ability to show and dry-run submit_io commands.

Makefile
nvme.c
regress [new file with mode: 0755]

index 5354fa20b5e33d6c6158edbe20f16d15cd714c72..17ad324b80692ccc9e3f77307b0ba28de1f77e01 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -1,4 +1,4 @@
-CFLAGS := -m64 -O2 -g -pthread -D_GNU_SOURCE -D_REENTRANT -Wall
+CFLAGS := -m64 -O2 -g -pthread -D_GNU_SOURCE -D_REENTRANT -Wall -Werror
 LDFLAGS := -m64 -lm
 NVME = nvme
 INSTALL ?= install
@@ -11,7 +11,7 @@ doc: $(NVME)
 all: doc
 
 clean:
-       rm -f $(NVME) *.o
+       rm -f $(NVME) *.o *~
        $(MAKE) -C Documentation clean
 
 clobber: clean
diff --git a/nvme.c b/nvme.c
index bfe60e303c4d554207137059e878eab3ab5e5caa..d88027c5a82abcf81ec636dec96ba3b06723d34f 100644 (file)
--- a/nvme.c
+++ b/nvme.c
@@ -1698,7 +1698,7 @@ static int submit_io(int opcode, char *command, int argc, char **argv)
        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;
 
@@ -1714,11 +1714,13 @@ static int submit_io(int opcode, char *command, int argc, char **argv)
                {"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;
@@ -1740,12 +1742,17 @@ static int submit_io(int opcode, char *command, int argc, char **argv)
                        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;
                }
@@ -1764,6 +1771,24 @@ static int submit_io(int opcode, char *command, int argc, char **argv)
 
         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");
@@ -1776,6 +1801,8 @@ static int submit_io(int opcode, char *command, int argc, char **argv)
                } else
                        printf("%s: success\n", command);
        }
+ free_and_return:
+       free(buffer);
        return 0;
 }
 
diff --git a/regress b/regress
new file mode 100755 (executable)
index 0000000..a90ca3d
--- /dev/null
+++ b/regress
@@ -0,0 +1,38 @@
+#!/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