last->lde_reclen = 0; /* end mark */
}
out_err:
- if (result > 0)
+ if (result > 0) {
/* end of directory */
dp->ldp_hash_end = cpu_to_le64(MDS_DIR_END_OFF);
- else if (result < 0)
+ if (last == NULL && fid_is_dot_lustre(&fid))
+ /*
+ * .lustre is last in directory and alone in
+ * last directory block
+ */
+ dp->ldp_flags = cpu_to_le32(LDF_EMPTY);
+ } else if (result < 0) {
CWARN("%s: build page failed for "DFID": rc = %d\n",
lu_dev_name(obj->do_lu.lo_dev),
PFID(lu_object_fid(&obj->do_lu)), result);
-
+ }
return result;
}
}
run_test 154e ".lustre is not returned by readdir"
+test_154ea()
+{
+ stack_trap "rm -rf $MOUNT/[abcdeg]*" EXIT
+
+ # long specially selected names are to displace .lustre out of
+ # first directory block
+ touch $MOUNT/$(printf "a%0100x" 6)
+ for i in 11 15
+ do
+ touch $MOUNT/$(printf "a%0254x" $i)
+ done
+ touch $MOUNT/$(printf "b%0254x" $i)
+ for i in 16 6 7
+ do
+ touch $MOUNT/$(printf "c%0254x" $i)
+ done
+ for i in 4 10 8
+ do
+ touch $MOUNT/$(printf "d%0254x" $i)
+ done
+ for i in 1 14
+ do
+ touch /mnt/lustre/$(printf "e%0254x" $i)
+ done
+ for i in 13 14
+ do
+ touch /mnt/lustre/$(printf "g%0254x" $i)
+ done
+ if ls -a $MOUNT | grep -q '^\.lustre$'; then
+ error ".lustre returned by readdir"
+ fi
+}
+run_test 154ea ".lustre is not returned by readdir (2)"
+
test_154f() {
[ -n "$FILESET" ] && skip "SKIP due to FILESET set"