Whamcloud - gitweb
b=22235 llapi_uuid_match() prints bogus error message on upgraded filesystem
[fs/lustre-release.git] / lustre / utils / lfs.c
index d950da6..654d6c3 100644 (file)
@@ -73,6 +73,7 @@
 #include <lustre/lustre_idl.h>
 #include <lustre/liblustreapi.h>
 #include <lustre/lustre_user.h>
+#include <lustre_quota.h>
 
 #include <libcfs/libcfsutil.h>
 #include "obdctl.h"
@@ -132,17 +133,17 @@ command_t cmdlist[] = {
          "directory or recursively for all files in a directory tree.\n"
          "usage: getstripe [--obd|-O <uuid>] [--quiet | -q] [--verbose | -v]\n"
          "                 [--count | -c ] [--size | -s ] [--index | -i ]\n"
-         "                 [--offset | -o ] [--pool | -p ]\n"
-         "                 [--recursive | -r] <dir|file> ..."},
+         "                 [--offset | -o ] [--pool | -p ] [--directory | -d]\n"
+         "                 [--mdt | -M] [--recursive | -r] <dir|file> ..."},
         {"pool_list", lfs_poollist, 0,
          "List pools or pool OSTs\n"
          "usage: pool_list <fsname>[.<pool>] | <pathname>\n"},
         {"find", lfs_find, 0,
          "To find files that match given parameters recursively in a directory tree.\n"
-         "usage: find <dir|file> ... \n"
+         "usage: find <directory|filename> ...\n"
          "     [[!] --atime|-A [+-]N] [[!] --mtime|-M [+-]N] [[!] --ctime|-C [+-]N]\n"
          "     [--maxdepth|-D N] [[!] --name|-n <pattern>] [--print0|-P]\n"
-         "     [--print|-p] [--obd|-O <uuid[s]>] [[!] --size|-s [+-]N[bkMGTP]]\n"
+         "     [--print|-p] [[!] --obd|-O <uuid[s]>] [[!] --size|-s [+-]N[bkMGTP]]\n"
          "     [[!] --type|-t <filetype>] [[!] --gid|-g|--group|-G <gid>|<gname>]\n"
          "     [[!] --uid|-u|--user|-U <uid>|<uname>]\n"
          "     [[!] --pool <pool>]\n"
@@ -159,8 +160,8 @@ command_t cmdlist[] = {
          "\tkeywords are one of followings: config, deletions.\n"
          "\tnode name must be provided when use keyword config."},
         {"join", lfs_join, 0,
-         "join two lustre files into one - join A, B, will be like cat B >> A & del B\n"
-         "usage: join <filename_A> <filename_B>\n"},
+         "join two lustre files into one.\n"
+         "obsolete, HEAD does not support it anymore.\n"},
         {"osts", lfs_osts, 0, "osts"},
         {"df", lfs_df, 0,
          "report filesystem disk space usage or inodes usage"
@@ -674,6 +675,8 @@ static int lfs_find(int argc, char **argv)
                                 return -ENOMEM;
                         strcpy(buf, (char *)optarg);
 
+                        param.exclude_obd = !!neg_opt;
+
                         if (param.num_alloc_obds == 0) {
                                 param.obduuid = malloc(FIND_MAX_OSTS *
                                                        sizeof(struct obd_uuid));
@@ -823,14 +826,16 @@ static int lfs_getstripe(int argc, char **argv)
                 {"offset", 0, 0, 'o'},
                 {"pool", 0, 0, 'p'},
                 {"verbose", 0, 0, 'v'},
+                {"directory", 0, 0, 'd'},
+                {"mdt", 0, 0, 'M'},
                 {0, 0, 0, 0}
         };
-        char short_opts[] = "hO:qrvcsiop";
         int c, rc;
         struct find_param param = { 0 };
 
+        param.maxdepth = 1;
         optind = 0;
-        while ((c = getopt_long(argc, argv, short_opts,
+        while ((c = getopt_long(argc, argv, "cdhiMoO:pqrsv",
                                 long_opts, NULL)) != -1) {
                 switch (c) {
                 case 'O':
@@ -845,26 +850,40 @@ static int lfs_getstripe(int argc, char **argv)
                 case 'q':
                         param.quiet++;
                         break;
+                case 'd':
+                        param.maxdepth = 0;
+                        break;
                 case 'r':
                         param.recursive = 1;
                         break;
                 case 'v':
                         param.verbose = VERBOSE_ALL | VERBOSE_DETAIL;
-                        param.quiet = 0;
                         break;
                 case 'c':
-                        param.verbose |= VERBOSE_COUNT;
+                        if (!(param.verbose & VERBOSE_DETAIL)) {
+                                param.verbose |= VERBOSE_COUNT;
+                                param.maxdepth = 0;
+                        }
                         break;
                 case 's':
-                        param.verbose |= VERBOSE_SIZE;
+                        if (!(param.verbose & VERBOSE_DETAIL)) {
+                                param.verbose |= VERBOSE_SIZE;
+                                param.maxdepth = 0;
+                        }
                         break;
                 case 'i':
                 case 'o':
-                        param.verbose |= VERBOSE_OFFSET;
+                        if (!(param.verbose & VERBOSE_DETAIL)) {
+                                param.verbose |= VERBOSE_OFFSET;
+                                param.maxdepth = 0;
+                        }
                         break;
                 case 'p':
                         param.verbose |= VERBOSE_POOL;
                         break;
+                case 'M':
+                        param.get_mdt_index = 1;
+                        break;
                 case '?':
                         return CMD_HELP;
                 default:
@@ -877,7 +896,13 @@ static int lfs_getstripe(int argc, char **argv)
         if (optind >= argc)
                 return CMD_HELP;
 
-        param.maxdepth = param.recursive ? -1 : 1;
+        if (param.recursive)
+                param.maxdepth = -1;
+
+        if (!param.verbose)
+                param.verbose = VERBOSE_ALL;
+        if (param.quiet)
+                param.verbose = VERBOSE_OBJID;
 
         do {
                 rc = llapi_getstripe(argv[optind], &param);
@@ -900,7 +925,7 @@ static int lfs_osts(int argc, char **argv)
 
         while (llapi_search_mounts(NULL, index++, mntdir, NULL) == 0) {
                 memset(&param, 0, sizeof(param));
-                rc = llapi_getstripe(mntdir, &param);
+                rc = llapi_ostlist(mntdir, &param);
                 if (rc) {
                         fprintf(stderr, "error: %s: failed on %s\n",
                                 argv[0], mntdir);
@@ -921,12 +946,11 @@ static int lfs_osts(int argc, char **argv)
         radix;                                                          \
 })
 #define UUF     "%-20s"
-#define CSF     "%9s"
-#define CDF     "%9llu"
-#define HSF     "%8s"
-#define HDF     "%6.1f"
-#define RSF     "%5s"
-#define RDF     "%4d%%"
+#define CSF     "%11s"
+#define CDF     "%11llu"
+#define HDF     "%8.1f%c"
+#define RSF     "%4s"
+#define RDF     "%3d%%"
 
 static int showdf(char *mntdir, struct obd_statfs *stat,
                   char *uuid, int ishow, int cooked,
@@ -966,21 +990,21 @@ static int showdf(char *mntdir, struct obd_statfs *stat,
                         cook_val = (double)total;
                         i = COOK(cook_val);
                         if (i > 0)
-                                sprintf(tbuf, HDF"%c", cook_val, suffix[i - 1]);
+                                sprintf(tbuf, HDF, cook_val, suffix[i - 1]);
                         else
                                 sprintf(tbuf, CDF, total);
 
                         cook_val = (double)used;
                         i = COOK(cook_val);
                         if (i > 0)
-                                sprintf(ubuf, HDF"%c", cook_val, suffix[i - 1]);
+                                sprintf(ubuf, HDF, cook_val, suffix[i - 1]);
                         else
                                 sprintf(ubuf, CDF, used);
 
                         cook_val = (double)avail;
                         i = COOK(cook_val);
                         if (i > 0)
-                                sprintf(abuf, HDF"%c", cook_val, suffix[i - 1]);
+                                sprintf(abuf, HDF, cook_val, suffix[i - 1]);
                         else
                                 sprintf(abuf, CDF, avail);
                 } else {
@@ -1009,11 +1033,20 @@ static int showdf(char *mntdir, struct obd_statfs *stat,
         return 0;
 }
 
+struct ll_stat_type {
+        int   st_op;
+        char *st_name;
+};
+
 static int mntdf(char *mntdir, char *fsname, char *pool, int ishow, int cooked)
 {
         struct obd_statfs stat_buf, sum = { .os_bsize = 1 };
         struct obd_uuid uuid_buf;
         char *poolname = NULL;
+        struct ll_stat_type types[] = { { LL_STATFS_MDC, "MDT" },
+                                        { LL_STATFS_LOV, "OST" },
+                                        { 0, NULL } };
+        struct ll_stat_type *tp;
         __u32 index;
         int rc;
 
@@ -1038,62 +1071,50 @@ static int mntdf(char *mntdir, char *fsname, char *pool, int ishow, int cooked)
                        "UUID", cooked ? "bytes" : "1K-blocks",
                        "Used", "Available", "Use%", "Mounted on");
 
-        for (index = 0; ; index++) {
-                memset(&stat_buf, 0, sizeof(struct obd_statfs));
-                memset(&uuid_buf, 0, sizeof(struct obd_uuid));
-                rc = llapi_obd_statfs(mntdir, LL_STATFS_MDC, index,
-                                      &stat_buf, &uuid_buf);
-                if (rc == -ENODEV)
-                        break;
-
-                if (rc == -EAGAIN)
-                        continue;
-
-                if (rc == -ENOTCONN || rc == -ETIMEDOUT || rc == -EIO ||
-                    rc == -ENODATA || rc == 0) {
-                        showdf(mntdir, &stat_buf, obd_uuid2str(&uuid_buf),
-                               ishow, cooked, "MDT", index, rc);
-                } else {
-                        fprintf(stderr,
-                                "error: llapi_obd_statfs(%s): %s (%d)\n",
-                                obd_uuid2str(&uuid_buf), strerror(-rc), rc);
-                        return rc;
-                }
-                if (rc == 0) {
-                        sum.os_ffree += stat_buf.os_ffree;
-                        sum.os_files += stat_buf.os_files;
-                }
-        }
-
-        for (index = 0; ; index++) {
-                memset(&stat_buf, 0, sizeof(struct obd_statfs));
-                memset(&uuid_buf, 0, sizeof(struct obd_uuid));
-                rc = llapi_obd_statfs(mntdir, LL_STATFS_LOV, index,
-                                      &stat_buf, &uuid_buf);
-                if (rc == -ENODEV)
-                        break;
+        for (tp = types; tp->st_name != NULL; tp++) {
+                for (index = 0; ; index++) {
+                        memset(&stat_buf, 0, sizeof(struct obd_statfs));
+                        memset(&uuid_buf, 0, sizeof(struct obd_uuid));
+                        rc = llapi_obd_statfs(mntdir, tp->st_op, index,
+                                              &stat_buf, &uuid_buf);
+                        if (rc == -ENODEV)
+                                break;
 
-                if (rc == -EAGAIN)
-                        continue;
+                        if (poolname && tp->st_op == LL_STATFS_LOV &&
+                            llapi_search_ost(fsname, poolname,
+                                             obd_uuid2str(&uuid_buf)) != 1)
+                                continue;
 
-                if (llapi_search_ost(fsname, poolname,
-                                     obd_uuid2str(&uuid_buf)) != 1)
-                        continue;
+                        /* 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 (rc == -ENOTCONN || rc == -ETIMEDOUT || rc == -EIO ||
-                    rc == -ENODATA || rc == 0) {
-                        showdf(mntdir, &stat_buf, obd_uuid2str(&uuid_buf),
-                               ishow, cooked, "OST", index, rc);
-                } else {
-                        fprintf(stderr,
-                                "error: llapi_obd_statfs failed: %s (%d)\n",
-                                strerror(-rc), rc);
-                        return rc;
-                }
-                if (rc == 0) {
-                        sum.os_blocks += stat_buf.os_blocks * stat_buf.os_bsize;
-                        sum.os_bfree  += stat_buf.os_bfree * stat_buf.os_bsize;
-                        sum.os_bavail += stat_buf.os_bavail * stat_buf.os_bsize;
+                                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;
+                                        sum.os_files += stat_buf.os_files;
+                                } else /* if (tp->st_op == LL_STATFS_LOV) */ {
+                                        sum.os_blocks += stat_buf.os_blocks *
+                                                stat_buf.os_bsize;
+                                        sum.os_bfree  += stat_buf.os_bfree *
+                                                stat_buf.os_bsize;
+                                        sum.os_bavail += stat_buf.os_bavail *
+                                                stat_buf.os_bsize;
+                                }
+                        } else if (rc == -EINVAL || rc == -EFAULT) {
+                                break;
+                        }
                 }
         }
 
@@ -1109,14 +1130,14 @@ static int lfs_df(int argc, char **argv)
         char *mntdir = NULL;
         int ishow = 0, cooked = 0;
         int c, rc = 0;
-        char fsname[PATH_MAX], *pool_name = NULL;
+        char fsname[PATH_MAX] = "", *pool_name = NULL;
         struct option long_opts[] = {
                 {"pool", required_argument, 0, 'p'},
                 {0, 0, 0, 0}
         };
 
         optind = 0;
-        while ((c = getopt_long(argc, argv, "ihp:", long_opts, NULL)) != -1) {
+        while ((c = getopt_long(argc, argv, "hip:", long_opts, NULL)) != -1) {
                 switch (c) {
                 case 'i':
                         ishow = 1;
@@ -1165,6 +1186,8 @@ static int lfs_df(int argc, char **argv)
                         if (rc)
                                 break;
                         printf("\n");
+                        fsname[0] = '\0'; /* avoid matching in next loop */
+                        mntdir[0] = '\0'; /* avoid matching in next loop */
                 }
         }
 
@@ -1243,37 +1266,11 @@ static int lfs_catinfo(int argc, char **argv)
         return rc;
 }
 
-int lfs_join(int argc, char **argv)
+static int lfs_join(int argc, char **argv)
 {
-        char *name_head, *name_tail;
-        int fd, rc;
-        loff_t size;
-
-        if (argc != 3)
-                return CMD_HELP;
-        name_head = argv[1];
-        fd = open(name_head, O_WRONLY);
-        if (fd < 0) {
-                fprintf(stderr, "Can not open name_head %s rc=%d\n",
-                        name_head, fd);
-                return fd;
-        }
-        size = lseek(fd, 0, SEEK_END);
-        if (size % JOIN_FILE_ALIGN) {
-                fprintf(stderr,"head file %s size %llu must be mutiple of %d\n",
-                        name_head, (long long)size, JOIN_FILE_ALIGN);
-                rc = -EINVAL;
-                goto out;
-        }
-        name_tail = argv[2];
-        rc = ioctl(fd, LL_IOC_JOIN, name_tail);
-out:
-        close(fd);
-        if (rc) {
-                fprintf(stderr, "Lustre joining files: %s, %s, failed\n",
-                        argv[1], argv[2]);
-        }
-        return rc;
+        fprintf(stderr, "join two lustre files into one.\n"
+                        "obsolete, HEAD does not support it anymore.\n");
+        return 0;
 }
 
 #ifdef HAVE_SYS_QUOTA_H
@@ -1414,9 +1411,6 @@ static int lfs_quotaon(int argc, char **argv)
         rc = llapi_quotactl(mnt, &qctl);
         if (rc) {
                 if (errno == EALREADY) {
-                        fprintf(stderr, "\n%s quotas are enabled already.\n",
-                                qctl.qc_type == 0x02 ? "user/group" :
-                                (qctl.qc_type == 0x00 ? "user" : "group"));
                         rc = 0;
                 } else if (errno == ENOENT) {
                         fprintf(stderr, "error: cannot find quota database, "
@@ -1473,9 +1467,6 @@ static int lfs_quotaoff(int argc, char **argv)
         rc = llapi_quotactl(mnt, &qctl);
         if (rc) {
                 if (errno == EALREADY) {
-                        fprintf(stderr, "\n%s quotas are disabled already.\n",
-                                qctl.qc_type == 0x02 ? "user/group" :
-                                (qctl.qc_type == 0x00 ? "user" : "group"));
                         rc = 0;
                 } else {
                         if (*obd_type)
@@ -1556,8 +1547,8 @@ do {                                                                    \
  *        2. specifiers may be encountered multiple times (2s3s is 5 seconds)
  *        3. empty integer value is interpreted as 0
  */
-
-static unsigned long str2sec(const char* timestr) {
+static unsigned long str2sec(const char* timestr)
+{
         const char spec[] = "smhdw";
         const unsigned long mult[] = {1, 60, 60*60, 24*60*60, 7*24*60*60};
         unsigned long val = 0;
@@ -1651,7 +1642,7 @@ int lfs_setquota_times(int argc, char **argv)
         qctl.qc_type = UGQUOTA;
 
         optind = 0;
-        while ((c = getopt_long(argc, argv, "ugb:i:t", long_opts, NULL)) != -1) {
+        while ((c = getopt_long(argc, argv, "b:i:gtu", long_opts, NULL)) != -1) {
                 switch (c) {
                 case 'u':
                 case 'g':
@@ -1741,7 +1732,7 @@ int lfs_setquota(int argc, char **argv)
                                  * isn't reinitialized from command line */
 
         optind = 0;
-        while ((c = getopt_long(argc, argv, "u:g:b:B:i:I:", long_opts, NULL)) != -1) {
+        while ((c = getopt_long(argc, argv, "b:B:i:I:g:u:", long_opts, NULL)) != -1) {
                 switch (c) {
                 case 'u':
                 case 'g':
@@ -2147,17 +2138,18 @@ ug_output:
                 return CMD_HELP;
         }
 
-        if (qctl.qc_cmd == LUSTRE_Q_GETQUOTA)
-                print_quota_title(name, &qctl);
-
         mnt = argv[optind];
 
         rc1 = llapi_quotactl(mnt, &qctl);
-        if (rc1 == -1 && errno == EALREADY) {
+        if (rc1 == -1 && errno == ESRCH) {
                 fprintf(stderr, "\n%s quotas are not enabled.\n",
                         qctl.qc_type == USRQUOTA ? "user" : "group");
                 goto out;
         }
+
+        if (qctl.qc_cmd == LUSTRE_Q_GETQUOTA)
+                print_quota_title(name, &qctl);
+
         if (rc1 && *obd_type)
                 fprintf(stderr, "%s %s ", obd_type, obd_uuid);