Whamcloud - gitweb
b=22938 lfs find -s doesn't seem to work correctly
authorDmitry Zogin <dmitry.zoguine@oracle.com>
Mon, 30 Aug 2010 14:07:38 +0000 (18:07 +0400)
committerMikhail Pershin <tappro@sun.com>
Wed, 8 Sep 2010 16:38:49 +0000 (20:38 +0400)
 Fixing find_value_cmp().

 o=yuriy.umanets
 i=johann
 i=andreas.dilger

lustre/include/lustre/liblustreapi.h
lustre/tests/sanity.sh
lustre/utils/lfs.c
lustre/utils/liblustreapi.c

index 2c035b2..0c262c8 100644 (file)
@@ -132,7 +132,12 @@ struct find_param {
                         check_gid:1,
                         check_uid:1,
                         check_pool:1,
                         check_gid:1,
                         check_uid:1,
                         check_pool:1,
+                        check_size:1,
                         exclude_pool:1,
                         exclude_pool:1,
+                        exclude_size:1,
+                        exclude_atime:1,
+                        exclude_mtime:1,
+                        exclude_ctime:1,
                         get_mdt_index:1;
 
         int     verbose;
                         get_mdt_index:1;
 
         int     verbose;
index 5bcd2da..03f0b90 100755 (executable)
@@ -3350,6 +3350,39 @@ test_56q() {
 }
 run_test 56q "check lfs find -gid and ! -gid ==============================="
 
 }
 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
 test_57a() {
        # note test will not do anything if MDS is not local
        remote_mds_nodsh && skip "remote MDS with nodsh" && return
index 399fa13..dc2fc20 100644 (file)
@@ -499,7 +499,6 @@ static int lfs_find(int argc, char **argv)
         int c, ret;
         time_t t;
         struct find_param param = { .maxdepth = -1 };
         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'},
         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 = &param.atime;
                         xsign = &param.asign;
                 case 'A':
                         xtime = &param.atime;
                         xsign = &param.asign;
+                        param.exclude_atime = !!neg_opt;
                 case 'C':
                         if (c == 'C') {
                                 xtime = &param.ctime;
                                 xsign = &param.csign;
                 case 'C':
                         if (c == 'C') {
                                 xtime = &param.ctime;
                                 xsign = &param.csign;
+                                param.exclude_ctime = !!neg_opt;
                         }
                 case 'M':
                         if (c == 'M') {
                                 xtime = &param.mtime;
                                 xsign = &param.msign;
                         }
                 case 'M':
                         if (c == 'M') {
                                 xtime = &param.mtime;
                                 xsign = &param.msign;
+                                param.exclude_mtime = !!neg_opt;
                         }
                         new_fashion = 1;
                         }
                         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;
                         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':
                         };
                         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] == '-')
                         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;
                         }
                                         optarg);
                                 return ret;
                         }
+                        param.check_size = 1;
+                        param.exclude_size = !!neg_opt;
                         break;
                 case 'v':
                         new_fashion = 0;
                         break;
                 case 'v':
                         new_fashion = 0;
index d5292f7..d61cfa2 100644 (file)
@@ -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,
  * 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 (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).
 }
 
 /* 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,
         /* 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;
                 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,
 
         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;
 
                 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,
 
         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;
 
                 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 ||
 
         /* 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;
                 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 &&
            '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
                 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;
         }
 
                         goto decided;
         }
 
-        if (param->size)
+        if (param->check_size)
                 decision = find_value_cmp(st->st_size, param->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) {
 
 print_path:
         if (decision != -1) {