|
@@ -24,6 +24,7 @@ enum blktrace_cat {
|
|
|
BLK_TC_AHEAD = 1 << 11, /* readahead */
|
|
|
BLK_TC_META = 1 << 12, /* metadata */
|
|
|
BLK_TC_DISCARD = 1 << 13, /* discard requests */
|
|
|
+ BLK_TC_DRV_DATA = 1 << 14, /* binary per-driver data */
|
|
|
|
|
|
BLK_TC_END = 1 << 15, /* only 16-bits, reminder */
|
|
|
};
|
|
@@ -51,6 +52,7 @@ enum blktrace_act {
|
|
|
__BLK_TA_BOUNCE, /* bio was bounced */
|
|
|
__BLK_TA_REMAP, /* bio was remapped */
|
|
|
__BLK_TA_ABORT, /* request aborted */
|
|
|
+ __BLK_TA_DRV_DATA, /* driver-specific binary data */
|
|
|
};
|
|
|
|
|
|
/*
|
|
@@ -82,6 +84,7 @@ enum blktrace_notify {
|
|
|
#define BLK_TA_BOUNCE (__BLK_TA_BOUNCE)
|
|
|
#define BLK_TA_REMAP (__BLK_TA_REMAP | BLK_TC_ACT(BLK_TC_QUEUE))
|
|
|
#define BLK_TA_ABORT (__BLK_TA_ABORT | BLK_TC_ACT(BLK_TC_QUEUE))
|
|
|
+#define BLK_TA_DRV_DATA (__BLK_TA_DRV_DATA | BLK_TC_ACT(BLK_TC_DRV_DATA))
|
|
|
|
|
|
#define BLK_TN_PROCESS (__BLK_TN_PROCESS | BLK_TC_ACT(BLK_TC_NOTIFY))
|
|
|
#define BLK_TN_TIMESTAMP (__BLK_TN_TIMESTAMP | BLK_TC_ACT(BLK_TC_NOTIFY))
|
|
@@ -317,6 +320,34 @@ static inline void blk_add_trace_remap(struct request_queue *q, struct bio *bio,
|
|
|
__blk_add_trace(bt, from, bio->bi_size, bio->bi_rw, BLK_TA_REMAP, !bio_flagged(bio, BIO_UPTODATE), sizeof(r), &r);
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * blk_add_driver_data - Add binary message with driver-specific data
|
|
|
+ * @q: queue the io is for
|
|
|
+ * @rq: io request
|
|
|
+ * @data: driver-specific data
|
|
|
+ * @len: length of driver-specific data
|
|
|
+ *
|
|
|
+ * Description:
|
|
|
+ * Some drivers might want to write driver-specific data per request.
|
|
|
+ *
|
|
|
+ **/
|
|
|
+static inline void blk_add_driver_data(struct request_queue *q,
|
|
|
+ struct request *rq,
|
|
|
+ void *data, size_t len)
|
|
|
+{
|
|
|
+ struct blk_trace *bt = q->blk_trace;
|
|
|
+
|
|
|
+ if (likely(!bt))
|
|
|
+ return;
|
|
|
+
|
|
|
+ if (blk_pc_request(rq))
|
|
|
+ __blk_add_trace(bt, 0, rq->data_len, 0, BLK_TA_DRV_DATA,
|
|
|
+ rq->errors, len, data);
|
|
|
+ else
|
|
|
+ __blk_add_trace(bt, rq->hard_sector, rq->hard_nr_sectors << 9,
|
|
|
+ 0, BLK_TA_DRV_DATA, rq->errors, len, data);
|
|
|
+}
|
|
|
+
|
|
|
extern int blk_trace_setup(struct request_queue *q, char *name, dev_t dev,
|
|
|
char __user *arg);
|
|
|
extern int blk_trace_startstop(struct request_queue *q, int start);
|
|
@@ -330,6 +361,7 @@ extern int blk_trace_remove(struct request_queue *q);
|
|
|
#define blk_add_trace_generic(q, rq, rw, what) do { } while (0)
|
|
|
#define blk_add_trace_pdu_int(q, what, bio, pdu) do { } while (0)
|
|
|
#define blk_add_trace_remap(q, bio, dev, f, t) do {} while (0)
|
|
|
+#define blk_add_driver_data(q, rq, data, len) do {} while (0)
|
|
|
#define do_blk_trace_setup(q, name, dev, buts) (-ENOTTY)
|
|
|
#define blk_trace_setup(q, name, dev, arg) (-ENOTTY)
|
|
|
#define blk_trace_startstop(q, start) (-ENOTTY)
|