On Sat, Oct 29, 2011 at 12:48:11AM -0000, Dmitry Monakhov wrote: > Currently the only way to log fsstress's output is to redirect it's shared > stdout to pipe which is very painfull because: > > 1) Pipe writers are serialized via i_mutex so we waste cpu-cores power on stupid > sinchronization for loging purpose, instead of hunting real race conditions, > and bugs inside file system. > 2) Usually output is corrupted due to luck of sychronization on shared stdout. > > Since fsstress's children operate on independend paths, let's just open didicated > log file for each child and simply avoid useless sycnhronization. > > Reviewed-by: Christoph Hellwig <hch@xxxxxx> > Signed-off-by: Dmitry Monakhov <dmonakhov@xxxxxxxxxx> > > --- > ltp/fsstress.c | 33 ++++++++++++++++++++++++++++++++- > 1 files changed, 32 insertions(+), 1 deletions(-) > > diff --git a/ltp/fsstress.c b/ltp/fsstress.c > index 51ecda2..c7001f3 100644 > --- a/ltp/fsstress.c > +++ b/ltp/fsstress.c > @@ -258,6 +258,8 @@ int main(int argc, char **argv) > char buf[10]; > int c; > char *dirname = NULL; > + char *logname = NULL; > + char rpath[PATH_MAX]; > int fd; > int i; > int j; > @@ -273,7 +275,7 @@ int main(int argc, char **argv) > nops = sizeof(ops) / sizeof(ops[0]); > ops_end = &ops[nops]; > myprog = argv[0]; > - while ((c = getopt(argc, argv, "d:e:f:i:m:n:p:rs:vwzHS")) != -1) { > + while ((c = getopt(argc, argv, "d:e:f:i:m:n:o:p:rs:vwzHS")) != -1) { > switch (c) { > case 'd': > dirname = optarg; > @@ -311,6 +313,10 @@ int main(int argc, char **argv) > case 'n': > operations = atoi(optarg); > break; > + case 'o': > + logname = optarg; > + break; > + > case 'p': > nproc = atoi(optarg); > break; > @@ -351,10 +357,26 @@ int main(int argc, char **argv) > } > > (void)mkdir(dirname, 0777); > + if (logname && logname[0] != '/') { > + if (getcwd(rpath, sizeof(rpath)) < 0){ > + perror("getcwd failed"); > + exit(1); > + } > + } else { > + rpath[0] = '\0'; > + } > if (chdir(dirname) < 0) { > perror(dirname); > exit(1); > } > + if (logname) { > + char path[PATH_MAX]; > + snprintf(path, sizeof(path), "%s/%s", rpath, logname); > + if (freopen(path, "a", stdout) == NULL) { > + perror("freopen logfile failed"); > + exit(1); > + } > + } > sprintf(buf, "fss%x", (unsigned int)getpid()); > fd = creat(buf, 0666); > if (lseek64(fd, (off64_t)(MAXFSIZE32 + 1ULL), SEEK_SET) < 0) > @@ -409,6 +431,15 @@ int main(int argc, char **argv) > close(fd); > for (i = 0; i < nproc; i++) { > if (fork() == 0) { > + if (logname) { > + char path[PATH_MAX]; > + snprintf(path, sizeof(path), "%s/%s.%d", > + rpath, logname, i); > + if (freopen(path, "a", stdout) == NULL) { > + perror("freopen logfile failed"); > + exit(1); > + } > + } > procid = i; > doproc(); > return 0; Looks good to me. Reviewed-By: Phil White <pwhite@xxxxxxx> Tested-By: Phil White <pwhite@xxxxxxx> _______________________________________________ xfs mailing list xfs@xxxxxxxxxxx http://oss.sgi.com/mailman/listinfo/xfs