From d571fd9b51d6819d58e89337b0a45ea0edb4f778 Mon Sep 17 00:00:00 2001 From: Dmitry Zogin Date: Mon, 30 Aug 2010 18:07:38 +0400 Subject: [PATCH] b=22938 lfs find -s doesn't seem to work correctly Fixing find_value_cmp(). o=yuriy.umanets i=johann i=andreas.dilger --- lustre/include/lustre/liblustreapi.h | 5 ++++ lustre/tests/sanity.sh | 33 ++++++++++++++++++++++ lustre/utils/lfs.c | 30 ++++---------------- lustre/utils/liblustreapi.c | 53 ++++++++++++++++++------------------ 4 files changed, 70 insertions(+), 51 deletions(-) diff --git a/lustre/include/lustre/liblustreapi.h b/lustre/include/lustre/liblustreapi.h index 2c035b2..0c262c8 100644 --- a/lustre/include/lustre/liblustreapi.h +++ b/lustre/include/lustre/liblustreapi.h @@ -132,7 +132,12 @@ struct find_param { check_gid:1, check_uid:1, check_pool:1, + check_size:1, exclude_pool:1, + exclude_size:1, + exclude_atime:1, + exclude_mtime:1, + exclude_ctime:1, get_mdt_index:1; int verbose; diff --git a/lustre/tests/sanity.sh b/lustre/tests/sanity.sh index 5bcd2da..03f0b90 100755 --- a/lustre/tests/sanity.sh +++ b/lustre/tests/sanity.sh @@ -3350,6 +3350,39 @@ test_56q() { } run_test 56q "check lfs find -gid and ! -gid ===============================" +test_56r() { + setup_56 $NUMFILES $NUMDIRS + TDIR=$DIR/${tdir}g + + EXPECTED=12 + NUMS=`$LFIND -size 0 -t f $TDIR | wc -l` + [ $NUMS -eq $EXPECTED ] || \ + error "lfs find $TDIR -size 0 wrong: found $NUMS, expected $EXPECTED" + EXPECTED=0 + NUMS=`$LFIND ! -size 0 -t f $TDIR | wc -l` + [ $NUMS -eq $EXPECTED ] || \ + error "lfs find $TDIR ! -size 0 wrong: found $NUMS, expected $EXPECTED" + echo "test" > $TDIR/56r && sync + EXPECTED=1 + NUMS=`$LFIND -size 5 -t f $TDIR | wc -l` + [ $NUMS -eq $EXPECTED ] || \ + error "lfs find $TDIR -size 5 wrong: found $NUMS, expected $EXPECTED" + EXPECTED=1 + NUMS=`$LFIND -size +5 -t f $TDIR | wc -l` + [ $NUMS -eq $EXPECTED ] || \ + error "lfs find $TDIR -size +5 wrong: found $NUMS, expected $EXPECTED" + EXPECTED=13 + NUMS=`$LFIND -size +0 -t f $TDIR | wc -l` + [ $NUMS -eq $EXPECTED ] || \ + error "lfs find $TDIR -size +0 wrong: found $NUMS, expected $EXPECTED" + EXPECTED=0 + NUMS=`$LFIND ! -size -5 -t f $TDIR | wc -l` + [ $NUMS -eq $EXPECTED ] || \ + error "lfs find $TDIR ! -size -5 wrong: found $NUMS, expected $EXPECTED" +} + +run_test 56r "check lfs find -size works ==========================" + test_57a() { # note test will not do anything if MDS is not local remote_mds_nodsh && skip "remote MDS with nodsh" && return diff --git a/lustre/utils/lfs.c b/lustre/utils/lfs.c index 399fa13..dc2fc20 100644 --- a/lustre/utils/lfs.c +++ b/lustre/utils/lfs.c @@ -499,7 +499,6 @@ static int lfs_find(int argc, char **argv) int c, ret; time_t t; struct find_param param = { .maxdepth = -1 }; - char str[1024]; struct option long_opts[] = { /* New find options. */ {"atime", required_argument, 0, 'A'}, @@ -581,29 +580,20 @@ static int lfs_find(int argc, char **argv) case 'A': xtime = ¶m.atime; xsign = ¶m.asign; + param.exclude_atime = !!neg_opt; case 'C': if (c == 'C') { xtime = ¶m.ctime; xsign = ¶m.csign; + param.exclude_ctime = !!neg_opt; } case 'M': if (c == 'M') { xtime = ¶m.mtime; xsign = ¶m.msign; + param.exclude_mtime = !!neg_opt; } new_fashion = 1; - if (neg_opt) { - if (optarg[0] == '-') - optarg[0] = '+'; - else if (optarg[0] == '+') - optarg[0] = '-'; - else { - str[0] = '-'; - str[1] = '\0'; - strcat(str, optarg); - optarg = str; - } - } ret = set_time(&t, xtime, optarg); if (ret == INT_MAX) return -1; @@ -734,18 +724,6 @@ static int lfs_find(int argc, char **argv) }; break; case 's': - if (neg_opt) { - if (optarg[0] == '-') - optarg[0] = '+'; - else if (optarg[0] == '+') - optarg[0] = '-'; - else { - str[0] = '-'; - str[1] = '\0'; - strcat(str, optarg); - optarg = str; - } - } if (optarg[0] == '+') param.size_sign = -1; else if (optarg[0] == '-') @@ -760,6 +738,8 @@ static int lfs_find(int argc, char **argv) optarg); return ret; } + param.check_size = 1; + param.exclude_size = !!neg_opt; break; case 'v': new_fashion = 0; diff --git a/lustre/utils/liblustreapi.c b/lustre/utils/liblustreapi.c index d5292f7..d61cfa2 100644 --- a/lustre/utils/liblustreapi.c +++ b/lustre/utils/liblustreapi.c @@ -1603,28 +1603,26 @@ int llapi_file_lookup(int dirfd, const char *name) * Note: 5th actually means that the value is within the interval * (limit - margin, limit]. */ static int find_value_cmp(unsigned int file, unsigned int limit, int sign, - unsigned long long margin, int mds) + int negopt, unsigned long long margin, int mds) { + int ret = -1; + if (sign > 0) { - if (file < limit) - return mds ? 0 : 1; - } - - if (sign == 0) { - if (file <= limit && file + margin > limit) - return mds ? 0 : 1; - if (file + margin <= limit) - return mds ? 0 : -1; - } - - if (sign < 0) { - if (file > limit) - return 1; - if (mds) - return 0; + if (file <= limit) + ret = mds ? 0 : 1; + } else if (sign == 0) { + if (file <= limit && file + margin >= limit) + ret = mds ? 0 : 1; + else if (file + margin <= limit) + ret = mds ? 0 : -1; + } else if (sign < 0) { + if (file >= limit) + ret = 1; + else if (mds) + ret = 0; } - return -1; + return negopt ? ~ret + 1 : ret; } /* Check if the file time matches all the given criteria (e.g. --atime +/-N). @@ -1642,7 +1640,8 @@ static int find_time_check(lstat_t *st, struct find_param *param, int mds) /* Check if file is accepted. */ if (param->atime) { ret = find_value_cmp(st->st_atime, param->atime, - param->asign, 24 * 60 * 60, mds); + param->asign, param->exclude_atime, + 24 * 60 * 60, mds); if (ret < 0) return ret; rc = ret; @@ -1650,7 +1649,8 @@ static int find_time_check(lstat_t *st, struct find_param *param, int mds) if (param->mtime) { ret = find_value_cmp(st->st_mtime, param->mtime, - param->msign, 24 * 60 * 60, mds); + param->msign, param->exclude_mtime, + 24 * 60 * 60, mds); if (ret < 0) return ret; @@ -1662,7 +1662,8 @@ static int find_time_check(lstat_t *st, struct find_param *param, int mds) if (param->ctime) { ret = find_value_cmp(st->st_ctime, param->ctime, - param->csign, 24 * 60 * 60, mds); + param->csign, param->exclude_ctime, + 24 * 60 * 60, mds); if (ret < 0) return ret; @@ -1715,7 +1716,7 @@ static int cb_find_init(char *path, DIR *parent, DIR *dir, /* If a time or OST should be checked, the decision is not taken yet. */ if (param->atime || param->ctime || param->mtime || param->obduuid || - param->size) + param->check_size) decision = 0; ret = 0; @@ -1896,7 +1897,7 @@ obd_matches: 'glimpse-size-ioctl'. */ if (!decision && S_ISREG(st->st_mode) && param->lmd->lmd_lmm.lmm_stripe_count && - (param->size ||param->atime || param->mtime || param->ctime)) { + (param->check_size ||param->atime || param->mtime || param->ctime)) { 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 @@ -1949,10 +1950,10 @@ obd_matches: goto decided; } - if (param->size) + if (param->check_size) decision = find_value_cmp(st->st_size, param->size, - param->size_sign, param->size_units, - 0); + param->size_sign, param->exclude_size, + param->size_units, 0); print_path: if (decision != -1) { -- 1.8.3.1