int fd = -1;
-int connid = -1;
+uint64_t conn_addr = -1;
+uint64_t conn_cookie;
char rawbuf[8192];
char *buf = rawbuf;
int max = 8192;
do { \
memset(&data, 0, sizeof(data)); \
data.ioc_version = OBD_IOCTL_VERSION; \
- data.ioc_conn1 = connid; \
+ data.ioc_addr = conn_addr; \
+ data.ioc_cookie = conn_cookie; \
data.ioc_len = sizeof(data); \
if (fd < 0) { \
fprintf(stderr, "No device open, use device\n"); \
return 0;
}
-#if 1
#define difftime(a, b) \
((double)(a)->tv_sec - (b)->tv_sec + \
((double)((a)->tv_usec - (b)->tv_usec) / 1000000))
-#else
-
-#define difftime(a, b) (((a)->tv_sec - (b)->tv_sec) + \
- (((a)->tv_usec - (b)->tv_usec) / 1000000))
-#endif
static int be_verbose(int verbose, struct timeval *next_time,
int num, int *next_num, int num_total)
{
struct obd_ioctl_data data;
- if (connid == -1)
- return 0;
+ if (conn_addr == -1)
+ return 0;
IOCINIT(data);
OBD_IOC_DISCONNECT, strerror(errno));
} else {
if (verbose)
- printf("%s: disconnected connid %d\n", cmdname(func),
- connid);
- connid = -1;
+ printf("%s: disconnected conn %Lx\n", cmdname(func),
+ conn_addr);
+ conn_addr = -1;
}
return rc;
}
static int xml_mds(xmlDocPtr doc, xmlNodePtr root,
- char *serv_id, char *serv_uuid) {
+ char *serv_name, char *serv_uuid) {
xmlNodePtr cur = root->xmlChildrenNode;
char *fstype = NULL, *device = NULL;
int rc;
if (!xmlStrcmp(cur->name, "device"))
device = xmlNodeGetContent(cur);
+ /* FIXME: Parse the network bits
+ * if (!xmlStrcmp(cur->name, "network")) {
+ * net = xml_network(doc, cur);
+ * if (net == NULL)
+ * return -1;
+ * }
+ * free(net);
+ */
cur = cur->next;
}
if ((rc = xml_command("newdev", NULL)) != 0)
return rc;
- if ((rc = xml_command("attach", "mds", "MDSDEV", NULL)) != 0)
+ if ((rc = xml_command("attach","mds",serv_name,serv_uuid,NULL)) != 0)
return rc;
if ((rc = xml_command("setup", device, fstype, NULL)) != 0)
}
static int xml_obd(xmlDocPtr doc, xmlNodePtr root,
- char *serv_id, char *serv_uuid) {
- xmlNodePtr cur = root->xmlChildrenNode;
+ char *serv_name, char *serv_uuid) {
char *obdtype, *format = NULL, *fstype = NULL, *device = NULL;
+ xmlNodePtr cur = root->xmlChildrenNode;
int rc;
obdtype = xmlGetProp(root, "type");
}
if ((obdtype == NULL) || (fstype == NULL) || (device == NULL)) {
- printf("error: 'type' attrib and <fstype> and <device> tags required\n");
+ printf("error: 'type' attrib and <fstype> "
+ "and <device> tags required\n");
return -1;
}
if ((rc = xml_command("newdev", NULL)) != 0)
return rc;
- if ((rc = xml_command("attach", obdtype, "OBDDEV", NULL)) != 0)
+ if ((rc = xml_command("attach", obdtype,
+ serv_name,serv_uuid, NULL)) != 0)
return rc;
if ((rc = xml_command("setup", device, fstype, NULL)) != 0)
}
static int xml_ost(xmlDocPtr doc, xmlNodePtr root,
- char *serv_id, char *serv_uuid) {
- int rc;
+ char *serv_name, char *serv_uuid) {
+ char *server_name = NULL, *server_uuid = NULL;
+ char *failover_name = NULL, *failover_uuid = NULL;
+ xmlNodePtr cur = root->xmlChildrenNode;
+ int server_num, failover_num, rc;
printf("--- Setting up OST ---\n");
+ while (cur != NULL) {
+ if (!xmlStrcmp(cur->name, "server_id")) {
+ server_num = atoi(xmlGetProp(cur, "num"));
+ server_name = xmlGetProp(cur, "name");
+ server_uuid = xmlGetProp(cur, "uuid");
+ }
+
+ /* FIXME: Properly handle multiple failover servers */
+ if (!xmlStrcmp(cur->name, "failover_id")) {
+ failover_num = atoi(xmlGetProp(cur, "num"));
+ failover_name = xmlGetProp(cur, "name");
+ failover_uuid = xmlGetProp(cur, "uuid");
+ }
+
+ cur = cur->next;
+ }
+
+ if ((server_name == NULL) || (server_uuid == NULL)) {
+ printf("error: atleast the <server_id> tag is required\n");
+ return -1;
+ }
+
if ((rc = xml_command("newdev", NULL)) != 0)
return rc;
- if ((rc = xml_command("attach", "ost", "OSTDEV", NULL)) != 0)
+ if ((rc = xml_command("attach","ost",serv_name,serv_uuid,NULL)) != 0)
return rc;
- if ((rc = xml_command("setup", "$OBDDEV", NULL)) != 0)
+ if ((rc = xml_command("setup", server_name, NULL)) != 0)
return rc;
return 0;
}
static int xml_osc(xmlDocPtr doc, xmlNodePtr root,
- char *serv_id, char *serv_uuid) {
+ char *serv_name, char *serv_uuid) {
+ char *ost_name = NULL, *ost_uuid = NULL;
xmlNodePtr cur = root->xmlChildrenNode;
- network_t *net = NULL;
- int rc = 0;
+ int ost_num, rc = 0;
printf("--- Setting up OSC ---\n");
while (cur != NULL) {
- if (!xmlStrcmp(cur->name, "network")) {
- net = xml_network(doc, cur);
- if (net == NULL)
- return -1;
+ if (!xmlStrcmp(cur->name, "service_id")) {
+ ost_num = atoi(xmlGetProp(cur, "num"));
+ ost_name = xmlGetProp(cur, "name");
+ ost_uuid = xmlGetProp(cur, "uuid");
}
+
cur = cur->next;
}
- if (net == NULL) {
- printf("error: <network> tag required\n");
+ if ((ost_name == NULL) || (ost_uuid == NULL)) {
+ printf("error: atleast the <service_id> tag is required\n");
return -1;
}
- if ((rc = xml_command("newdev", NULL)) != 0) {
- rc = -1;
- goto xml_osc_error;
- }
+ if ((rc = xml_command("newdev", NULL)) != 0)
+ return rc;
- if ((rc = xml_command("attach", "osc", "OSCDEV", NULL)) != 0) {
- rc = -1;
- goto xml_osc_error;
- }
+ if ((rc = xml_command("attach","osc",serv_name,serv_uuid,NULL)) != 0)
+ return rc;
- if ((rc = xml_command("setup", "OSTDEV", net->server, NULL)) != 0) {
- rc = -1;
- goto xml_osc_error;
- }
+ if ((rc = xml_command("setup", ost_uuid, "localhost", NULL)) != 0)
+ return rc;
-xml_osc_error:
- free(net);
- return rc;
+ return 0;
}
static int xml_mdc(xmlDocPtr doc, xmlNodePtr root,
- char *serv_id, char *serv_uuid) {
+ char *serv_name, char *serv_uuid) {
+ char *mds_name = NULL, *mds_uuid = NULL;
xmlNodePtr cur = root->xmlChildrenNode;
- network_t *net = NULL;
- int rc = 0;
+ int mds_num, rc = 0;
printf("--- Setting up MDC ---\n");
while (cur != NULL) {
- if (!xmlStrcmp(cur->name, "network")) {
- net = xml_network(doc, cur);
- if (net == NULL)
- return -1;
+ if (!xmlStrcmp(cur->name, "service_id")) {
+ mds_num = atoi(xmlGetProp(cur, "num"));
+ mds_name = xmlGetProp(cur, "name");
+ mds_uuid = xmlGetProp(cur, "uuid");
}
+
cur = cur->next;
}
- if (net == NULL) {
- printf("error: <network> tag required\n");
+ if ((mds_name == NULL) || (mds_uuid == NULL)) {
+ printf("error: atleast the <service_id> tag is required\n");
return -1;
}
- if ((rc = xml_command("newdev", NULL)) != 0) {
- rc = -1;
- goto xml_mdc_error;
- }
-
- if ((rc = xml_command("attach", "mdc", "MDCDEV", NULL)) != 0) {
- rc = -1;
- goto xml_mdc_error;
- }
+ if ((rc = xml_command("newdev", NULL)) != 0)
+ return rc;
- if ((rc = xml_command("setup", "MDSDEV", net->server, NULL)) != 0) {
- rc = -1;
- goto xml_mdc_error;
- }
+ if ((rc = xml_command("attach","mdc",serv_name,serv_uuid,NULL)) != 0)
+ return rc;
-xml_mdc_error:
- free(net);
- return rc;
+ if ((rc = xml_command("setup", mds_uuid, "localhost", NULL)) != 0)
+ return rc;
+
+ return 0;
}
static int xml_lov(xmlDocPtr doc, xmlNodePtr root,
- char *serv_id, char *serv_uuid) {
+ char *serv_name, char *serv_uuid) {
printf("--- Setting up LOV ---\n");
return 0;
}
static int xml_router(xmlDocPtr doc, xmlNodePtr root,
- char *serv_id, char *serv_uuid) {
+ char *serv_name, char *serv_uuid) {
printf("--- Setting up ROUTER ---\n");
return 0;
}
static int xml_ldlm(xmlDocPtr doc, xmlNodePtr root,
- char *serv_id, char *serv_uuid) {
+ char *serv_name, char *serv_uuid) {
int rc;
printf("--- Setting up LDLM ---\n");
if ((rc = xml_command("newdev", NULL)) != 0)
return rc;
- if ((rc = xml_command("attach", "ldlm", "LDLMDEV", NULL)) != 0)
+ if ((rc = xml_command("attach","ldlm",serv_name,serv_uuid,NULL)) != 0)
return rc;
if ((rc = xml_command("setup", NULL)) != 0)
}
static int xml_service(xmlDocPtr doc, xmlNodePtr root,
- int serv_num, char *serv_id, char *serv_uuid) {
+ int serv_num, char *serv_name, char *serv_uuid) {
xmlNodePtr cur = root;
- char *id, *uuid;
+ char *name, *uuid;
while (cur != NULL) {
- id = xmlGetProp(cur, "id");
+ name = xmlGetProp(cur, "name");
uuid = xmlGetProp(cur, "uuid");
- if (xmlStrcmp(id, serv_id) ||
+ if (xmlStrcmp(name, serv_name) ||
xmlStrcmp(uuid, serv_uuid)) {
cur = cur->next;
continue;
}
if (!xmlStrcmp(cur->name, "mds"))
- return xml_mds(doc, cur, serv_id, serv_uuid);
+ return xml_mds(doc, cur, name, uuid);
else if (!xmlStrcmp(cur->name, "obd"))
- return xml_obd(doc, cur, serv_id, serv_uuid);
+ return xml_obd(doc, cur, name, uuid);
else if (!xmlStrcmp(cur->name, "ost"))
- return xml_ost(doc, cur, serv_id, serv_uuid);
+ return xml_ost(doc, cur, name, uuid);
else if (!xmlStrcmp(cur->name, "osc"))
- return xml_osc(doc, cur, serv_id, serv_uuid);
+ return xml_osc(doc, cur, name, uuid);
else if (!xmlStrcmp(cur->name, "mdc"))
- return xml_mdc(doc, cur, serv_id, serv_uuid);
+ return xml_mdc(doc, cur, name, uuid);
else if (!xmlStrcmp(cur->name, "lov"))
- return xml_lov(doc, cur, serv_id, serv_uuid);
+ return xml_lov(doc, cur, name, uuid);
else if (!xmlStrcmp(cur->name, "router"))
- return xml_router(doc, cur, serv_id, serv_uuid);
+ return xml_router(doc, cur, name, uuid);
else if (!xmlStrcmp(cur->name, "ldlm"))
- return xml_ldlm(doc, cur, serv_id, serv_uuid);
+ return xml_ldlm(doc, cur, name, uuid);
else
return -1;
cur = cur->next;
}
- printf("error: No XML config branch for id=%s uuid=%s\n",
- serv_id, serv_uuid);
+ printf("error: No XML config branch for name=%s uuid=%s\n",
+ serv_name, serv_uuid);
return -1;
}
static int xml_profile(xmlDocPtr doc, xmlNodePtr root,
- int prof_num, char *prof_id, char *prof_uuid) {
+ int prof_num, char *prof_name, char *prof_uuid) {
xmlNodePtr parent, cur = root;
- char *id, *uuid, *srv_id, *srv_uuid;
+ char *name, *uuid, *srv_name, *srv_uuid;
int rc = 0, num;
while (cur != NULL) {
- id = xmlGetProp(cur, "id");
+ name = xmlGetProp(cur, "name");
uuid = xmlGetProp(cur, "uuid");
if (xmlStrcmp(cur->name, "profile") ||
- xmlStrcmp(id, prof_id) ||
+ xmlStrcmp(name, prof_name) ||
xmlStrcmp(uuid, prof_uuid)) {
cur = cur->next;
continue;
if (!xmlStrcmp(cur->name, "service_id")) {
num = atoi(xmlGetProp(cur, "num"));
rc = xml_service(doc, root, num,
- srv_id = xmlGetProp(cur, "id"),
+ srv_name = xmlGetProp(cur, "name"),
srv_uuid = xmlGetProp(cur, "uuid"));
if (rc != 0) {
printf("error: service config\n");
static int xml_node(xmlDocPtr doc, xmlNodePtr root) {
xmlNodePtr parent, cur = root;
- char *id, *uuid;
+ char *name, *uuid;
int rc = 0, num;
/* Walk the node tags looking for ours */
continue;
}
- id = xmlGetProp(cur, "id");
- if (id == NULL)
+ name = xmlGetProp(cur, "name");
+ if (name == NULL)
return -1;
uuid = xmlGetProp(cur, "uuid");
if (uuid == NULL)
return -1;
- /* FIXME: Verify our ID and UUID against /etc/lustre/id
+ /* FIXME: Verify our NAME and UUID against /etc/lustre/id
* so we're sure we are who we think we are.
*/
if (!xmlStrcmp(cur->name, "profile_id")) {
num = atoi(xmlGetProp(cur, "num"));
rc = xml_profile(doc, root, num,
- xmlGetProp(cur, "id"),
+ xmlGetProp(cur, "name"),
xmlGetProp(cur, "uuid"));
if (rc != 0)
return rc;
fprintf(stderr, "error: %s: %x %s\n", cmdname(argv[0]),
OBD_IOC_CONNECT, strerror(rc = errno));
else
- connid = data.ioc_conn1;
-
+ conn_addr = data.ioc_addr;
+ conn_cookie = data.ioc_cookie;
return rc;
}
return -1;
}
+ if (conn_addr == -1)
+ return 0;
+
return do_disconnect(argv[0], 0);
}
return rc;
}
+static int jt_list(int argc, char **argv)
+{
+ char buf[1024];
+ struct obd_ioctl_data *data = (struct obd_ioctl_data *)buf;
+
+ if (getfd(argv[0]))
+ return -1;
+
+ memset(buf, 0, sizeof(buf));
+ data->ioc_version = OBD_IOCTL_VERSION;
+ data->ioc_addr = conn_addr;
+ data->ioc_cookie = conn_addr;
+ data->ioc_len = sizeof(buf);
+ data->ioc_inllen1 = sizeof(buf) - size_round(sizeof(*data));
+
+ if (argc != 1) {
+ fprintf(stderr, "usage: %s\n", cmdname(argv[0]));
+ return -1;
+ }
+
+ rc = ioctl(fd, OBD_IOC_LIST , data);
+ if (rc < 0)
+ fprintf(stderr, "error: %s: %s\n", cmdname(argv[0]),
+ strerror(rc=errno));
+ else {
+ printf("%s", data->ioc_bulk);
+ }
+
+ return rc;
+}
+
static int jt_attach(int argc, char **argv)
{
struct obd_ioctl_data data;
IOCINIT(data);
- if (argc != 2 && argc != 3) {
+ if (argc != 2 && argc != 3 && argc != 4) {
fprintf(stderr, "usage: %s type [name [uuid]]\n",
cmdname(argv[0]));
return -1;
data.ioc_inllen1 = strlen(argv[1]) + 1;
data.ioc_inlbuf1 = argv[1];
- if (argc == 3) {
+ if (argc >= 3) {
data.ioc_inllen2 = strlen(argv[2]) + 1;
data.ioc_inlbuf2 = argv[2];
}
+ if (argc == 4) {
+ data.ioc_inllen3 = strlen(argv[3]) + 1;
+ data.ioc_inlbuf3 = argv[3];
+ }
+
if (obd_ioctl_pack(&data, &buf, max)) {
fprintf(stderr, "error: %s: invalid ioctl\n", cmdname(argv[0]));
return -2;
return -2;
}
IOCINIT(data);
- data.ioc_conn2 = connid;
data.ioc_obdo1.o_id = 2;
data.ioc_count = len;
data.ioc_offset = 0;
"--threads <threads> <devno> <command [args ...]>"},
/* Device configuration commands */
+ {"list", jt_list, 0, "list the devices (no args)"},
{"newdev", jt_newdev, 0, "set device to a new unused obd (no args)"},
{"device", jt_device, 0, "set current device (args device_no name)"},
{"name2dev", jt_name2dev, 0, "set device by name (args name)"},