Whamcloud - gitweb
b=14836 Fail if "lfs setstripe" has positional parameters
[fs/lustre-release.git] / lustre / utils / lfs.c
index 399fa13..20f2d60 100644 (file)
@@ -162,7 +162,8 @@ command_t cmdlist[] = {
         {"join", lfs_join, 0,
          "join two lustre files into one.\n"
          "obsolete, HEAD does not support it anymore.\n"},
-        {"osts", lfs_osts, 0, "osts"},
+        {"osts", lfs_osts, 0, "list OSTs connected to client "
+         "[for specified path only]\n" "usage: osts [path]"},
         {"df", lfs_df, 0,
          "report filesystem disk space usage or inodes usage"
          "of each MDS and all OSDs or a batch belonging to a specific pool .\n"
@@ -291,18 +292,12 @@ static int lfs_setstripe(int argc, char **argv)
         st_offset = -1;
         st_count = 0;
 
-#if LUSTRE_VERSION < OBD_OCD_VERSION(2,1,0,0)
+#if LUSTRE_VERSION < OBD_OCD_VERSION(2,4,50,0)
         if (argc == 5 && argv[1][0] != '-' &&
             isnumber(argv[2]) && isnumber(argv[3]) && isnumber(argv[4])) {
-                fprintf(stderr, "warning: deprecated usage of setstripe "
+                fprintf(stderr, "error: obsolete usage of setstripe "
                         "positional parameters.  Use -c, -i, -s instead.\n");
-                /* for compatibility with the existing positional parameter
-                 * usage */
-                fname = argv[1];
-                stripe_size_arg = argv[2];
-                stripe_off_arg = argv[3];
-                stripe_count_arg = argv[4];
-                optind = 4;
+                return CMD_HELP;
         } else
 #else
 #warning "remove obsolete positional parameter code"
@@ -499,7 +494,6 @@ static int lfs_find(int argc, char **argv)
         int c, ret;
         time_t t;
         struct find_param param = { .maxdepth = -1 };
-        char str[1024];
         struct option long_opts[] = {
                 /* New find options. */
                 {"atime",     required_argument, 0, 'A'},
@@ -581,29 +575,20 @@ static int lfs_find(int argc, char **argv)
                 case 'A':
                         xtime = &param.atime;
                         xsign = &param.asign;
+                        param.exclude_atime = !!neg_opt;
                 case 'C':
                         if (c == 'C') {
                                 xtime = &param.ctime;
                                 xsign = &param.csign;
+                                param.exclude_ctime = !!neg_opt;
                         }
                 case 'M':
                         if (c == 'M') {
                                 xtime = &param.mtime;
                                 xsign = &param.msign;
+                                param.exclude_mtime = !!neg_opt;
                         }
                         new_fashion = 1;
-                        if (neg_opt) {
-                                if (optarg[0] == '-')
-                                        optarg[0] = '+';
-                                else if (optarg[0] == '+')
-                                        optarg[0] = '-';
-                                else {
-                                        str[0] = '-';
-                                        str[1] = '\0';
-                                        strcat(str, optarg);
-                                        optarg = str;
-                                }
-                        }
                         ret = set_time(&t, xtime, optarg);
                         if (ret == INT_MAX)
                                 return -1;
@@ -734,18 +719,6 @@ static int lfs_find(int argc, char **argv)
                         };
                         break;
                 case 's':
-                        if (neg_opt) {
-                                if (optarg[0] == '-')
-                                        optarg[0] = '+';
-                                else if (optarg[0] == '+')
-                                        optarg[0] = '-';
-                                else {
-                                        str[0] = '-';
-                                        str[1] = '\0';
-                                        strcat(str, optarg);
-                                        optarg = str;
-                                }
-                        }
                         if (optarg[0] == '+')
                                 param.size_sign = -1;
                         else if (optarg[0] == '-')
@@ -760,6 +733,8 @@ static int lfs_find(int argc, char **argv)
                                         optarg);
                                 return ret;
                         }
+                        param.check_size = 1;
+                        param.exclude_size = !!neg_opt;
                         break;
                 case 'v':
                         new_fashion = 0;
@@ -879,7 +854,10 @@ static int lfs_getstripe(int argc, char **argv)
                         }
                         break;
                 case 'p':
-                        param.verbose |= VERBOSE_POOL;
+                        if (!(param.verbose & VERBOSE_DETAIL)) {
+                                param.verbose |= VERBOSE_POOL;
+                                param.maxdepth = 0;
+                        }
                         break;
                 case 'M':
                         param.get_mdt_index = 1;
@@ -916,20 +894,33 @@ static int lfs_getstripe(int argc, char **argv)
 
 static int lfs_osts(int argc, char **argv)
 {
-        char mntdir[PATH_MAX] = {'\0'};
+        char mntdir[PATH_MAX] = {'\0'}, path[PATH_MAX] = {'\0'};
         struct find_param param;
         int index = 0, rc=0;
 
-        if (argc != 1)
+        if (argc > 2)
                 return CMD_HELP;
 
-        while (llapi_search_mounts(NULL, index++, mntdir, NULL) == 0) {
+        if (argc == 2 && !realpath(argv[1], path)) {
+                rc = -errno;
+                fprintf(stderr, "error: invalid path '%s': %s\n",
+                        argv[1], strerror(-rc));
+                return rc;
+        }
+
+        while (!llapi_search_mounts(path, index++, mntdir, NULL)) {
+                /* Check if we have a mount point */
+                if (mntdir[0] == '\0')
+                        continue;
+
                 memset(&param, 0, sizeof(param));
                 rc = llapi_ostlist(mntdir, &param);
                 if (rc) {
                         fprintf(stderr, "error: %s: failed on %s\n",
                                 argv[0], mntdir);
                 }
+                if (path[0] != '\0')
+                        break;
                 memset(mntdir, 0, PATH_MAX);
         }
 
@@ -980,8 +971,8 @@ static int showdf(char *mntdir, struct obd_statfs *stat,
                         total = (stat->os_blocks * stat->os_bsize) >> shift;
                 }
 
-                if (total > 0)
-                        ratio = (double)used / (double)total;
+                if ((used + avail) > 0)
+                        ratio = (double)used / (double)(used + avail);
 
                 if (cooked) {
                         int i;
@@ -1013,7 +1004,7 @@ static int showdf(char *mntdir, struct obd_statfs *stat,
                         sprintf(abuf, CDF, avail);
                 }
 
-                sprintf(rbuf, RDF, (int)(ratio * 100));
+                sprintf(rbuf, RDF, (int)(ratio * 100 + 0.5));
                 printf(UUF" "CSF" "CSF" "CSF" "RSF" %-s",
                        uuid, tbuf, ubuf, abuf, rbuf, mntdir);
                 if (type)
@@ -1088,18 +1079,14 @@ static int mntdf(char *mntdir, char *fsname, char *pool, int ishow, int cooked)
                         /* the llapi_obd_statfs() call may have returned with
                          * an error, but if it filled in uuid_buf we will at
                          * lease use that to print out a message for that OBD.
-                         * If we didn't even fill in uuid_buf something is
-                         * definitely incorrect and no point in continuing. */
-                        if (uuid_buf.uuid[0] != '\0') {
-                                showdf(mntdir,&stat_buf,obd_uuid2str(&uuid_buf),
-                                       ishow, cooked, tp->st_name, index, rc);
-                        } else {
-                                char tmp_uuid[12];
+                         * If we didn't get anything in the uuid_buf, then fill
+                         * it in so that we can print an error message. */
+                        if (uuid_buf.uuid[0] == '\0')
+                                sprintf(uuid_buf.uuid, "%s%04x",
+                                       tp->st_name, index);
+                       showdf(mntdir,&stat_buf,obd_uuid2str(&uuid_buf),
+                              ishow, cooked, tp->st_name, index, rc);
 
-                                sprintf(tmp_uuid, "%s%04x", tp->st_name, index);
-                                showdf(mntdir, &stat_buf, tmp_uuid,
-                                       ishow, cooked, tp->st_name, index, rc);
-                        }
                         if (rc == 0) {
                                 if (tp->st_op == LL_STATFS_MDC) {
                                         sum.os_ffree += stat_buf.os_ffree;
@@ -1120,16 +1107,15 @@ static int mntdf(char *mntdir, char *fsname, char *pool, int ishow, int cooked)
 
         printf("\n");
         showdf(mntdir, &sum, "filesystem summary:", ishow, cooked, NULL, 0,0);
-
+        printf("\n");
         return 0;
 }
 
 static int lfs_df(int argc, char **argv)
 {
-        char *path = NULL;
-        char *mntdir = NULL;
+        char mntdir[PATH_MAX] = {'\0'}, path[PATH_MAX] = {'\0'};
         int ishow = 0, cooked = 0;
-        int c, rc = 0;
+        int c, rc = 0, index = 0;
         char fsname[PATH_MAX] = "", *pool_name = NULL;
         struct option long_opts[] = {
                 {"pool", required_argument, 0, 'p'},
@@ -1152,46 +1138,25 @@ static int lfs_df(int argc, char **argv)
                         return CMD_HELP;
                 }
         }
-        if (optind < argc )
-                path = argv[optind];
-
-        if ((mntdir = malloc(PATH_MAX)) == NULL) {
-                fprintf(stderr, "error: cannot allocate %d bytes\n",
-                        PATH_MAX);
-                return -ENOMEM;
+        if (optind < argc && !realpath(argv[optind], path)) {
+                rc = -errno;
+                fprintf(stderr, "error: invalid path '%s': %s\n",
+                        argv[optind], strerror(-rc));
+                return rc;
         }
-        memset(mntdir, 0, PATH_MAX);
-
-        if (path) {
-                char rpath[PATH_MAX] = {'\0'};
 
-                if (!realpath(path, rpath)) {
-                        rc = -errno;
-                        fprintf(stderr, "error: invalid path '%s': %s\n",
-                                        path, strerror(-rc));
-                } else {
-                        rc = llapi_search_mounts(rpath, 0, mntdir, fsname);
-                        if (rc == 0 && mntdir[0] != '\0') {
-                                rc = mntdf(mntdir, fsname, pool_name,
-                                           ishow, cooked);
-                                printf("\n");
-                        }
-                }
-        } else {
-                int index = 0;
+        while (!llapi_search_mounts(path, index++, mntdir, fsname)) {
+                /* Check if we have a mount point */
+                if (mntdir[0] == '\0')
+                        continue;
 
-                while (llapi_search_mounts(NULL, index++, mntdir, fsname)==0) {
-                        rc = mntdf(mntdir, fsname, pool_name,
-                                   ishow, cooked);
-                        if (rc)
-                                break;
-                        printf("\n");
-                        fsname[0] = '\0'; /* avoid matching in next loop */
-                        mntdir[0] = '\0'; /* avoid matching in next loop */
-                }
+                rc = mntdf(mntdir, fsname, pool_name, ishow, cooked);
+                if (rc || path[0] != '\0')
+                        break;
+                fsname[0] = '\0'; /* avoid matching in next loop */
+                mntdir[0] = '\0'; /* avoid matching in next loop */
         }
 
-        free(mntdir);
         return rc;
 }