From 66f92c5a237fe24066c4f2482a6ff464c15b1bae Mon Sep 17 00:00:00 2001
From: deen <deen>
Date: Thu, 30 Aug 2007 08:20:08 +0000
Subject: [PATCH] Make lfs setstripe understand 'k', 'm' and 'g' for stripe
 size.

i=adilger
i=green
b=12786
---
 lustre/ChangeLog   |  5 +++++
 lustre/utils/lfs.c | 24 +++++++++++++++++++-----
 2 files changed, 24 insertions(+), 5 deletions(-)

diff --git a/lustre/ChangeLog b/lustre/ChangeLog
index f910801096..51703384f9 100644
--- a/lustre/ChangeLog
+++ b/lustre/ChangeLog
@@ -185,6 +185,11 @@ Details    : with NFS, the anon dentry's parent was set to itself in
              d_alloc_anon(), so in MDS, we use rec->ur_fid1 to find the
              corresponding dentry other than use rec->ur_name.
 
+Severity   : enhancement
+Bugzilla   : 12786
+Description: lfs setstripe enhancement
+Details    : Make lfs setstripe understand 'k', 'm' and 'g' for stripe size.
+
 --------------------------------------------------------------------------------
 
 2007-08-10         Cluster File Systems, Inc. <info@clusterfs.com>
diff --git a/lustre/utils/lfs.c b/lustre/utils/lfs.c
index 181b1c9a18..588b5ec2e9 100644
--- a/lustre/utils/lfs.c
+++ b/lustre/utils/lfs.c
@@ -89,6 +89,7 @@ command_t cmdlist[] = {
          "       or \n"
          "       setstripe -d <dirname>   (to delete default striping)\n"
          "\tstripe_size:  Number of bytes on each OST (0 filesystem default)\n"
+         "\t              Can be specified with k, m or g (in KB, MB and GB respectively)\n"
          "\tstripe_index: OST index of first stripe (-1 filesystem default)\n"
          "\tstripe_count: Number of OSTs to stripe over (0 default, -1 all)"},
         {"getstripe", lfs_getstripe, 0,
@@ -163,7 +164,7 @@ static int lfs_setstripe(int argc, char **argv)
 {
         char *fname;
         int result;
-        long st_size;
+        unsigned long st_size;
         int  st_offset, st_count;
         char *end;
         int c;
@@ -255,11 +256,24 @@ static int lfs_setstripe(int argc, char **argv)
         if (stripe_size_arg != NULL) {
                 st_size = strtoul(stripe_size_arg, &end, 0);
                 if (*end != '\0') {
-                        fprintf(stderr, "error: %s: bad stripe size '%s'\n",
-                                argv[0], stripe_size_arg);
-                        return CMD_HELP;
+                        if ((*end == 'k' || *end == 'K') && 
+                            *(end+1) == '\0' &&
+                            (st_size & (~0UL << (32 - 10))) == 0) {
+                                st_size <<= 10;
+                        } else if ((*end == 'm' || *end == 'M') && 
+                                   *(end+1) == '\0' &&
+                                   (st_size & (~0UL << (32 - 20))) == 0) {
+                                st_size <<= 20;
+                        } else if ((*end == 'g' || *end == 'G') && 
+                                   *(end+1) == '\0' &&
+                                   (st_size & (~0UL << (32 - 30))) == 0) {
+                                st_size <<= 30;
+                        } else {
+                                fprintf(stderr, "error: %s: bad stripe size '%s'\n",
+                                        argv[0], stripe_size_arg);
+                                return CMD_HELP;
+                        }
                 }
-
         }
         /* get the stripe offset */
         if (stripe_off_arg != NULL) {
-- 
GitLab