Skip unsupported protocol versions for now.

Signed-off-by: Johannes Thumshirn <[email protected]>
---
 blkparse.c | 136 ++++++++++++++++++++++++++++++-----------------------
 1 file changed, 76 insertions(+), 60 deletions(-)

diff --git a/blkparse.c b/blkparse.c
index 2e175b8..163da73 100644
--- a/blkparse.c
+++ b/blkparse.c
@@ -2462,10 +2462,10 @@ static int read_events(int fd, int always_block, int 
*fdblock)
        unsigned int events = 0;
 
        while (!is_done() && events < rb_batch) {
-               struct blk_io_trace *bit;
                struct trace *t;
                int should_block, ret;
                __u32 magic;
+               u8 version;
 
                should_block = !events || always_block;
 
@@ -2489,42 +2489,50 @@ static int read_events(int fd, int always_block, int 
*fdblock)
                        fprintf(stderr, "Bad magic %x\n", magic);
                        break;
                }
+               version = magic & 0xff;
+               if (version == SUPPORTED_VERSION) {
+                       struct blk_io_trace *bit;
+                       bit = bit_alloc();
+                       bit->magic = magic;
 
-               bit = bit_alloc();
-               bit->magic = magic;
+                       ret = read_one_bit(fd, bit, 1, fdblock);
+                       if (ret)
+                               break;
 
-               ret = read_one_bit(fd, bit, 1, fdblock);
-               if (ret)
-                       break;
+                       /*
+                        * not a real trace, so grab and handle it here
+                        */
+                       if (bit->action & BLK_TC_ACT(BLK_TC_NOTIFY) &&
+                           (bit->action & ~__BLK_TN_CGROUP) != BLK_TN_MESSAGE) 
{
+                               handle_notify(bit);
+                               output_binary(bit, sizeof(*bit) + bit->pdu_len);
+                               continue;
+                       }
 
-               if (verify_trace(bit)) {
-                       bit_free(bit);
-                       bit = NULL;
-                       continue;
-               }
+                       if (verify_trace(bit)) {
+                               bit_free(bit);
+                               bit = NULL;
+                               continue;
+                       }
 
-               /*
-                * not a real trace, so grab and handle it here
-                */
-               if (bit->action & BLK_TC_ACT(BLK_TC_NOTIFY) && (bit->action & 
~__BLK_TN_CGROUP) != BLK_TN_MESSAGE) {
-                       handle_notify(bit);
-                       output_binary(bit, sizeof(*bit) + bit->pdu_len);
-                       continue;
-               }
+                       t = t_alloc();
+                       memset(t, 0, sizeof(*t));
+                       t->bit = bit;
+                       t->read_sequence = read_sequence;
 
-               t = t_alloc();
-               memset(t, 0, sizeof(*t));
-               t->bit = bit;
-               t->read_sequence = read_sequence;
+                       t->next = trace_list;
+                       trace_list = t;
 
-               t->next = trace_list;
-               trace_list = t;
+                       if (!pdi || pdi->dev != bit->device)
+                               pdi = get_dev_info(bit->device);
 
-               if (!pdi || pdi->dev != bit->device)
-                       pdi = get_dev_info(bit->device);
+                       if (bit->time > pdi->last_read_time)
+                               pdi->last_read_time = bit->time;
+               } else {
+                       fprintf(stderr, "unsupported version %d\n", version);
+                       continue;
+               }
 
-               if (bit->time > pdi->last_read_time)
-                       pdi->last_read_time = bit->time;
 
                events++;
        }
@@ -2616,6 +2624,7 @@ static int ms_prime(struct ms_stream *msp)
        int ret, ndone = 0;
 
        for (i = 0; !is_done() && pci->fd >= 0 && i < rb_batch; i++) {
+               u8 version;
 
                ret = read_data(pci->fd, &magic, sizeof(magic), 1,
                                &pci->fdblock);
@@ -2631,46 +2640,53 @@ static int ms_prime(struct ms_stream *msp)
                        goto err;
 
                }
-               bit = bit_alloc();
-               bit->magic = magic;
+               version = magic & 0xff;
+               if (version == SUPPORTED_VERSION) {
+                       bit = bit_alloc();
+                       bit->magic = magic;
 
-               ret = read_one_bit(pci->fd, bit, 1, &pci->fdblock);
-               if (ret)
-                       goto err;
+                       ret = read_one_bit(pci->fd, bit, 1, &pci->fdblock);
+                       if (ret)
+                               goto err;
 
-               if (verify_trace(bit))
-                       goto err;
+                       if (verify_trace(bit))
+                               goto err;
 
-               if (bit->cpu != pci->cpu) {
-                       fprintf(stderr, "cpu %d trace info has error cpu %d\n",
-                               pci->cpu, bit->cpu);
-                       continue;
-               }
+                       if (bit->cpu != pci->cpu) {
+                               fprintf(stderr,
+                                       "cpu %d trace info has error cpu %d\n",
+                                       pci->cpu, bit->cpu);
+                               continue;
+                       }
 
-               if (bit->action & BLK_TC_ACT(BLK_TC_NOTIFY) && (bit->action & 
~__BLK_TN_CGROUP) != BLK_TN_MESSAGE) {
-                       handle_notify(bit);
-                       output_binary(bit, sizeof(*bit) + bit->pdu_len);
-                       bit_free(bit);
-                       bit = NULL;
+                       if (bit->action & BLK_TC_ACT(BLK_TC_NOTIFY) &&
+                           (bit->action & ~__BLK_TN_CGROUP) != BLK_TN_MESSAGE) 
{
+                               handle_notify(bit);
+                               output_binary(bit, sizeof(*bit) + bit->pdu_len);
+                               bit_free(bit);
+                               bit = NULL;
 
-                       i -= 1;
-                       continue;
-               }
+                               i -= 1;
+                               continue;
+                       }
 
-               if (bit->time > pdi->last_read_time)
-                       pdi->last_read_time = bit->time;
+                       if (bit->time > pdi->last_read_time)
+                               pdi->last_read_time = bit->time;
 
-               t = t_alloc();
-               memset(t, 0, sizeof(*t));
-               t->bit = bit;
+                       t = t_alloc();
+                       memset(t, 0, sizeof(*t));
+                       t->bit = bit;
 
-               if (msp->first == NULL)
-                       msp->first = msp->last = t;
-               else {
-                       msp->last->next = t;
-                       msp->last = t;
+                       if (msp->first == NULL)
+                               msp->first = msp->last = t;
+                       else {
+                               msp->last->next = t;
+                               msp->last = t;
+                       }
+               } else {
+                       fprintf(stderr, "unsupported version %d\n", version);
+                       continue;
                }
-
                ndone++;
                bit = NULL;
        }
-- 
2.51.0


Reply via email to