Whamcloud - gitweb
land b_ost_amd onto HEAD.
[fs/lustre-release.git] / lustre / utils / obd.c
index fb5db7b..c1dbacd 100644 (file)
@@ -781,7 +781,8 @@ int jt_obd_list(int argc, char **argv)
         FILE *fp = fopen(DEVICES_LIST, "r");
 
         if (fp == NULL) {
-                fprintf(stderr, "error: %s: %s opening "DEVICES_LIST"\n",
+                fprintf(stderr, "error: %s: %s could not open file "
+                        DEVICES_LIST " .\n",
                         jt_cmdname(argv[0]), strerror(rc =  errno));
                 return rc;
         }
@@ -1399,6 +1400,7 @@ int jt_obd_lov_getconfig(int argc, char **argv)
         struct obd_ioctl_data data;
         struct lov_desc desc;
         struct obd_uuid *uuidarray;
+        __u32 *obdgens;
         char *path;
         int rc, fd;
 
@@ -1412,13 +1414,13 @@ int jt_obd_lov_getconfig(int argc, char **argv)
         if (fd < 0) {
                 fprintf(stderr, "open \"%s\" failed: %s\n", path,
                         strerror(errno));
-                return -1;
+                return -errno;
         }
 
         memset(&desc, 0, sizeof(desc));
         obd_str2uuid(&desc.ld_uuid, argv[1]);
         desc.ld_tgt_count = ((OBD_MAX_IOCTL_BUFFER-sizeof(data)-sizeof(desc)) /
-                             sizeof(*uuidarray));
+                             (sizeof(*uuidarray) + sizeof(*obdgens)));
 
 repeat:
         uuidarray = calloc(desc.ld_tgt_count, sizeof(*uuidarray));
@@ -1428,27 +1430,38 @@ repeat:
                 rc = -ENOMEM;
                 goto out;
         }
+        obdgens = calloc(desc.ld_tgt_count, sizeof(*obdgens));
+        if (!obdgens) {
+                fprintf(stderr, "error: %s: no memory for %d generation #'s\n",
+                        jt_cmdname(argv[0]), desc.ld_tgt_count);
+                rc = -ENOMEM;
+                goto out_uuidarray;
+        }
 
         data.ioc_inllen1 = sizeof(desc);
         data.ioc_inlbuf1 = (char *)&desc;
         data.ioc_inllen2 = desc.ld_tgt_count * sizeof(*uuidarray);
         data.ioc_inlbuf2 = (char *)uuidarray;
+        data.ioc_inllen3 = desc.ld_tgt_count * sizeof(*obdgens);
+        data.ioc_inlbuf3 = (char *)obdgens;
 
         if (obd_ioctl_pack(&data, &buf, max)) {
                 fprintf(stderr, "error: %s: invalid ioctl\n",
                         jt_cmdname(argv[0]));
                 rc = -EINVAL;
-                goto out;
+                goto out_obdgens;
         }
         rc = ioctl(fd, OBD_IOC_LOV_GET_CONFIG, buf);
         if (rc == -ENOSPC) {
                 free(uuidarray);
+                free(obdgens);
                 goto repeat;
         } else if (rc) {
                 fprintf(stderr, "error: %s: ioctl error: %s\n",
                         jt_cmdname(argv[0]), strerror(rc = errno));
         } else {
-                struct obd_uuid *ptr;
+                struct obd_uuid *uuidp;
+                __u32 *genp;
                 int i;
 
                 if (obd_ioctl_unpack(&data, buf, max)) {
@@ -1465,11 +1478,17 @@ repeat:
                        desc.ld_default_stripe_offset);
                 printf("default_stripe_pattern: %u\n", desc.ld_pattern);
                 printf("obd_count: %u\n", desc.ld_tgt_count);
-                for (i = 0, ptr = uuidarray; i < desc.ld_tgt_count; i++, ptr++)
-                        printf("%u: %s\n", i, (char *)ptr);
-        }
-out:
+                printf("OBDS:\tobdidx\t\tobdgen\t\t obduuid\n");
+                uuidp = uuidarray;
+                genp = obdgens;
+                for (i = 0; i < desc.ld_tgt_count; i++, uuidp++, genp++)
+                        printf("\t%6u\t%14u\t\t %s\n", i, *genp, (char *)uuidp);
+        }
+out_obdgens:
+        free(obdgens);
+out_uuidarray:
         free(uuidarray);
+out:
         close(fd);
         return rc;
 }
@@ -1828,7 +1847,8 @@ int jt_cfg_endrecord(int argc, char **argv)
                 return CMD_HELP;
 
         if (!jt_recording) {
-                fprintf(stderr, "Not recording, so endrecord doesn't make sense.\n");
+                fprintf(stderr, "Not recording, so endrecord doesn't make "
+                        "sense.\n");
                 return 0;
         }
 
@@ -1855,14 +1875,14 @@ int jt_llog_catlist(int argc, char **argv)
         IOC_INIT(data);
         data.ioc_inllen1 = max - size_round(sizeof(data));
         IOC_PACK(argv[0], data);
-        
+
         rc = l_ioctl(OBD_DEV_ID, OBD_IOC_CATLOGLIST, buf);
-        if (rc == 0) 
+        if (rc == 0)
                 fprintf(stdout, "%s", ((struct obd_ioctl_data*)buf)->ioc_bulk);
         else
-                fprintf(stderr, "OBD_IOC_CATLOGLIST failed: %s\n", 
+                fprintf(stderr, "OBD_IOC_CATLOGLIST failed: %s\n",
                         strerror(errno));
-        
+
         return rc;
 }
 
@@ -1877,7 +1897,7 @@ int jt_llog_info(int argc, char **argv)
         IOC_INIT(data);
         data.ioc_inllen1 = strlen(argv[1]) + 1;
         data.ioc_inlbuf1 = argv[1];
-        data.ioc_inllen2 = max - size_round(sizeof(data)) - 
+        data.ioc_inllen2 = max - size_round(sizeof(data)) -
                 size_round(data.ioc_inllen1);
         IOC_PACK(argv[0], data);