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