+ if (rc != 0)
+ fprintf (stderr, "Error: %s: rc %d(%s)\n",
+ cmdname (argv[0]), rc, strerror (errno));
+
+ return (0);
+}
+
+/* Create one or more objects, arg[4] may describe stripe meta-data. If
+ * not, defaults assumed. This echo-client instance stashes the stripe
+ * object ids. Use get_stripe on this node to print full lsm and
+ * set_stripe on another node to cut/paste between nodes.
+ */
+int jt_obd_create(int argc, char **argv)
+{
+ static __u64 base_id = 1;
+
+ struct obd_ioctl_data data;
+ struct timeval next_time;
+ __u64 count = 1, next_count;
+ int verbose = 1, mode = 0100644, rc = 0, i;
+ char *end;
+
+ IOC_INIT(data);
+ if (argc < 2 || argc > 5)
+ return CMD_HELP;
+
+ count = strtoull(argv[1], &end, 0);
+ if (*end) {
+ fprintf(stderr, "error: %s: invalid iteration count '%s'\n",
+ cmdname(argv[0]), argv[1]);
+ return CMD_HELP;
+ }
+
+ if (argc > 2) {
+ mode = strtoul(argv[2], &end, 0);
+ if (*end) {
+ fprintf(stderr, "error: %s: invalid mode '%s'\n",
+ cmdname(argv[0]), argv[2]);
+ return CMD_HELP;
+ }
+ if (!(mode & S_IFMT))
+ mode |= S_IFREG;
+ }
+
+ if (argc > 3) {
+ verbose = get_verbose(argv[0], argv[3]);
+ if (verbose == BAD_VERBOSE)
+ return CMD_HELP;
+ }
+
+ if (argc < 5)
+ reset_lsmb (&lsm_buffer); /* will set default */
+ else {
+ rc = parse_lsm (&lsm_buffer, argv[4]);
+ if (rc != 0) {
+ fprintf(stderr, "error: %s: invalid lsm '%s'\n",
+ cmdname(argv[0]), argv[4]);
+ return CMD_HELP;
+ }
+ base_id = lsm_buffer.lsm.lsm_object_id;
+ }
+
+ printf("%s: "LPD64" objects\n", cmdname(argv[0]), count);
+ gettimeofday(&next_time, NULL);
+ next_time.tv_sec -= verbose;
+
+ for (i = 1, next_count = verbose; i <= count; i++) {
+ data.ioc_obdo1.o_mode = mode;
+ data.ioc_obdo1.o_id = base_id++;
+ data.ioc_obdo1.o_uid = 0;
+ data.ioc_obdo1.o_gid = 0;
+ data.ioc_obdo1.o_valid = OBD_MD_FLTYPE | OBD_MD_FLMODE |
+ OBD_MD_FLID | OBD_MD_FLUID | OBD_MD_FLGID;
+
+ data.ioc_plen1 = sizeof (lsm_buffer);
+ data.ioc_pbuf1 = (char *)&lsm_buffer;
+
+ IOC_PACK(argv[0], data);
+ rc = l_ioctl(OBD_DEV_ID, OBD_IOC_CREATE, buf);
+ IOC_UNPACK(argv[0], data);
+ SHMEM_BUMP();
+ if (rc < 0) {
+ fprintf(stderr, "error: %s: #%d - %s\n",
+ cmdname(argv[0]), i, strerror(rc = errno));
+ break;
+ }
+ if (!(data.ioc_obdo1.o_valid & OBD_MD_FLID)) {
+ fprintf(stderr, "error: %s: objid not valid #%d:%08x\n",
+ cmdname(argv[0]), i, data.ioc_obdo1.o_valid);
+ rc = EINVAL;
+ break;
+ }
+
+ if (be_verbose(verbose, &next_time, i, &next_count, count))
+ printf("%s: #%d is object id "LPX64"\n",
+ cmdname(argv[0]), i, data.ioc_obdo1.o_id);
+ }
+ return rc;
+}
+
+int jt_obd_setattr(int argc, char **argv)
+{
+ struct obd_ioctl_data data;
+ char *end;
+ int rc;
+
+ IOC_INIT(data);
+ if (argc != 2)
+ return CMD_HELP;
+
+ data.ioc_obdo1.o_id = strtoull(argv[1], &end, 0);
+ if (*end) {
+ fprintf(stderr, "error: %s: invalid objid '%s'\n",
+ cmdname(argv[0]), argv[1]);
+ return CMD_HELP;
+ }
+ data.ioc_obdo1.o_mode = S_IFREG | strtoul(argv[2], &end, 0);
+ if (*end) {
+ fprintf(stderr, "error: %s: invalid mode '%s'\n",
+ cmdname(argv[0]), argv[2]);
+ return CMD_HELP;
+ }
+ data.ioc_obdo1.o_valid = OBD_MD_FLID | OBD_MD_FLTYPE | OBD_MD_FLMODE;
+
+ IOC_PACK(argv[0], data);
+ rc = l_ioctl(OBD_DEV_ID, OBD_IOC_SETATTR, buf);
+ if (rc < 0)
+ fprintf(stderr, "error: %s: %s\n", cmdname(argv[0]),
+ strerror(rc = errno));
+
+ return rc;
+}
+
+int jt_obd_destroy(int argc, char **argv)
+{
+ struct obd_ioctl_data data;
+ struct timeval next_time;
+ __u64 count = 1, next_count;
+ int verbose = 1;
+ __u64 id;
+ char *end;
+ int rc = 0, i;
+
+ IOC_INIT(data);
+ if (argc < 2 || argc > 4)
+ return CMD_HELP;
+
+ id = strtoull(argv[1], &end, 0);
+ if (*end) {
+ fprintf(stderr, "error: %s: invalid objid '%s'\n",
+ cmdname(argv[0]), argv[1]);
+ return CMD_HELP;
+ }
+ if (argc > 2) {
+ count = strtoull(argv[2], &end, 0);
+ if (*end) {
+ fprintf(stderr,
+ "error: %s: invalid iteration count '%s'\n",
+ cmdname(argv[0]), argv[2]);
+ return CMD_HELP;
+ }
+ }
+
+ if (argc > 3) {
+ verbose = get_verbose(argv[0], argv[3]);
+ if (verbose == BAD_VERBOSE)
+ return CMD_HELP;
+ }
+
+ printf("%s: "LPD64" objects\n", cmdname(argv[0]), count);
+ gettimeofday(&next_time, NULL);
+ next_time.tv_sec -= verbose;
+
+ for (i = 1, next_count = verbose; i <= count; i++, id++) {
+ data.ioc_obdo1.o_id = id;
+ data.ioc_obdo1.o_mode = S_IFREG | 0644;
+ data.ioc_obdo1.o_valid = OBD_MD_FLID | OBD_MD_FLMODE;
+
+ IOC_PACK(argv[0], data);
+ rc = l_ioctl(OBD_DEV_ID, OBD_IOC_DESTROY, buf);
+ IOC_UNPACK(argv[0], data);
+ SHMEM_BUMP();
+ if (rc < 0) {
+ fprintf(stderr, "error: %s: objid "LPX64": %s\n",
+ cmdname(argv[0]), id, strerror(rc = errno));
+ break;
+ }
+
+ if (be_verbose(verbose, &next_time, i, &next_count, count))
+ printf("%s: #%d is object id "LPX64"\n",
+ cmdname(argv[0]), i, id);
+ }
+
+ return rc;