]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blobdiff - kernel/trace/blktrace.c
Merge branches 'for-4.11/upstream-fixes', 'for-4.12/accutouch', 'for-4.12/cp2112...
[mirror_ubuntu-artful-kernel.git] / kernel / trace / blktrace.c
index 95cecbf67f5ca0903d582b0ed45ef4b409fa3c99..b2058a7f94bd8797f5629158aeed8bf045c20e4f 100644 (file)
@@ -28,6 +28,8 @@
 #include <linux/uaccess.h>
 #include <linux/list.h>
 
+#include "../../block/blk.h"
+
 #include <trace/events/block.h>
 
 #include "trace_output.h"
@@ -292,9 +294,6 @@ record_it:
        local_irq_restore(flags);
 }
 
-static struct dentry *blk_tree_root;
-static DEFINE_MUTEX(blk_tree_mutex);
-
 static void blk_trace_free(struct blk_trace *bt)
 {
        debugfs_remove(bt->msg_file);
@@ -433,9 +432,9 @@ static void blk_trace_setup_lba(struct blk_trace *bt,
 /*
  * Setup everything required to start tracing
  */
-int do_blk_trace_setup(struct request_queue *q, char *name, dev_t dev,
-                      struct block_device *bdev,
-                      struct blk_user_trace_setup *buts)
+static int do_blk_trace_setup(struct request_queue *q, char *name, dev_t dev,
+                             struct block_device *bdev,
+                             struct blk_user_trace_setup *buts)
 {
        struct blk_trace *bt = NULL;
        struct dentry *dir = NULL;
@@ -468,22 +467,15 @@ int do_blk_trace_setup(struct request_queue *q, char *name, dev_t dev,
 
        ret = -ENOENT;
 
-       mutex_lock(&blk_tree_mutex);
-       if (!blk_tree_root) {
-               blk_tree_root = debugfs_create_dir("block", NULL);
-               if (!blk_tree_root) {
-                       mutex_unlock(&blk_tree_mutex);
-                       goto err;
-               }
-       }
-       mutex_unlock(&blk_tree_mutex);
-
-       dir = debugfs_create_dir(buts->name, blk_tree_root);
+       if (!blk_debugfs_root)
+               goto err;
 
+       dir = debugfs_lookup(buts->name, blk_debugfs_root);
+       if (!dir)
+               bt->dir = dir = debugfs_create_dir(buts->name, blk_debugfs_root);
        if (!dir)
                goto err;
 
-       bt->dir = dir;
        bt->dev = dev;
        atomic_set(&bt->dropped, 0);
        INIT_LIST_HEAD(&bt->running_list);
@@ -525,9 +517,12 @@ int do_blk_trace_setup(struct request_queue *q, char *name, dev_t dev,
        if (atomic_inc_return(&blk_probes_ref) == 1)
                blk_register_tracepoints();
 
-       return 0;
+       ret = 0;
 err:
-       blk_trace_free(bt);
+       if (dir && !bt->dir)
+               dput(dir);
+       if (ret)
+               blk_trace_free(bt);
        return ret;
 }
 
@@ -712,15 +707,13 @@ static void blk_add_trace_rq(struct request_queue *q, struct request *rq,
        if (likely(!bt))
                return;
 
-       if (rq->cmd_type == REQ_TYPE_BLOCK_PC) {
+       if (blk_rq_is_passthrough(rq))
                what |= BLK_TC_ACT(BLK_TC_PC);
-               __blk_add_trace(bt, 0, nr_bytes, req_op(rq), rq->cmd_flags,
-                               what, rq->errors, rq->cmd_len, rq->cmd);
-       } else  {
+       else
                what |= BLK_TC_ACT(BLK_TC_FS);
-               __blk_add_trace(bt, blk_rq_pos(rq), nr_bytes, req_op(rq),
-                               rq->cmd_flags, what, rq->errors, 0, NULL);
-       }
+
+       __blk_add_trace(bt, blk_rq_trace_sector(rq), nr_bytes, req_op(rq),
+                       rq->cmd_flags, what, rq->errors, 0, NULL);
 }
 
 static void blk_add_trace_rq_abort(void *ignore,
@@ -972,11 +965,7 @@ void blk_add_driver_data(struct request_queue *q,
        if (likely(!bt))
                return;
 
-       if (rq->cmd_type == REQ_TYPE_BLOCK_PC)
-               __blk_add_trace(bt, 0, blk_rq_bytes(rq), 0, 0,
-                               BLK_TA_DRV_DATA, rq->errors, len, data);
-       else
-               __blk_add_trace(bt, blk_rq_pos(rq), blk_rq_bytes(rq), 0, 0,
+       __blk_add_trace(bt, blk_rq_trace_sector(rq), blk_rq_bytes(rq), 0, 0,
                                BLK_TA_DRV_DATA, rq->errors, len, data);
 }
 EXPORT_SYMBOL_GPL(blk_add_driver_data);
@@ -1752,31 +1741,6 @@ void blk_trace_remove_sysfs(struct device *dev)
 
 #ifdef CONFIG_EVENT_TRACING
 
-void blk_dump_cmd(char *buf, struct request *rq)
-{
-       int i, end;
-       int len = rq->cmd_len;
-       unsigned char *cmd = rq->cmd;
-
-       if (rq->cmd_type != REQ_TYPE_BLOCK_PC) {
-               buf[0] = '\0';
-               return;
-       }
-
-       for (end = len - 1; end >= 0; end--)
-               if (cmd[end])
-                       break;
-       end++;
-
-       for (i = 0; i < len; i++) {
-               buf += sprintf(buf, "%s%02x", i == 0 ? "" : " ", cmd[i]);
-               if (i == end && end != len - 1) {
-                       sprintf(buf, " ..");
-                       break;
-               }
-       }
-}
-
 void blk_fill_rwbs(char *rwbs, unsigned int op, int bytes)
 {
        int i = 0;