Whamcloud - gitweb
LU-12944 mdd: pass correct xattr size to lower layers 89/36689/3
authorSebastien Buisson <sbuisson@ddn.com>
Wed, 6 Nov 2019 17:31:08 +0000 (02:31 +0900)
committerOleg Drokin <green@whamcloud.com>
Sat, 14 Dec 2019 05:56:44 +0000 (05:56 +0000)
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 <sbuisson@ddn.com>
Change-Id: I26b54759b4e69fbac17a1032bbc724b796d78108
Reviewed-on: https://review.whamcloud.com/36689
Reviewed-by: Mike Pershin <mpershin@whamcloud.com>
Tested-by: jenkins <devops@whamcloud.com>
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
lustre/mdd/mdd_dir.c
lustre/tests/sanity.sh

index e3a80bb..9d982ec 100644 (file)
@@ -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 &&
index 6b08430..0f68ae6 100644 (file)
@@ -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