Whamcloud - gitweb
LU-2740 utils: Add support for --version option
[fs/lustre-release.git] / lustre / utils / lfs.c
index daba1eb..7ca4a7e 100644 (file)
 
 #include <libcfs/libcfs.h>
 #include <libcfs/libcfsutil.h>
-#include <lnet/lnetctl.h>
 #include <lustre/lustreapi.h>
 #include <lustre_ver.h>
-#include "obdctl.h"
 
 /* all functions */
 static int lfs_setstripe(int argc, char **argv);
@@ -150,16 +148,18 @@ command_t cmdlist[] = {
         "                 [--layout|-L]\n"
         "                 <directory|filename> ..."},
        {"setdirstripe", lfs_setdirstripe, 0,
-        "To create a remote directory on a specified MDT.\n"
+        "To create a striped directory on a specified MDT. This can only\n"
+        "be done on MDT0 with the right of administrator.\n"
         "usage: setdirstripe <--count|-c stripe_count>\n"
-        "[--index|-i mdt_index] [--hash-type|-t hash_type]\n"
-        "[--default_stripe|-D ] <dir>\n"
+        "              [--index|-i mdt_index] [--hash-type|-t hash_type]\n"
+        "              [--default_stripe|-D ] [--mode|-m mode] <dir>\n"
         "\tstripe_count: stripe count of the striped directory\n"
         "\tmdt_index:  MDT index of first stripe\n"
         "\thash_type:  hash type of the striped directory. Hash types:\n"
-        "      -t fnv_1a_64 FNV-1a hash algorithm(default)\n"
-        "      -t all_char  sum of characters % MDT_COUNT. (not recommended)\n"
-        "\tdefault_stripe: set default dirstripe of the directory\n"},
+        "      fnv_1a_64 FNV-1a hash algorithm (default)\n"
+        "      all_char  sum of characters % MDT_COUNT (not recommended)\n"
+        "\tdefault_stripe: set default dirstripe of the directory\n"
+        "\tmode: the mode of the directory\n"},
        {"getdirstripe", lfs_getdirstripe, 0,
         "To list the striping info for a given directory\n"
         "or recursively for all directories in a directory tree.\n"
@@ -167,10 +167,18 @@ command_t cmdlist[] = {
         "               [--count|-c ] [--index|-i ] [--raw|-R]\n"
         "               [--recursive | -r] [ --default_stripe | -D ] <dir> "},
        {"mkdir", lfs_setdirstripe, 0,
-        "To create a remote directory on a specified MDT. And this can only\n"
-        "be done on MDT0 by administrator.\n"
-        "usage: mkdir <--index|-i mdt_index> <dir>\n"
-        "\tmdt_index:    MDT index of the remote directory.\n"},
+        "To create a striped directory on a specified MDT. This can only\n"
+        "be done on MDT0 with the right of administrator.\n"
+        "usage: mkdir <--count|-c stripe_count>\n"
+        "              [--index|-i mdt_index] [--hash-type|-t hash_type]\n"
+        "              [--default_stripe|-D ] [--mode|-m mode] <dir>\n"
+        "\tstripe_count: stripe count of the striped directory\n"
+        "\tmdt_index:  MDT index of first stripe\n"
+        "\thash_type:  hash type of the striped directory. Hash types:\n"
+        "      fnv_1a_64 FNV-1a hash algorithm (default)\n"
+        "      all_char  sum of characters % MDT_COUNT (not recommended)\n"
+        "\tdefault_stripe: set default dirstripe of the directory\n"
+        "\tmode: the mode of the directory\n"},
        {"rm_entry", lfs_rmentry, 0,
         "To remove the name entry of the remote directory. Note: This\n"
         "command will only delete the name entry, i.e. the remote directory\n"
@@ -332,6 +340,8 @@ command_t cmdlist[] = {
        {"help", Parser_help, 0, "help"},
        {"exit", Parser_quit, 0, "quit"},
        {"quit", Parser_quit, 0, "quit"},
+       {"--version", Parser_version, 0,
+        "output build version of the utility and exit"},
        { 0, 0, 0, NULL }
 };
 
@@ -343,7 +353,8 @@ static int lfs_migrate(char *name, unsigned long long stripe_size,
                       __u64 migration_flags)
 {
        int                      fd, fdv;
-       char                     volatile_file[PATH_MAX];
+       char                     volatile_file[PATH_MAX +
+                                               LUSTRE_VOLATILE_HDR_LEN + 4];
        char                     parent[PATH_MAX];
        char                    *ptr;
        int                      rc;
@@ -419,7 +430,12 @@ static int lfs_migrate(char *name, unsigned long long stripe_size,
                else
                        *ptr = '\0';
        }
-       sprintf(volatile_file, "%s/%s::", parent, LUSTRE_VOLATILE_HDR);
+       rc = snprintf(volatile_file, sizeof(volatile_file), "%s/%s::", parent,
+                     LUSTRE_VOLATILE_HDR);
+       if (rc >= sizeof(volatile_file)) {
+               rc = -E2BIG;
+               goto free;
+       }
 
        /* create, open a volatile file, use caching (ie no directio) */
        /* exclusive create is not needed because volatile files cannot
@@ -1101,8 +1117,11 @@ static int lfs_find(int argc, char **argv)
                                 tmp = realloc(param.mdtuuid,
                                               param.num_alloc_mdts *
                                               sizeof(*param.mdtuuid));
-                                if (tmp == NULL)
-                                        GOTO(err_free, ret = -ENOMEM);
+                               if (tmp == NULL) {
+                                       ret = -ENOMEM;
+                                       goto err_free;
+                               }
+
                                 param.mdtuuid = tmp;
                         } else {
                                 param.exclude_obd = !!neg_opt;
@@ -1110,8 +1129,11 @@ static int lfs_find(int argc, char **argv)
                                 tmp = realloc(param.obduuid,
                                               param.num_alloc_obds *
                                               sizeof(*param.obduuid));
-                                if (tmp == NULL)
-                                        GOTO(err_free, ret = -ENOMEM);
+                               if (tmp == NULL) {
+                                       ret = -ENOMEM;
+                                       goto err_free;
+                               }
+
                                 param.obduuid = tmp;
                         }
                         for (token = buf; token && *token; token = next) {
@@ -1129,8 +1151,12 @@ static int lfs_find(int argc, char **argv)
                                         *p = 0;
                                         next = p+1;
                                 }
-                               if (strlen(token) > sizeof(puuid->uuid)-1)
-                                       GOTO(err_free, ret = -E2BIG);
+
+                               if (strlen(token) > sizeof(puuid->uuid) - 1) {
+                                       ret = -E2BIG;
+                                       goto err_free;
+                               }
+
                                strncpy(puuid->uuid, token,
                                        sizeof(puuid->uuid));
                         }
@@ -1727,7 +1753,10 @@ static int showdf(char *mntdir, struct obd_statfs *stat,
         double ratio = 0;
         char *suffix = "KMGTPEZY";
         /* Note if we have >2^64 bytes/fs these buffers will need to be grown */
-        char tbuf[20], ubuf[20], abuf[20], rbuf[20];
+       char tbuf[3 * sizeof(__u64)];
+       char ubuf[3 * sizeof(__u64)];
+       char abuf[3 * sizeof(__u64)];
+       char rbuf[3 * sizeof(__u64)];
 
         if (!uuid || !stat)
                 return -EINVAL;
@@ -2029,9 +2058,7 @@ static int lfs_check(int argc, char **argv)
                 return rc;
         }
 
-        rc = llapi_target_iterate(num_types, obd_types,
-                                  mntdir, llapi_ping_target);
-
+       rc = llapi_target_check(num_types, obd_types, mntdir);
         if (rc)
                 fprintf(stderr, "error: %s: %s status failed\n",
                                 argv[0],argv[1]);
@@ -2863,7 +2890,7 @@ static int lfs_quota(int argc, char **argv)
                         break;
                 case 'o':
                         valid = qctl.qc_valid = QC_UUID;
-                        strncpy(obd_uuid, optarg, sizeof(qctl.obd_uuid));
+                       strlcpy(obd_uuid, optarg, sizeof(qctl.obd_uuid));
                         break;
                 case 'i':
                         valid = qctl.qc_valid = QC_MDTIDX;
@@ -3015,10 +3042,10 @@ static int flushctx_ioctl(char *mp)
 
 static int lfs_flushctx(int argc, char **argv)
 {
-        int     kdestroy = 0, c;
-       FILE   *proc = NULL;
-        char    procline[PATH_MAX], *line;
-        int     rc = 0;
+       int     kdestroy = 0, c;
+       char    mntdir[PATH_MAX] = {'\0'};
+       int     index = 0;
+       int     rc = 0;
 
         optind = 0;
         while ((c = getopt(argc, argv, "k")) != -1) {
@@ -3034,46 +3061,24 @@ static int lfs_flushctx(int argc, char **argv)
         }
 
         if (kdestroy) {
-            int rc;
             if ((rc = system("kdestroy > /dev/null")) != 0) {
                 rc = WEXITSTATUS(rc);
                 fprintf(stderr, "error destroying tickets: %d, continuing\n", rc);
             }
         }
 
-        if (optind >= argc) {
-                /* flush for all mounted lustre fs. */
-                proc = fopen("/proc/mounts", "r");
-                if (!proc) {
-                        fprintf(stderr, "error: %s: can't open /proc/mounts\n",
-                                argv[0]);
-                        return -1;
-                }
-
-                while ((line = fgets(procline, PATH_MAX, proc)) != NULL) {
-                        char dev[PATH_MAX];
-                        char mp[PATH_MAX];
-                        char fs[PATH_MAX];
+       if (optind >= argc) {
+               /* flush for all mounted lustre fs. */
+               while (!llapi_search_mounts(NULL, index++, mntdir, NULL)) {
+                       /* Check if we have a mount point */
+                       if (mntdir[0] == '\0')
+                               continue;
 
-                        if (sscanf(line, "%s %s %s", dev, mp, fs) != 3) {
-                                fprintf(stderr, "%s: unexpected format in "
-                                                "/proc/mounts\n",
-                                        argv[0]);
+                       if (flushctx_ioctl(mntdir))
                                rc = -1;
-                               goto out;
-                        }
-
-                        if (strcmp(fs, "lustre") != 0)
-                                continue;
-                        /* we use '@' to determine it's a client. are there
-                         * any other better way?
-                         */
-                        if (strchr(dev, '@') == NULL)
-                                continue;
 
-                        if (flushctx_ioctl(mp))
-                                rc = -1;
-                }
+                       mntdir[0] = '\0'; /* avoid matching in next loop */
+               }
         } else {
                 /* flush fs as specified */
                 while (optind < argc) {
@@ -3081,10 +3086,6 @@ static int lfs_flushctx(int argc, char **argv)
                                 rc = -1;
                 }
         }
-
-out:
-       if (proc != NULL)
-               fclose(proc);
         return rc;
 }
 
@@ -3275,6 +3276,10 @@ static int lfs_fid2path(int argc, char **argv)
 
        device = argv[optind++];
        path = calloc(1, PATH_MAX);
+       if (path == NULL) {
+               fprintf(stderr, "error: Not enough memory\n");
+               return -errno;
+       }
 
        rc = 0;
        while (optind < argc) {
@@ -3744,6 +3749,7 @@ static int lfs_hsm_request(int argc, char **argv, int action)
                        /* If allocated buffer was too small, gets something
                         * bigger */
                        if (nbfile_alloc <= hur->hur_request.hr_itemcount) {
+                               ssize_t size;
                                nbfile_alloc = nbfile_alloc * 2 + 1;
                                oldhur = hur;
                                hur = llapi_hsm_user_request_alloc(nbfile_alloc,
@@ -3757,7 +3763,16 @@ static int lfs_hsm_request(int argc, char **argv, int action)
                                        fclose(fp);
                                        goto out_free;
                                }
-                               memcpy(hur, oldhur, hur_len(oldhur));
+                               size = hur_len(oldhur);
+                               if (size < 0) {
+                                       fprintf(stderr, "Cannot allocate "
+                                               "the requested size\n");
+                                       hur = oldhur;
+                                       rc = -E2BIG;
+                                       fclose(fp);
+                                       goto out_free;
+                               }
+                               memcpy(hur, oldhur, size);
                                free(oldhur);
                        }
 
@@ -3849,11 +3864,7 @@ int main(int argc, char **argv)
 
         setlinebuf(stdout);
 
-        ptl_initialize(argc, argv);
-        if (obd_initialize(argc, argv) < 0)
-                exit(2);
-
-        Parser_init("lfs > ", cmdlist);
+       Parser_init("lfs > ", cmdlist);
 
         if (argc > 1) {
                 rc = Parser_execarg(argc - 1, argv + 1, cmdlist);
@@ -3861,7 +3872,6 @@ int main(int argc, char **argv)
                 rc = Parser_commands();
         }
 
-        obd_finalize(argc, argv);
         return rc < 0 ? -rc : rc;
 }