X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=blktrace.c;h=1b9bf3b8452c51a40612917179d00977dc231513;hp=f22ab1b9f2bfb96ffe057884091c534c6848a12b;hb=33765372d5588c347e44d868d0bd6bc416a0fd05;hpb=ff58fcede39d16a2c642897cbe5a7f28b2da1950 diff --git a/blktrace.c b/blktrace.c index f22ab1b9..1b9bf3b8 100644 --- a/blktrace.c +++ b/blktrace.c @@ -97,7 +97,8 @@ int is_blktrace(const char *filename) return 0; } -static int lookup_device(char *path, unsigned int maj, unsigned int min) +static int lookup_device(struct thread_data *td, char *path, unsigned int maj, + unsigned int min) { struct dirent *dir; struct stat st; @@ -114,14 +115,14 @@ static int lookup_device(char *path, unsigned int maj, unsigned int min) if (!strcmp(dir->d_name, ".") || !strcmp(dir->d_name, "..")) continue; - sprintf(full_path, "%s/%s", path, dir->d_name); + sprintf(full_path, "%s%s%s", path, FIO_OS_PATH_SEPARATOR, dir->d_name); if (lstat(full_path, &st) == -1) { perror("lstat"); break; } if (S_ISDIR(st.st_mode)) { - found = lookup_device(full_path, maj, min); + found = lookup_device(td, full_path, maj, min); if (found) { strcpy(path, full_path); break; @@ -131,6 +132,20 @@ static int lookup_device(char *path, unsigned int maj, unsigned int min) if (!S_ISBLK(st.st_mode)) continue; + /* + * If replay_redirect is set then always return this device + * upon lookup which overrides the device lookup based on + * major minor in the actual blktrace + */ + if (td->o.replay_redirect) { + dprint(FD_BLKTRACE, "device lookup: %d/%d\n overridden" + " with: %s", maj, min, + td->o.replay_redirect); + strcpy(path, td->o.replay_redirect); + found = 1; + break; + } + if (maj == major(st.st_rdev) && min == minor(st.st_rdev)) { dprint(FD_BLKTRACE, "device lookup: %d/%d\n", maj, min); strcpy(path, full_path); @@ -153,6 +168,7 @@ static void trace_add_open_event(struct thread_data *td, int fileno) struct io_piece *ipo; ipo = calloc(1, sizeof(*ipo)); + init_ipo(ipo); ipo->ddir = DDIR_INVAL; ipo->fileno = fileno; @@ -183,7 +199,7 @@ static void trace_add_file(struct thread_data *td, __u32 device) return; strcpy(dev, "/dev"); - if (lookup_device(dev, maj, min)) { + if (lookup_device(td, dev, maj, min)) { int fileno; dprint(FD_BLKTRACE, "add devices %s\n", dev); @@ -200,8 +216,8 @@ static void store_ipo(struct thread_data *td, unsigned long long offset, { struct io_piece *ipo = malloc(sizeof(*ipo)); - memset(ipo, 0, sizeof(*ipo)); - INIT_FLIST_HEAD(&ipo->list); + init_ipo(ipo); + /* * the 512 is wrong here, it should be the hardware sector size... */ @@ -241,6 +257,7 @@ static void handle_trace_discard(struct thread_data *td, struct blk_io_trace *t, { struct io_piece *ipo = malloc(sizeof(*ipo)); + init_ipo(ipo); trace_add_file(td, t->device); ios[DDIR_WRITE]++;