From e5e584fd386a2229809bc64d440c3255cf50c1bd Mon Sep 17 00:00:00 2001 From: Sebastien Buisson Date: Thu, 7 Nov 2019 02:31:08 +0900 Subject: [PATCH] LU-12944 mdd: pass correct xattr size to lower layers In mdd_iterate_xattrs(), struct lu_buf allocated to store xattr value can be reused for multiple xattrs, because it is only reallocated if it happens to be too small for one xattr. As a consequence, lb_len field does not represent actual xattr's size. It has to be adjusted when passed to lower layers. Signed-off-by: Sebastien Buisson Change-Id: I26b54759b4e69fbac17a1032bbc724b796d78108 Reviewed-on: https://review.whamcloud.com/36689 Reviewed-by: Mike Pershin Tested-by: jenkins Reviewed-by: Andreas Dilger Tested-by: Maloo Reviewed-by: Oleg Drokin --- lustre/mdd/mdd_dir.c | 1 + lustre/tests/sanity.sh | 55 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+) diff --git a/lustre/mdd/mdd_dir.c b/lustre/mdd/mdd_dir.c index e3a80bb..9d982ec 100644 --- a/lustre/mdd/mdd_dir.c +++ b/lustre/mdd/mdd_dir.c @@ -3608,6 +3608,7 @@ static int mdd_iterate_xattrs(const struct lu_env *env, GOTO(out, rc); cbxbuf = xbuf; + cbxbuf.lb_len = xsize; repeat: rc = cb(env, tobj, &cbxbuf, xname, 0, handle); if (unlikely(rc == -ENOSPC && diff --git a/lustre/tests/sanity.sh b/lustre/tests/sanity.sh index 6b08430..0f68ae6 100644 --- a/lustre/tests/sanity.sh +++ b/lustre/tests/sanity.sh @@ -16926,6 +16926,61 @@ test_230l() { } run_test 230l "readdir between MDTs won't crash" +test_230m() { + [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" + [ $MDS1_VERSION -lt $(version_code 2.11.56) ] && + skip "Need MDS version at least 2.11.56" + + local MDTIDX=1 + local mig_dir=$DIR/$tdir/migrate_dir + local longstr="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + local shortstr="b" + local val + + echo "Creating files and dirs with xattrs" + test_mkdir $DIR/$tdir + test_mkdir -i0 -c1 $mig_dir + mkdir $mig_dir/dir + setfattr -n user.attr1 -v $longstr $mig_dir/dir || + error "cannot set xattr attr1 on dir" + setfattr -n user.attr2 -v $shortstr $mig_dir/dir || + error "cannot set xattr attr2 on dir" + touch $mig_dir/dir/f0 + setfattr -n user.attr1 -v $longstr $mig_dir/dir/f0 || + error "cannot set xattr attr1 on file" + setfattr -n user.attr2 -v $shortstr $mig_dir/dir/f0 || + error "cannot set xattr attr2 on file" + sync ; sync ; echo 3 > /proc/sys/vm/drop_caches + val=$(getfattr --only-values -n user.attr1 $mig_dir/dir 2>/dev/null) + [ "$val" = $longstr ] || error "xattr attr1 not set properly on dir" + val=$(getfattr --only-values -n user.attr2 $mig_dir/dir 2>/dev/null) + [ "$val" = $shortstr ] || error "xattr attr2 not set properly on dir" + val=$(getfattr --only-values -n user.attr1 $mig_dir/dir/f0 2>/dev/null) + [ "$val" = $longstr ] || error "xattr attr1 not set properly on file" + val=$(getfattr --only-values -n user.attr2 $mig_dir/dir/f0 2>/dev/null) + [ "$val" = $shortstr ] || error "xattr attr2 not set properly on file" + + echo "Migrating to MDT1" + $LFS migrate -m $MDTIDX $mig_dir || + error "fails on migrating dir to MDT1" + + sync ; sync ; echo 3 > /proc/sys/vm/drop_caches + echo "Checking xattrs" + val=$(getfattr --only-values -n user.attr1 $mig_dir/dir 2>/dev/null) + [ "$val" = $longstr ] || + error "expecting xattr1 $longstr on dir, found $val" + val=$(getfattr --only-values -n user.attr2 $mig_dir/dir 2>/dev/null) + [ "$val" = $shortstr ] || + error "expecting xattr2 $shortstr on dir, found $val" + val=$(getfattr --only-values -n user.attr1 $mig_dir/dir/f0 2>/dev/null) + [ "$val" = $longstr ] || + error "expecting xattr1 $longstr on file, found $val" + val=$(getfattr --only-values -n user.attr2 $mig_dir/dir/f0 2>/dev/null) + [ "$val" = $shortstr ] || + error "expecting xattr2 $shortstr on file, found $val" +} +run_test 230m "xattrs not changed after dir migration" + test_231a() { # For simplicity this test assumes that max_pages_per_rpc -- 1.8.3.1