diff --git a/lustre/llite/dcache.c b/lustre/llite/dcache.c
index 26a152a6696ade683f717a8f85dbf8238bde1a1d..c0989f2e3c32b5e4680ff84ad6f44c731ee92617 100644
--- a/lustre/llite/dcache.c
+++ b/lustre/llite/dcache.c
@@ -453,7 +453,10 @@ do_lock:
         rc = mdc_intent_lock(exp, &op_data, NULL, 0, it, lookup_flags,
                              &req, ll_mdc_blocking_ast, 0);
         if (it->it_op == IT_GETATTR && !first)
-                ll_statahead_exit(de, rc);
+                /* If there are too many locks on client-side, then some
+                 * locks taken by statahead maybe dropped automatically
+                 * before the real "revalidate" using them. */
+                ll_statahead_exit(de, req == NULL ? rc : 0);
         else if (first == -EEXIST)
                 ll_statahead_mark(de);
 
@@ -578,7 +581,7 @@ out_sa:
         if (it && it->it_op == IT_GETATTR && rc == 1) {
                 first = ll_statahead_enter(de->d_parent->d_inode, &de, 0);
                 if (!first)
-                        ll_statahead_exit(de, rc);
+                        ll_statahead_exit(de, 1);
                 else if (first == -EEXIST)
                         ll_statahead_mark(de);
         }
diff --git a/lustre/tests/sanity.sh b/lustre/tests/sanity.sh
index 072d25cee66fdb6024c0a4ccf285284b298e066c..fad85859df68c5ecdcff091f8a3b321388c796ba 100644
--- a/lustre/tests/sanity.sh
+++ b/lustre/tests/sanity.sh
@@ -4941,6 +4941,7 @@ test_123a() { # was test 123, statahead(bug 11401)
         for ((i=1, j=0; i<=$NUMFREE; j=$i, i=$((i * MULT)) )); do
                 createmany -o $DIR/$tdir/$tfile $j $((i - j))
 
+                swrong=`lctl get_param -n llite.*.statahead_stats | grep "statahead wrong:" | awk '{print $3}'`
                 lctl get_param -n llite.*.statahead_max | grep '[0-9]'
                 cancel_lru_locks mdc
                 cancel_lru_locks osc
@@ -4950,6 +4951,7 @@ test_123a() { # was test 123, statahead(bug 11401)
                 delta_sa=$((etime - stime))
                 log "ls $i files with statahead:    $delta_sa sec"
 		lctl get_param -n llite.*.statahead_stats
+                ewrong=`lctl get_param -n llite.*.statahead_stats | grep "statahead wrong:" | awk '{print $3}'`
 
                 max=`lctl get_param -n llite.*.statahead_max | head -n 1`
                 lctl set_param -n llite.*.statahead_max 0
@@ -4963,6 +4965,9 @@ test_123a() { # was test 123, statahead(bug 11401)
                 log "ls $i files without statahead: $delta sec"
 
                 lctl set_param llite.*.statahead_max=$max
+                if [ $swrong -lt $ewrong ]; then
+                        log "statahead was stopped, maybe too many locks held!"
+                fi
                 if [ $delta_sa -gt $(($delta + 2)) ]; then
                         log "ls $i files is slower with statahead!"
                         error=1