t->magic = BLK_IO_TRACE_MAGIC | BLK_IO_TRACE_VERSION;
                t->sequence = ++(*sequence);
                t->time = ktime_to_ns(ktime_get());
-               t->cpu = cpu;
-               t->pid = pid;
 record_it:
+               /*
+                * These two are not needed in ftrace as they are in the
+                * generic trace_entry, filled by tracing_generic_entry_update,
+                * but for the trace_event->bin() synthesizer benefit we do it
+                * here too.
+                */
+               t->cpu = cpu;
+               t->pid = pid;
+
                t->sector = sector;
                t->bytes = bytes;
                t->action = what;
                if (blk_register_tracepoints())
                        atomic_dec(&blk_probes_ref);
        mutex_unlock(&blk_probe_mutex);
+       trace_flags &= ~TRACE_ITER_CONTEXT_INFO;
 }
 
 static int blk_tracer_init(struct trace_array *tr)
 
 static void blk_tracer_stop(struct trace_array *tr)
 {
+       trace_flags |= TRACE_ITER_CONTEXT_INFO;
        mutex_lock(&blk_probe_mutex);
        if (atomic_dec_and_test(&blk_probes_ref))
                blk_unregister_tracepoints();
        const u16 what = t->action & ((1 << BLK_TC_SHIFT) - 1);
        int ret;
 
+       if (trace_print_context(iter))
+               return TRACE_TYPE_PARTIAL_LINE;
+
        if (unlikely(what == 0 || what > ARRAY_SIZE(what2act)))
                ret = trace_seq_printf(s, "Bad pc action %x\n", what);
        else {
        return ret ? TRACE_TYPE_HANDLED : TRACE_TYPE_PARTIAL_LINE;
 }
 
+static int blk_trace_synthesize_old_trace(struct trace_iterator *iter)
+{
+       struct trace_seq *s = &iter->seq;
+       struct blk_io_trace *t = (struct blk_io_trace *)iter->ent;
+       const int offset = offsetof(struct blk_io_trace, sector);
+       struct blk_io_trace old = {
+               .magic    = BLK_IO_TRACE_MAGIC | BLK_IO_TRACE_VERSION,
+               .time     = ns2usecs(iter->ts),
+       };
+
+       if (!trace_seq_putmem(s, &old, offset))
+               return 0;
+       return trace_seq_putmem(s, &t->sector,
+                               sizeof(old) - offset + t->pdu_len);
+}
+
+static int blk_trace_event_print_binary(struct trace_iterator *iter, int flags)
+{
+       return blk_trace_synthesize_old_trace(iter) ?
+                       TRACE_TYPE_HANDLED : TRACE_TYPE_PARTIAL_LINE;
+}
+
 static enum print_line_t blk_tracer_print_line(struct trace_iterator *iter)
 {
        const struct blk_io_trace *t;
        .latency_trace  = blk_trace_event_print,
        .raw            = trace_nop_print,
        .hex            = trace_nop_print,
-       .binary         = trace_nop_print,
+       .binary         = blk_trace_event_print_binary,
 };
 
 static int __init init_blk_tracer(void)