[PATCH] Support for multiple queued commands with read/write SG v3 io
[fio.git] / fio.c
diff --git a/fio.c b/fio.c
index 2fb7da9b76c22190e09e39efacd266572b29f63a..43942ddbdacb71114437988f5a6716800c86161c 100644 (file)
--- a/fio.c
+++ b/fio.c
@@ -579,7 +579,7 @@ static int td_io_prep(struct thread_data *td, struct io_u *io_u, int read)
        return 0;
 }
 
-static void put_io_u(struct thread_data *td, struct io_u *io_u)
+void put_io_u(struct thread_data *td, struct io_u *io_u)
 {
        list_del(&io_u->list);
        list_add(&io_u->list, &td->io_u_freelist);
@@ -588,7 +588,7 @@ static void put_io_u(struct thread_data *td, struct io_u *io_u)
 
 #define queue_full(td) (list_empty(&(td)->io_u_freelist))
 
-static struct io_u *__get_io_u(struct thread_data *td)
+struct io_u *__get_io_u(struct thread_data *td)
 {
        struct io_u *io_u;
 
@@ -1113,6 +1113,7 @@ static int init_io_u(struct thread_data *td)
                INIT_LIST_HEAD(&io_u->list);
 
                io_u->buf = p + td->max_bs * i;
+               io_u->index = i;
                list_add(&io_u->list, &td->io_u_freelist);
        }
 
@@ -1235,12 +1236,14 @@ static int bdev_size(struct thread_data *td)
 
 static int get_file_size(struct thread_data *td)
 {
-       int ret;
+       int ret = 0;
 
        if (td->filetype == FIO_TYPE_FILE)
                ret = file_size(td);
-       else
+       else if (td->filetype == FIO_TYPE_BD)
                ret = bdev_size(td);
+       else
+               td->real_file_size = -1;
 
        if (ret)
                return ret;
@@ -1356,9 +1359,14 @@ static int setup_file(struct thread_data *td)
        if (td->odirect)
                flags |= O_DIRECT;
 
-       if (td_read(td))
-               td->fd = open(td->file_name, flags | O_RDONLY);
-       else {
+       if (td_read(td)) {
+               if (td->filetype == FIO_TYPE_CHAR)
+                       flags |= O_RDWR;
+               else
+                       flags |= O_RDONLY;
+
+               td->fd = open(td->file_name, flags);
+       } else {
                if (td->filetype == FIO_TYPE_FILE) {
                        if (!td->overwrite)
                                flags |= O_TRUNC;
@@ -1599,17 +1607,23 @@ static void init_disk_util(struct thread_data *td)
                return;
 
        /*
-        * if this is inside a partition dir, jump back to parent
+        * for md/dm, there's no queue dir. we already have the right place
         */
-       sprintf(tmp, "%s/queue", foo);
+       sprintf(tmp, "%s/stat", foo);
        if (stat(tmp, &st)) {
-               p = dirname(foo);
-               sprintf(tmp, "%s/queue", p);
+               /*
+                * if this is inside a partition dir, jump back to parent
+                */
+               sprintf(tmp, "%s/queue", foo);
                if (stat(tmp, &st)) {
-                       fprintf(stderr, "unknown sysfs layout\n");
-                       return;
+                       p = dirname(foo);
+                       sprintf(tmp, "%s/queue", p);
+                       if (stat(tmp, &st)) {
+                               fprintf(stderr, "unknown sysfs layout\n");
+                               return;
+                       }
+                       sprintf(foo, "%s", p);
                }
-               sprintf(foo, "%s", p);
        }
 
        disk_util_add(dev, foo);