From 5f432f4ff1717352aaacb93959d6353b8468f88b Mon Sep 17 00:00:00 2001 From: wang di Date: Tue, 6 May 2014 06:30:22 -0700 Subject: [PATCH] LU-5017 mdd: Do not miss flags when do "lfs mv" la_flags is missing in obdo_from_la and la_from_obdo, so flags can not be set correctly during migration. Add test cases in sanity 230b. Signed-off-by: wang di Change-Id: Ia2665f3362323337e55618614964ead4f2c740a2 Reviewed-on: http://review.whamcloud.com/10240 Tested-by: Jenkins Reviewed-by: Andreas Dilger Tested-by: Maloo Reviewed-by: Oleg Drokin --- lustre/mdd/mdd_dir.c | 4 ++-- lustre/obdclass/linux/linux-obdo.c | 12 ++++++++++-- lustre/tests/sanity.sh | 40 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 52 insertions(+), 4 deletions(-) diff --git a/lustre/mdd/mdd_dir.c b/lustre/mdd/mdd_dir.c index c84f820..0b382f3 100644 --- a/lustre/mdd/mdd_dir.c +++ b/lustre/mdd/mdd_dir.c @@ -3214,7 +3214,7 @@ static int mdd_declare_migrate_create(const struct lu_env *env, return rc; la_flag->la_valid = LA_FLAGS; - la_flag->la_flags = LUSTRE_IMMUTABLE_FL; + la_flag->la_flags = la->la_flags | LUSTRE_IMMUTABLE_FL; mdd_flags_xlate(mdd_sobj, la_flag->la_flags); rc = mdo_declare_attr_set(env, mdd_sobj, la_flag, handle); @@ -3328,7 +3328,7 @@ static int mdd_migrate_create(const struct lu_env *env, * IMMUTALBE flag and MIGRATE EA, it need to clear IMMUTABLE * flag and approve the migration */ la_flag->la_valid = LA_FLAGS; - la_flag->la_flags = LUSTRE_IMMUTABLE_FL; + la_flag->la_flags = la->la_flags | LUSTRE_IMMUTABLE_FL; mdd_flags_xlate(mdd_sobj, la_flag->la_flags); rc = mdo_attr_set(env, mdd_sobj, la_flag, handle, mdd_object_capa(env, mdd_sobj)); diff --git a/lustre/obdclass/linux/linux-obdo.c b/lustre/obdclass/linux/linux-obdo.c index 033f6b0..5af2ff6 100644 --- a/lustre/obdclass/linux/linux-obdo.c +++ b/lustre/obdclass/linux/linux-obdo.c @@ -97,7 +97,11 @@ void obdo_from_la(struct obdo *dst, struct lu_attr *la, __u64 valid) dst->o_gid = la->la_gid; newvalid |= OBD_MD_FLGID; } - dst->o_valid |= newvalid; + if (valid & LA_FLAGS) { + dst->o_flags = la->la_flags; + newvalid |= OBD_MD_FLFLAGS; + } + dst->o_valid |= newvalid; } EXPORT_SYMBOL(obdo_from_la); @@ -146,7 +150,11 @@ void la_from_obdo(struct lu_attr *dst, const struct obdo *obdo, obd_flag valid) dst->la_gid = obdo->o_gid; newvalid |= LA_GID; } - dst->la_valid = newvalid; + if (valid & OBD_MD_FLFLAGS) { + dst->la_flags = obdo->o_flags; + newvalid |= LA_FLAGS; + } + dst->la_valid = newvalid; } EXPORT_SYMBOL(la_from_obdo); diff --git a/lustre/tests/sanity.sh b/lustre/tests/sanity.sh index 4b8a65a..0229fb0 100644 --- a/lustre/tests/sanity.sh +++ b/lustre/tests/sanity.sh @@ -12050,6 +12050,14 @@ test_230b() { cp /etc/passwd $migrate_dir/$tfile cp /etc/passwd $other_dir/$tfile + chattr +SAD $migrate_dir + chattr +SAD $migrate_dir/$tfile + + local old_dir_flag=$(lsattr -a $migrate_dir | awk '/\/\.$/ {print $1}') + local old_file_flag=$(lsattr $migrate_dir/$tfile | awk '{print $1}') + local old_dir_mode=$(stat -c%f $migrate_dir) + local old_file_mode=$(stat -c%f $migrate_dir/$tfile) + mkdir -p $migrate_dir/dir_default_stripe2 $SETSTRIPE -c 2 $migrate_dir/dir_default_stripe2 $SETSTRIPE -c 2 $migrate_dir/${tfile}_stripe2 @@ -12079,6 +12087,22 @@ test_230b() { [ $mdt_index == 0 ] || error "$file is not on MDT${MDTIDX}" + local new_dir_flag=$(lsattr -a $migrate_dir | awk '/\/\.$/ {print $1}') + [ "$old_dir_flag" = "$new_dir_flag" ] || + error " expect $old_dir_flag get $new_dir_flag" + + local new_file_flag=$(lsattr $migrate_dir/$tfile | awk '{print $1}') + [ "$old_file_flag" = "$new_file_flag" ] || + error " expect $old_file_flag get $new_file_flag" + + local new_dir_mode=$(stat -c%f $migrate_dir) + [ "$old_dir_mode" = "$new_dir_mode" ] || + error "expect mode $old_dir_mode get $new_dir_mode" + + local new_file_mode=$(stat -c%f $migrate_dir/$tfile) + [ "$old_file_mode" = "$new_file_mode" ] || + error "expect mode $old_file_mode get $new_file_mode" + diff /etc/passwd $migrate_dir/$tfile || error "$tfile different after migration" @@ -12120,6 +12144,22 @@ test_230b() { error "$file is not on MDT${MDTIDX}" done + local new_dir_flag=$(lsattr -a $migrate_dir | awk '/\/\.$/ {print $1}') + [ "$old_dir_flag" = "$new_dir_flag" ] || + error " expect $old_dir_flag get $new_dir_flag" + + local new_file_flag=$(lsattr $migrate_dir/$tfile | awk '{print $1}') + [ "$old_file_flag" = "$new_file_flag" ] || + error " expect $old_file_flag get $new_file_flag" + + local new_dir_mode=$(stat -c%f $migrate_dir) + [ "$old_dir_mode" = "$new_dir_mode" ] || + error "expect mode $old_dir_mode get $new_dir_mode" + + local new_file_mode=$(stat -c%f $migrate_dir/$tfile) + [ "$old_file_mode" = "$new_file_mode" ] || + error "expect mode $old_file_mode get $new_file_mode" + diff /etc/passwd ${migrate_dir}/$tfile || error "$tfile different after migration" -- 1.8.3.1