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