1 /* 2 * blktrace output analysis: generate a timeline & gather statistics 3 * 4 * Copyright (C) 2006 Alan D. Brunelle <Alan.Brunelle (at) 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 24 struct devmap { 25 struct list_head head; 26 char device[32], devno[32]; 27 }; 28 29 LIST_HEAD(all_devmaps); 30 31 static 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 48 char *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 64 int 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 fclose(fp); 80 return 0; 81 } 82 83 void dev_map_exit(void) 84 { 85 struct list_head *p, *q; 86 87 list_for_each_safe(p, q, &all_devmaps) { 88 struct devmap *dmp = list_entry(p, struct devmap, head); 89 90 list_del(&dmp->head); 91 free(dmp); 92 } 93 } 94