aboutsummaryrefslogtreecommitdiff
path: root/btt/devmap.c
diff options
context:
space:
mode:
Diffstat (limited to 'btt/devmap.c')
-rw-r--r--btt/devmap.c92
1 files changed, 92 insertions, 0 deletions
diff --git a/btt/devmap.c b/btt/devmap.c
new file mode 100644
index 0000000..9c0348b
--- /dev/null
+++ b/btt/devmap.c
@@ -0,0 +1,92 @@
+/*
+ * blktrace output analysis: generate a timeline & gather statistics
+ *
+ * Copyright (C) 2006 Alan D. Brunelle <Alan.Brunelle@hp.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+#include <stdio.h>
+#include "globals.h"
+
+struct devmap {
+ struct list_head head;
+ char device[32], devno[32];
+};
+
+LIST_HEAD(all_devmaps);
+
+static int dev_map_add(char *line)
+{
+ struct devmap *dmp;
+
+ if (strstr(line, "Device") != NULL)
+ return 1;
+
+ dmp = malloc(sizeof(struct devmap));
+ if (sscanf(line, "%s %s", dmp->device, dmp->devno) != 2) {
+ free(dmp);
+ return 1;
+ }
+
+ list_add_tail(&dmp->head, &all_devmaps);
+ return 0;
+}
+
+char *dev_map_find(__u32 device)
+{
+ char this[128];
+ struct list_head *p;
+
+ sprintf(this, "%u,%u", MAJOR(device), MINOR(device));
+ __list_for_each(p, &all_devmaps) {
+ struct devmap *dmp = list_entry(p, struct devmap, head);
+
+ if (!strcmp(this, dmp->devno))
+ return dmp->device;
+ }
+
+ return NULL;
+}
+
+int dev_map_read(char *fname)
+{
+ char line[256];
+ FILE *fp = my_fopen(fname, "r");
+
+ if (!fp) {
+ perror(fname);
+ return 1;
+ }
+
+ while (fscanf(fp, "%255[a-zA-Z0-9 :.,/_-]\n", line) == 1) {
+ if (dev_map_add(line))
+ break;
+ }
+
+ return 0;
+}
+
+void dev_map_exit(void)
+{
+ struct list_head *p, *q;
+
+ list_for_each_safe(p, q, &all_devmaps) {
+ struct devmap *dmp = list_entry(p, struct devmap, head);
+
+ list_del(&dmp->head);
+ free(dmp);
+ }
+}