1e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat/* 2e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat * blktrace output analysis: generate a timeline & gather statistics 3e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat * 4e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat * Copyright (C) 2006 Alan D. Brunelle <Alan.Brunelle@hp.com> 5e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat * 6e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat * This program is free software; you can redistribute it and/or modify 7e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat * it under the terms of the GNU General Public License as published by 8e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat * the Free Software Foundation; either version 2 of the License, or 9e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat * (at your option) any later version. 10e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat * 11e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat * This program is distributed in the hope that it will be useful, 12e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat * but WITHOUT ANY WARRANTY; without even the implied warranty of 13e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat * GNU General Public License for more details. 15e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat * 16e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat * You should have received a copy of the GNU General Public License 17e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat * along with this program; if not, write to the Free Software 18e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 19e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat * 20e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat */ 21e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat#include <stdio.h> 22e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat#include "globals.h" 23e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 24e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehatstruct devmap { 25e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat struct list_head head; 26e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat char device[32], devno[32]; 27e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat}; 28e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 29e20e1347b9914aa05e30548c15d7cd5e412cc0e2San MehatLIST_HEAD(all_devmaps); 30e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 31e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehatstatic int dev_map_add(char *line) 32e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat{ 33e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat struct devmap *dmp; 34e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 35e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat if (strstr(line, "Device") != NULL) 36e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat return 1; 37e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 38e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat dmp = malloc(sizeof(struct devmap)); 39e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat if (sscanf(line, "%s %s", dmp->device, dmp->devno) != 2) { 40e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat free(dmp); 41e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat return 1; 42e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat } 43e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 44e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat list_add_tail(&dmp->head, &all_devmaps); 45e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat return 0; 46e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat} 47e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 48e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehatchar *dev_map_find(__u32 device) 49e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat{ 50e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat char this[128]; 51e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat struct list_head *p; 52e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 53e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat sprintf(this, "%u,%u", MAJOR(device), MINOR(device)); 54e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat __list_for_each(p, &all_devmaps) { 55e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat struct devmap *dmp = list_entry(p, struct devmap, head); 56e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 57e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat if (!strcmp(this, dmp->devno)) 58e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat return dmp->device; 59e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat } 60e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 61e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat return NULL; 62e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat} 63e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 64e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehatint dev_map_read(char *fname) 65e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat{ 66e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat char line[256]; 67e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat FILE *fp = my_fopen(fname, "r"); 68e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 69e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat if (!fp) { 70e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat perror(fname); 71e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat return 1; 72e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat } 73e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 74e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat while (fscanf(fp, "%255[a-zA-Z0-9 :.,/_-]\n", line) == 1) { 75e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat if (dev_map_add(line)) 76e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat break; 77e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat } 78e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 79e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat return 0; 80e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat} 81e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 82e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehatvoid dev_map_exit(void) 83e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat{ 84e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat struct list_head *p, *q; 85e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 86e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat list_for_each_safe(p, q, &all_devmaps) { 87e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat struct devmap *dmp = list_entry(p, struct devmap, head); 88e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 89e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat list_del(&dmp->head); 90e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat free(dmp); 91e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat } 92e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat} 93