+int jt_obd_mdc_lookup(int argc, char **argv)
+{
+ struct obd_ioctl_data data;
+ char *parent, *child;
+ int rc, fd, verbose = 1;
+
+ if (argc < 3 || argc > 4)
+ return CMD_HELP;
+
+ parent = argv[1];
+ child = argv[2];
+ if (argc == 4)
+ verbose = get_verbose(argv[0], argv[3]);
+
+ IOC_INIT(data);
+
+ data.ioc_inllen1 = strlen(child) + 1;
+ data.ioc_inlbuf1 = child;
+
+ IOC_PACK(argv[0], data);
+
+ fd = open(parent, O_RDONLY);
+ if (fd < 0) {
+ fprintf(stderr, "open \"%s\" failed: %s\n", parent,
+ strerror(errno));
+ return -1;
+ }
+
+ rc = ioctl(fd, IOC_MDC_LOOKUP, buf);
+ if (rc < 0) {
+ fprintf(stderr, "error: %s: ioctl error: %s\n",
+ cmdname(argv[0]), strerror(rc = errno));
+ }
+ close(fd);
+
+ if (verbose) {
+ IOC_UNPACK(argv[0], data);
+ printf("%s: mode %o uid %d gid %d\n", child,
+ data.ioc_obdo1.o_mode, data.ioc_obdo1.o_uid,
+ data.ioc_obdo1.o_gid);
+ }
+
+ return rc;
+}
+
+static
+int do_add_uuid(char * func, char *uuid, ptl_nid_t nid, int nal)
+{
+ char tmp[64];
+ int rc;
+ struct obd_ioctl_data data;
+
+ IOC_INIT(data);
+ data.ioc_nid = nid;
+ data.ioc_inllen1 = strlen(uuid) + 1;
+ data.ioc_inlbuf1 = uuid;
+ data.ioc_nal = nal;
+
+ IOC_PACK(func, data);
+ rc = l_ioctl(OBD_DEV_ID, OBD_IOC_ADD_UUID, buf);
+ if (rc) {
+ fprintf(stderr, "IOC_PORTAL_ADD_UUID failed: %s\n",
+ strerror(errno));
+ return -1;
+ }
+
+ printf ("Added uuid %s: %s\n", uuid, ptl_nid2str (tmp, nid));
+ return 0;
+}
+
+int jt_obd_add_uuid(int argc, char **argv)
+{
+ ptl_nid_t nid = 0;
+ int nal;
+
+ if (argc != 4) {
+ return CMD_HELP;
+ }
+
+ if (ptl_parse_nid (&nid, argv[2]) != 0) {
+ fprintf (stderr, "Can't parse NID %s\n", argv[2]);
+ return (-1);
+ }
+
+ nal = ptl_name2nal(argv[3]);
+
+ if (nal <= 0) {
+ fprintf (stderr, "Can't parse NAL %s\n", argv[3]);
+ return -1;
+ }
+
+ return do_add_uuid(argv[0], argv[1], nid, nal);
+}
+
+int jt_obd_close_uuid(int argc, char **argv)
+{
+ int rc, nal;
+ struct obd_ioctl_data data;
+
+ if (argc != 3) {
+ fprintf(stderr, "usage: %s <uuid> <net-type>\n", argv[0]);
+ return 0;
+ }
+
+ nal = ptl_name2nal(argv[2]);
+
+ if (nal <= 0) {
+ fprintf (stderr, "Can't parse NAL %s\n", argv[2]);
+ return -1;
+ }
+
+ IOC_INIT(data);
+ data.ioc_inllen1 = strlen(argv[1]) + 1;
+ data.ioc_inlbuf1 = argv[1];
+ data.ioc_nal = nal;
+
+ IOC_PACK(argv[0], data);
+ rc = l_ioctl(OBD_DEV_ID, OBD_IOC_CLOSE_UUID, buf);
+ if (rc) {
+ fprintf(stderr, "IOC_PORTAL_CLOSE_UUID failed: %s\n",
+ strerror(errno));
+ return -1;
+ }
+ return 0;
+}
+
+
+int jt_obd_del_uuid(int argc, char **argv)
+{
+ int rc;
+ struct obd_ioctl_data data;
+
+ if (argc != 2) {
+ fprintf(stderr, "usage: %s <uuid>\n", argv[0]);
+ return 0;
+ }
+
+ IOC_INIT(data);
+
+ if (strcmp (argv[1], "_all_"))
+ {
+ 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_DEL_UUID, buf);
+ if (rc) {
+ fprintf(stderr, "IOC_PORTAL_DEL_UUID failed: %s\n",
+ strerror(errno));
+ return -1;
+ }
+ return 0;
+}
+