From 1f6c7e91ce774815808d5616cfa48402f716ebb3 Mon Sep 17 00:00:00 2001 From: rread Date: Tue, 16 Jul 2002 01:49:31 +0000 Subject: [PATCH] - enable command line flags for lctl - device now works --- lustre/utils/debug.c | 12 +++ lustre/utils/device.c | 214 ++++++++++++++------------------------------------ lustre/utils/lctl.c | 150 +++++++++++++++++++++++++++++++++++ lustre/utils/lctl.h | 48 ++++++++--- 4 files changed, 257 insertions(+), 167 deletions(-) diff --git a/lustre/utils/debug.c b/lustre/utils/debug.c index 45c9583..e87a30c 100644 --- a/lustre/utils/debug.c +++ b/lustre/utils/debug.c @@ -43,6 +43,10 @@ #include "lctl.h" +/* current debug flag + */ +int lctl_debug; + static char rawbuf[8192]; static char *buf = rawbuf; static int max = 8192; @@ -431,3 +435,11 @@ int jt_debug_panic(int argc, char **argv) { } return 0; } + +int jt_debug_lctl(int argc, char **argv) { + if (argc == 2) { + lctl_debug = strtoul(argv[1], NULL, 0); + } else + printf("current lctl_debug: 0x%x\n", lctl_debug); + return 0; +} diff --git a/lustre/utils/device.c b/lustre/utils/device.c index 59ba760..57623ae 100644 --- a/lustre/utils/device.c +++ b/lustre/utils/device.c @@ -73,59 +73,59 @@ int device_setup(int argc, char **argv) { } /* Misc support functions */ -static int be_verbose(int verbose, struct timeval *next_time, - int num, int *next_num, int num_total) { - struct timeval now; +static int do_name2dev(char *func, char *name) { + struct obd_ioctl_data data; - if (!verbose) - return 0; + LUSTRE_CONNECT(func); + IOCINIT(data); - if (next_time != NULL) - gettimeofday(&now, NULL); + data.ioc_inllen1 = strlen(name) + 1; + data.ioc_inlbuf1 = name; - /* A positive verbosity means to print every X iterations */ - if (verbose > 0 && - (next_num == NULL || num >= *next_num || num >= num_total)) { - *next_num += verbose; - if (next_time) { - next_time->tv_sec = now.tv_sec - verbose; - next_time->tv_usec = now.tv_usec; - } - return 1; + if (obd_ioctl_pack(&data, &buf, max)) { + fprintf(stderr, "error: %s: invalid ioctl\n", cmdname(func)); + return -2; } - - /* A negative verbosity means to print at most each X seconds */ - if (verbose < 0 && next_time != NULL && difftime(&now, next_time) >= 0){ - next_time->tv_sec = now.tv_sec - verbose; - next_time->tv_usec = now.tv_usec; - if (next_num) - *next_num = num; - return 1; + rc = ioctl(fd, OBD_IOC_NAME2DEV , buf); + if (rc < 0) { + fprintf(stderr, "error: %s: %s - %s\n", cmdname(func), + name, strerror(rc = errno)); + return rc; } - return 0; -} - -static int get_verbose(const char *arg) { - int verbose; - - if (!arg || arg[0] == 'v') - verbose = 1; - else if (arg[0] == 's' || arg[0] == 'q') - verbose = 0; - else - verbose = (int) strtoul(arg, NULL, 0); + memcpy((char *)(&data), buf, sizeof(data)); - if (verbose < 0) - printf("Print status every %d seconds\n", -verbose); - else if (verbose == 1) - printf("Print status every operation\n"); - else if (verbose > 1) - printf("Print status every %d operations\n", verbose); + return data.ioc_dev + N2D_OFF; +} - return verbose; +/* + * resolve a device name to a device number. + * supports a number or name. + * FIXME: support UUID + */ +static int parse_devname(char * func, char *name) +{ + int ret = -1; + + if (!name) + return ret; + if (name[0] == '$') { + rc = do_name2dev(func, name + 1); + if (rc >= N2D_OFF) { + ret = rc - N2D_OFF; + printf("%s is device %d\n", name, + ret); + } else { + fprintf(stderr, "error: %s: %s: %s\n", cmdname(func), + name, "device not found"); + } + + } else + ret = strtoul(name, NULL, 0); + return ret; } + #if 0 /* pack "LL LL LL LL LL LL LL L L L L L L L L L a60 a60 L L L" */ static char * obdo_print(struct obdo *obd) @@ -183,7 +183,7 @@ static int do_device(char *func, int dev) { LUSTRE_CONNECT(func); if (obd_ioctl_pack(&data, &buf, max)) { - fprintf(stderr, "error: %s: invalid ioctl\n", cmdname(func)); + CERROR("error: %s: invalid ioctl\n", cmdname(func)); return -2; } @@ -191,12 +191,16 @@ static int do_device(char *func, int dev) { } int jt_dev_device(int argc, char **argv) { + int dev; do_disconnect(argv[0], 1); if (argc != 2) return CMD_HELP; - - rc = do_device(argv[0], strtoul(argv[1], NULL, 0)); + dev = parse_devname(argv[0], argv[1]); + if (dev < 0) { + return -1; + } + rc = do_device(argv[0], dev); if (rc < 0) fprintf(stderr, "error: %s: %s\n", cmdname(argv[0]), strerror(rc = errno)); @@ -213,31 +217,6 @@ int jt_dev_uuid2dev(int argc, char **argv) { return 0; } -static int do_name2dev(char *func, char *name) { - struct obd_ioctl_data data; - - LUSTRE_CONNECT(func); - IOCINIT(data); - - data.ioc_inllen1 = strlen(name) + 1; - data.ioc_inlbuf1 = name; - - if (obd_ioctl_pack(&data, &buf, max)) { - fprintf(stderr, "error: %s: invalid ioctl\n", cmdname(func)); - return -2; - } - rc = ioctl(fd, OBD_IOC_NAME2DEV , buf); - if (rc < 0) { - fprintf(stderr, "error: %s: %s - %s\n", cmdname(func), - name, strerror(rc = errno)); - return rc; - } - - memcpy((char *)(&data), buf, sizeof(data)); - - return data.ioc_dev + N2D_OFF; -} - int jt_dev_name2dev(int argc, char **argv) { if (argc != 2) @@ -351,8 +330,7 @@ int jt_dev_close(int argc, char **argv) { return do_disconnect(argv[0], 0); } -#if 0 -static int jt__device(int argc, char **argv) +int jt_opt_device(int argc, char **argv) { char *arg2[3]; int ret; @@ -363,12 +341,12 @@ static int jt__device(int argc, char **argv) return -1; } - rc = do_device("device", strtoul(argv[1], NULL, 0)); + rc = do_device("device", parse_devname(argv[0], argv[1])); if (!rc) { arg2[0] = "connect"; arg2[1] = NULL; - rc = jt_connect(1, arg2); + rc = jt_dev_probe(1, arg2); } if (!rc) @@ -381,78 +359,6 @@ static int jt__device(int argc, char **argv) return rc; } -static int jt__threads(int argc, char **argv) -{ - int threads, next_thread; - int verbose; - int i, j; - - if (argc < 5) { - fprintf(stderr, - "usage: %s numthreads verbose devno \n", - argv[0]); - return -1; - } - - threads = strtoul(argv[1], NULL, 0); - - verbose = get_verbose(argv[2]); - - printf("%s: starting %d threads on device %s running %s\n", - argv[0], threads, argv[3], argv[4]); - - for (i = 1, next_thread = verbose; i <= threads; i++) { - rc = fork(); - if (rc < 0) { - fprintf(stderr, "error: %s: #%d - %s\n", argv[0], i, - strerror(rc = errno)); - break; - } else if (rc == 0) { - thread = i; - argv[2] = "--device"; - return jt__device(argc - 2, argv + 2); - } else if (be_verbose(verbose, NULL, i, &next_thread, threads)) - printf("%s: thread #%d (PID %d) started\n", - argv[0], i, rc); - rc = 0; - } - - if (!thread) { /* parent process */ - if (!verbose) - printf("%s: started %d threads\n\n", argv[0], i - 1); - else - printf("\n"); - - for (j = 1; j < i; j++) { - int status; - int ret = wait(&status); - - if (ret < 0) { - fprintf(stderr, "error: %s: wait - %s\n", - argv[0], strerror(errno)); - if (!rc) - rc = errno; - } else { - /* - * This is a hack. We _should_ be able to use - * WIFEXITED(status) to see if there was an - * error, but it appears to be broken and it - * always returns 1 (OK). See wait(2). - */ - int err = WEXITSTATUS(status); - if (err) - fprintf(stderr, - "%s: PID %d had rc=%d\n", - argv[0], ret, err); - if (!rc) - rc = err; - } - } - } - - return rc; -} -#endif int jt_dev_attach(int argc, char **argv) { struct obd_ioctl_data data; @@ -507,15 +413,10 @@ int jt_dev_setup(int argc, char **argv) { data.ioc_dev = -1; if (argc > 1) { - if (argv[1][0] == '$') { - rc = do_name2dev(argv[0], argv[1] + 1); - if (rc >= N2D_OFF) { - printf("%s is device %d\n", argv[1], - rc - N2D_OFF); - data.ioc_dev = rc - N2D_OFF; - } - } else - data.ioc_dev = strtoul(argv[1], NULL, 0); + data.ioc_dev = parse_devname(argv[0], argv[1]); + if (data.ioc_dev < 0) + return rc = -1; + data.ioc_inllen1 = strlen(argv[1]) + 1; data.ioc_inlbuf1 = argv[1]; } @@ -917,3 +818,4 @@ int jt_dev_test_ldlm(int argc, char **argv) { cmdname(argv[0]), strerror(rc = errno)); return rc; } + diff --git a/lustre/utils/lctl.c b/lustre/utils/lctl.c index bba3a52..7b8ed18b 100644 --- a/lustre/utils/lctl.c +++ b/lustre/utils/lctl.c @@ -55,6 +55,8 @@ #include #undef __KERNEL__ +int thread; + command_t cmdlist[]; static int jt_quit(int argc, char **argv) { @@ -67,6 +69,11 @@ static int jt_noop(int argc, char **argv) { } command_t cmdlist[] = { + /* Metacommands */ + {"--device", jt_opt_device, 0, "--device "}, + {"--threads", jt_opt_threads, 0, + "--threads "}, + /* Network configuration commands */ {"==== network config ====", jt_noop, 0, "network config"}, {"network", jt_net_network, 0, "commands that follow apply to net\n" @@ -161,6 +168,9 @@ command_t cmdlist[] = { #endif /* Debug commands */ {"======== debug =========", jt_noop, 0, "debug"}, + {"debug_lctl", jt_debug_lctl, 0, + "set debug status of lctl " + "usage: debug_kernel [file] [raw]"}, {"debug_kernel", jt_debug_kernel, 0, "get debug buffer and dump to a file" "usage: debug_kernel [file] [raw]"}, @@ -200,6 +210,146 @@ static void signal_server(int sig) { } } +int get_verbose(const char *arg) +{ + int verbose; + + if (!arg || arg[0] == 'v') + verbose = 1; + else if (arg[0] == 's' || arg[0] == 'q') + verbose = 0; + else + verbose = (int) strtoul(arg, NULL, 0); + + if (verbose < 0) + printf("Print status every %d seconds\n", -verbose); + else if (verbose == 1) + printf("Print status every operation\n"); + else if (verbose > 1) + printf("Print status every %d operations\n", verbose); + + return verbose; +} + +int be_verbose(int verbose, struct timeval *next_time, + int num, int *next_num, int num_total) +{ + struct timeval now; + + if (!verbose) + return 0; + + if (next_time != NULL) + gettimeofday(&now, NULL); + + /* A positive verbosity means to print every X iterations */ + if (verbose > 0 && + (next_num == NULL || num >= *next_num || num >= num_total)) { + *next_num += verbose; + if (next_time) { + next_time->tv_sec = now.tv_sec - verbose; + next_time->tv_usec = now.tv_usec; + } + return 1; + } + + /* A negative verbosity means to print at most each X seconds */ + if (verbose < 0 && next_time != NULL && difftime(&now, next_time) >= 0){ + next_time->tv_sec = now.tv_sec - verbose; + next_time->tv_usec = now.tv_usec; + if (next_num) + *next_num = num; + return 1; + } + + return 0; +} + +int jt_opt_threads(int argc, char **argv) +{ + int threads, next_thread; + int verbose; + int i, j; + int rc; + + if (argc < 5) { + fprintf(stderr, + "usage: %s numthreads verbose devno \n", + argv[0]); + return -1; + } + + threads = strtoul(argv[1], NULL, 0); + + verbose = get_verbose(argv[2]); + + printf("%s: starting %d threads on device %s running %s\n", + argv[0], threads, argv[3], argv[4]); + + for (i = 1, next_thread = verbose; i <= threads; i++) { + rc = fork(); + if (rc < 0) { + fprintf(stderr, "error: %s: #%d - %s\n", argv[0], i, + strerror(rc = errno)); + break; + } else if (rc == 0) { + thread = i; + argv[2] = "--device"; + return jt_opt_device(argc - 2, argv + 2); + } else if (be_verbose(verbose, NULL, i, &next_thread, threads)) + printf("%s: thread #%d (PID %d) started\n", + argv[0], i, rc); + rc = 0; + } + + if (!thread) { /* parent process */ + if (!verbose) + printf("%s: started %d threads\n\n", argv[0], i - 1); + else + printf("\n"); + + for (j = 1; j < i; j++) { + int status; + int ret = wait(&status); + + if (ret < 0) { + fprintf(stderr, "error: %s: wait - %s\n", + argv[0], strerror(errno)); + if (!rc) + rc = errno; + } else { + /* + * This is a hack. We _should_ be able to use + * WIFEXITED(status) to see if there was an + * error, but it appears to be broken and it + * always returns 1 (OK). See wait(2). + */ + int err = WEXITSTATUS(status); + if (err) + fprintf(stderr, + "%s: PID %d had rc=%d\n", + argv[0], ret, err); + if (!rc) + rc = err; + } + } + } + + return rc; +} + +char *cmdname(char *func) +{ + static char buf[512]; + + if (thread) { + sprintf(buf, "%s-%d", func, thread); + return buf; + } + + return func; +} + int main(int argc, char **argv) { struct sigaction sigact; int rc; diff --git a/lustre/utils/lctl.h b/lustre/utils/lctl.h index 0de7fe9..0014182 100644 --- a/lustre/utils/lctl.h +++ b/lustre/utils/lctl.h @@ -19,6 +19,7 @@ int jt_net_send_mem(int argc, char **argv); int jt_net_nagle(int argc, char **argv); /* Device selection commands */ +int jt_opt_device(int argc, char **argv); int jt_dev_newdev(int argc, char **argv); int jt_dev_uuid2dev(int argc, char **argv); int jt_dev_name2dev(int argc, char **argv); @@ -51,12 +52,47 @@ int jt_debug_show(int argc, char **argv); int jt_debug_list(int argc, char **argv); int jt_debug_modules(int argc, char **argv); int jt_debug_panic(int argc, char **argv); +int jt_debug_lctl(int argc, char **argv); int do_disconnect(char *func, int verbose); int network_setup(int argc, char **argv); int device_setup(int argc, char **argv); int debug_setup(int argc, char **argv); +int jt_opt_threads(int argc, char **argv); +char *cmdname(char *func); +int get_verbose(const char *arg); +int be_verbose(int verbose, struct timeval *next_time, + int num, int *next_num, int num_total); + +#define LCTL_DEBUG +#ifdef LCTL_DEBUG +extern int lctl_debug; +#define D_LCTL 1 + +#ifdef CDEBUG +#undef CDEBUG +#endif +#define CDEBUG(mask, format, a...) \ + do { \ + if (lctl_debug & mask) { \ + printf("(%s:%s L%d): " format, __FILE__, \ + __FUNCTION__, __LINE__ , ## a); \ + } \ + } while (0) +#else /* !LCTL_DEBUG */ +# define CDEBUG(mask, format, a...) do {} while (0) +#endif /* LCTL_DEBUG */ + + +#ifdef CERROR +#undef CERROR +#endif +#define CERROR(format, a...) \ +do { \ + fprintf(stderr, "(%s:%s L%d): " format, __FILE__, __FUNCTION__, \ + __LINE__ , ## a); \ +} while (0) /* So we can tell between error codes and devices */ #define N2D_OFF 0x100 @@ -106,22 +142,12 @@ do { \ ((double)((a)->tv_sec - (b)->tv_sec) + \ ((double)((a)->tv_usec - (b)->tv_usec) / 1000000)) -static inline char *cmdname(char *func) { - static char buf[512]; - int thread = 0; - - if (thread) { - sprintf(buf, "%s-%d", func, thread); - return buf; - } - - return func; -} typedef struct { char *name; int num; } name2num_t; + #endif -- 1.8.3.1