From e671bcef07002246a2cd5417e7a1c0ddc6c4d196 Mon Sep 17 00:00:00 2001
From: bobijam <bobijam>
Date: Thu, 16 Aug 2007 04:08:45 +0000
Subject: [PATCH] Branch HEAD b=12836 i=adilger, komaln

Description: lfs find on -1 stripe looping in lsm_lmm_verify_common()
Details    : Avoid lov_verify_lmm_common() on directory with -1 stripe count.
---
 lustre/ChangeLog            |  5 +++++
 lustre/lov/lov_ea.c         |  4 +++-
 lustre/lov/lov_pack.c       |  2 +-
 lustre/tests/sanity.sh      |  7 +++++++
 lustre/utils/liblustreapi.c | 10 +++++++---
 5 files changed, 23 insertions(+), 5 deletions(-)

diff --git a/lustre/ChangeLog b/lustre/ChangeLog
index a35f12d667..2691376c4a 100644
--- a/lustre/ChangeLog
+++ b/lustre/ChangeLog
@@ -101,6 +101,11 @@ Bugzilla   : 12743
 Description: df doesn't work properly if diskfs blocksize != 4K
 Details    : Choose biggest blocksize of OST's as the LOV's blocksize.
 
+Severity   : normal
+Bugzilla   : 12836
+Description: lfs find on -1 stripe looping in lsm_lmm_verify_common()
+Details    : Avoid lov_verify_lmm_common() on directory with -1 stripe count.
+
 --------------------------------------------------------------------------------
 
 2007-08-10         Cluster File Systems, Inc. <info@clusterfs.com>
diff --git a/lustre/lov/lov_ea.c b/lustre/lov/lov_ea.c
index 9e3463c8ec..4a9f996f91 100755
--- a/lustre/lov/lov_ea.c
+++ b/lustre/lov/lov_ea.c
@@ -70,7 +70,9 @@ static int lsm_lmm_verify_common(struct lov_mds_md *lmm, int lmm_bytes,
         }
 
         if (lmm->lmm_stripe_size == 0 ||
-            (__u64)le32_to_cpu(lmm->lmm_stripe_size)*stripe_count > 0xffffffff){
+            (stripe_count != -1 &&
+             (__u64)le32_to_cpu(lmm->lmm_stripe_size)*stripe_count >
+             0xffffffff)) {
                 CERROR("bad stripe size %u\n",
                        le32_to_cpu(lmm->lmm_stripe_size));
                 lov_dump_lmm_v1(D_WARNING, lmm);
diff --git a/lustre/lov/lov_pack.c b/lustre/lov/lov_pack.c
index ca7e3678b7..c4cf95705c 100644
--- a/lustre/lov/lov_pack.c
+++ b/lustre/lov/lov_pack.c
@@ -49,7 +49,7 @@ void lov_dump_lmm_v1(int level, struct lov_mds_md_v1 *lmm)
                le32_to_cpu(lmm->lmm_stripe_size),
                le32_to_cpu(lmm->lmm_stripe_count));
         for (i = 0, lod = lmm->lmm_objects;
-             i < le32_to_cpu(lmm->lmm_stripe_count); i++, lod++)
+             i < (int)le32_to_cpu(lmm->lmm_stripe_count); i++, lod++)
                 CDEBUG(level, "stripe %u idx %u subobj "LPX64"/"LPX64"\n",
                        i, le32_to_cpu(lod->l_ost_idx),
                        le64_to_cpu(lod->l_object_gr),
diff --git a/lustre/tests/sanity.sh b/lustre/tests/sanity.sh
index dc8f270e3c..4660081682 100644
--- a/lustre/tests/sanity.sh
+++ b/lustre/tests/sanity.sh
@@ -2823,6 +2823,13 @@ test_65k() { # bug11679
 }
 run_test 65k "validate manual striping works properly with deactivated OSCs"
 
+test_65l() { # bug 12836
+	mkdir -p $DIR/$tdir
+	$LFS setstripe $DIR/$tdir 65536 -1 -1
+	$LFS find -mtime -1 $DIR
+}
+run_test 65l "lfs find on -1 stipe dir ========================"
+
 # bug 2543 - update blocks count on client
 test_66() {
 	COUNT=${COUNT:-8}
diff --git a/lustre/utils/liblustreapi.c b/lustre/utils/liblustreapi.c
index 89c555559d..406c6294e1 100644
--- a/lustre/utils/liblustreapi.c
+++ b/lustre/utils/liblustreapi.c
@@ -770,7 +770,8 @@ static int cb_find_init(char *path, DIR *parent, DIR *dir, void *data)
                 decision = -1;
 
         /* If a OST UUID is given, and some OST matches, check it here. */
-        if (decision != -1 && param->obdindex != OBD_NOT_FOUND) {
+        if (decision != -1 && param->obdindex != OBD_NOT_FOUND &&
+            S_ISREG(st->st_mode)) {
                 /* Only those files should be accepted, which have a strip on
                  * the specified OST. */
                 if (!param->lmd->lmd_lmm.lmm_stripe_count) {
@@ -793,14 +794,17 @@ static int cb_find_init(char *path, DIR *parent, DIR *dir, void *data)
         if (!decision) {
                 int for_mds;
 
-                for_mds = lustre_fs ? param->lmd->lmd_lmm.lmm_stripe_count : 0;
+                for_mds = lustre_fs ? (S_ISREG(st->st_mode) &&
+                                       param->lmd->lmd_lmm.lmm_stripe_count)
+                                    : 0;
                 decision = find_time_check(st, param, for_mds);
         }
 
         /* If file still fits the request, ask osd for updated info.
            The regulat stat is almost of the same speed as some new
            'glimpse-size-ioctl'. */
-        if (!decision && param->lmd->lmd_lmm.lmm_stripe_count) {
+        if (!decision && param->lmd->lmd_lmm.lmm_stripe_count &&
+            S_ISREG(st->st_mode)) {
                 if (param->obdindex != OBD_NOT_FOUND) {
                         /* Check whether the obd is active or not, if it is
                          * not active, just print the object affected by this
-- 
GitLab