From 56fca6749bbc8eb2196bbc039b217c2c886f6105 Mon Sep 17 00:00:00 2001
From: kalpak <kalpak>
Date: Mon, 12 May 2008 11:32:27 +0000
Subject: [PATCH] Reinitialize optind to 0 on each lfs_* call, in case lfs is
 being used interactively.  Most lfs_* functions do this already, but a few
 (find, setstripe, quotachown) do not.  b=15212  i=rupesh  i=johann

---
 lustre/ChangeLog       |  4 ++++
 lustre/tests/sanity.sh | 13 +++++++++++++
 lustre/utils/lfs.c     |  6 ++++--
 3 files changed, 21 insertions(+), 2 deletions(-)

diff --git a/lustre/ChangeLog b/lustre/ChangeLog
index 600acb042f..47cc74f55a 100644
--- a/lustre/ChangeLog
+++ b/lustre/ChangeLog
@@ -987,6 +987,10 @@ Description: eliminate client locks in face of contention
 Details    : file contention detection and lockless i/o implementation
              for contended files.
 
+Severity   : normal
+Bugzilla   : 15212
+Description: Reinitialize optind to 0 so that interactive lfs works in all cases
+
 --------------------------------------------------------------------------------
 
 2007-08-10         Cluster File Systems, Inc. <info@clusterfs.com>
diff --git a/lustre/tests/sanity.sh b/lustre/tests/sanity.sh
index b797662cf0..691e47fee3 100644
--- a/lustre/tests/sanity.sh
+++ b/lustre/tests/sanity.sh
@@ -4935,6 +4935,19 @@ test_127() { # bug 15521
 }
 run_test 127 "verify the client stats are sane"
 
+test_128() { # bug 15212
+	touch $DIR/$tfile
+	$LFS 2>&1 <<-EOF | tee $TMP/$tfile.log
+		find $DIR/$tfile
+		find $DIR/$tfile
+	EOF
+
+	result=$(grep error $TMP/$tfile.log)
+	rm -f $DIR/$tfile
+	[ -z "$result" ] || error "consecutive find's under interactive lfs failed"
+}
+run_test 128 "interactive lfs for 2 consecutive find's"
+
 TMPDIR=$OLDTMPDIR
 TMP=$OLDTMP
 HOME=$OLDHOME
diff --git a/lustre/utils/lfs.c b/lustre/utils/lfs.c
index 94454d654d..875860175a 100644
--- a/lustre/utils/lfs.c
+++ b/lustre/utils/lfs.c
@@ -214,9 +214,9 @@ static int lfs_setstripe(int argc, char **argv)
                 stripe_count_arg = argv[4];
                 optind = 4;
         } else {
+                optind = 0;
                 while ((c = getopt_long(argc, argv, "c:di:s:",
-                                                long_opts, NULL)) >= 0) 
-                {
+                                                long_opts, NULL)) >= 0) {
                         switch (c) {
                         case 0:
                                 /* Long options. */
@@ -362,6 +362,7 @@ static int lfs_find(int argc, char **argv)
 
         time(&t);
 
+        optind = 0;
         while ((c = getopt_long_only(argc, argv, "-A:C:D:M:n:PpO:qrs:t:v",
                                      long_opts, NULL)) >= 0) {
                 xtime = NULL;
@@ -1084,6 +1085,7 @@ static int lfs_quotachown(int argc, char **argv)
         int c,rc;
         int flag = 0;
 
+        optind = 0;
         while ((c = getopt(argc, argv, "i")) != -1) {
                 switch (c) {
                 case 'i':
-- 
GitLab