#include <linux/list.h>
#undef __KERNEL__
+#include <linux/obd_class.h>
#include <portals/ptlctl.h>
#include "parser.h"
#include <stdio.h>
#define SHMEM_STATS 1
+#define MAX_STRING_SIZE 128
+#define DEVICES_LIST "/proc/fs/lustre/devices"
+
#if SHMEM_STATS
# include <sys/ipc.h>
# include <sys/shm.h>
#endif
static int jt_recording;
-static uint64_t conn_cookie = -1;
static char rawbuf[8192];
static char *buf = rawbuf;
static int max = sizeof(rawbuf);
static int thread;
+static uint32_t cur_device = MAX_OBD_DEVICES;
+
union lsm_buffer {
char space [4096];
struct lov_stripe_md lsm;
static int l2_ioctl(int dev_id, int opc, void *buf)
{
-// if (jt_recording) {
-// struct obd_ioctl_data *data = buf;
-// data->ioc_command = opc;
-// opc = OBD_IOC_DORECORD;
-// }
return l_ioctl(dev_id, opc, buf);
}
#define IOC_INIT(data) \
do { \
memset(&data, 0, sizeof(data)); \
- data.ioc_cookie = conn_cookie; \
+ data.ioc_dev = cur_device; \
} while (0)
#define IOC_PACK(func, data) \
sprintf(buf, "id: "LPX64"\ngrp: "LPX64"\natime: "LPU64"\nmtime: "LPU64
"\nctime: "LPU64"\nsize: "LPU64"\nblocks: "LPU64
"\nblksize: %u\nmode: %o\nuid: %d\ngid: %d\nflags: %x\n"
- "obdflags: %x\nnlink: %d,\nvalid %x\n",
+ "misc: %x\nnlink: %d,\nvalid %x\n",
obd->o_id, obd->o_gr, obd->o_atime, obd->o_mtime, obd->o_ctime,
obd->o_size, obd->o_blocks, obd->o_blksize, obd->o_mode,
- obd->o_uid, obd->o_gid, obd->o_flags, obd->o_obdflags,
+ obd->o_uid, obd->o_gid, obd->o_flags, obd->o_misc,
obd->o_nlink, obd->o_valid);
return strdup(buf);
}
int do_disconnect(char *func, int verbose)
{
+ cur_device = MAX_OBD_DEVICES;
return 0;
}
extern command_t cmdlist[];
-static int do_device(char *func, int dev)
+static int do_device(char *func, char *devname)
{
struct obd_ioctl_data data;
+ int dev;
memset(&data, 0, sizeof(data));
- data.ioc_dev = dev;
+ dev = parse_devname(func, devname);
+ if (dev < 0)
+ return -1;
- IOC_PACK(func, data);
- return l2_ioctl(OBD_DEV_ID, OBD_IOC_DEVICE, buf);
+ cur_device = dev;
+ return 0;
}
int jt_obd_device(int argc, char **argv)
{
- int rc, dev;
+ int rc;
do_disconnect(argv[0], 1);
if (argc != 2)
return CMD_HELP;
- 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", jt_cmdname(argv[0]),
- strerror(rc = errno));
-
+ rc = do_device(argv[0], argv[1]);
return rc;
}
int jt_obd_connect(int argc, char **argv)
{
- struct obd_ioctl_data data;
- int rc;
-
- IOC_INIT(data);
-
- do_disconnect(argv[0], 1);
-
- /* XXX TODO: implement timeout per lctl usage for probe */
- if (argc != 1)
- return CMD_HELP;
-
- IOC_PACK(argv[0], data);
- rc = l2_ioctl(OBD_DEV_ID, OBD_IOC_CONNECT, buf);
- IOC_UNPACK(argv[0], data);
- if (rc < 0)
- fprintf(stderr, "error: %s: OBD_IOC_CONNECT %s\n",
- jt_cmdname(argv[0]), strerror(rc = errno));
- else
- conn_cookie = data.ioc_cookie;
- return rc;
+ return 0;
}
int jt_obd_disconnect(int argc, char **argv)
if (argc != 1)
return CMD_HELP;
- if (conn_cookie == -1)
- return 0;
-
return do_disconnect(argv[0], 0);
}
int jt_opt_device(int argc, char **argv)
{
- char *arg2[3];
int ret;
int rc;
if (argc < 3)
return CMD_HELP;
- rc = do_device("device", parse_devname(argv[0], argv[1]));
-
- if (!rc) {
- arg2[0] = "connect";
- arg2[1] = NULL;
- rc = jt_obd_connect(1, arg2);
- }
+ rc = do_device("device", argv[1]);
if (!rc)
rc = Parser_execarg(argc - 2, argv + 2, cmdlist);
memset(buf, 0, sizeof(buf));
data->ioc_version = OBD_IOCTL_VERSION;
- data->ioc_cookie = conn_cookie;
data->ioc_inllen1 = sizeof(buf) - size_round(sizeof(*data));
data->ioc_len = obd_ioctl_packlen(data);
int jt_obd_list(int argc, char **argv)
{
int rc;
- char buf[OBD_MAX_IOCTL_BUFFER];
- struct obd_ioctl_data *data = (struct obd_ioctl_data *)buf;
-
+ char buf[MAX_STRING_SIZE];
+ FILE *fp = fopen(DEVICES_LIST, "r");
+
+ if (fp == NULL) {
+ fprintf(stderr, "error: %s: %s could not open file "
+ DEVICES_LIST " .\n",
+ jt_cmdname(argv[0]), strerror(rc = errno));
+ return rc;
+ }
+
if (argc != 1)
return CMD_HELP;
-
- memset(buf, 0, sizeof(buf));
- data->ioc_version = OBD_IOCTL_VERSION;
- data->ioc_cookie = conn_cookie;
- data->ioc_inllen1 = sizeof(buf) - size_round(sizeof(*data));
- data->ioc_len = obd_ioctl_packlen(data);
-
- rc = l2_ioctl(OBD_DEV_ID, OBD_IOC_LIST, data);
- if (rc < 0)
- fprintf(stderr, "error: %s: %s\n", jt_cmdname(argv[0]),
- strerror(rc = errno));
- else {
- printf("%s", data->ioc_bulk);
- }
-
- return rc;
+
+ while (fgets(buf, sizeof(buf), fp) != NULL)
+ printf("%s", buf);
+
+ fclose(fp);
+
+ return 0;
}
/* Get echo client's stripe meta-data for the given object
struct timeval start, next_time;
__u64 count, next_count, len, thr_offset = 0, objid = 3;
int write = 0, verbose = 1, cmd, i, rc = 0, pages = 1;
+ int repeat_offset = 0;
char *end;
if (argc < 2 || argc > 7) {
if (argc >= 3) {
if (argv[2][0] == 'w' || argv[2][0] == '1')
write = 1;
- else if (argv[2][0] == 'r' || argv[2][0] == '0')
- write = 0;
+ /* else it's a read */
+
+ if (argv[2][0] != 0 &&
+ argv[2][1] == 'r')
+ repeat_offset = 1;
}
if (argc >= 4) {
cmd = write ? OBD_IOC_BRW_WRITE : OBD_IOC_BRW_READ;
for (i = 1, next_count = verbose; i <= count; i++) {
- data.ioc_obdo1.o_valid &= ~(OBD_MD_FLBLOCKS|OBD_MD_FLRDEV);
+ data.ioc_obdo1.o_valid &= ~(OBD_MD_FLBLOCKS|OBD_MD_FLGRANT);
IOC_PACK(argv[0], data);
rc = l2_ioctl(OBD_DEV_ID, cmd, buf);
SHMEM_BUMP();
printf("%s: %s number %dx%d\n", jt_cmdname(argv[0]),
write ? "write" : "read", i, pages);
- data.ioc_offset += len;
+ if (!repeat_offset)
+ data.ioc_offset += len;
}
if (!rc) {
return rc;
}
+int jt_cfg_clear_log(int argc, char **argv)
+{
+ struct obd_ioctl_data data;
+ int rc;
+
+ IOC_INIT(data);
+
+ if (argc != 2)
+ return CMD_HELP;
+
+ data.ioc_inllen1 = strlen(argv[1]) + 1;
+ data.ioc_inlbuf1 = argv[1];
+
+ IOC_PACK(argv[0], data);
+ rc = l_ioctl(OBD_DEV_ID, OBD_IOC_CLEAR_LOG, buf);
+ if (rc < 0)
+ fprintf(stderr, "OBD_IOC_CLEAR_LOG failed: %s\n",
+ strerror(errno));
+
+ return rc;
+}
+
+
int jt_cfg_endrecord(int argc, char **argv)
{