Whamcloud - gitweb
LU-5017 mdd: Do not miss flags when do "lfs mv" 40/10240/2
authorwang di <di.wang@intel.com>
Tue, 6 May 2014 13:30:22 +0000 (06:30 -0700)
committerOleg Drokin <oleg.drokin@intel.com>
Thu, 8 May 2014 04:05:24 +0000 (04:05 +0000)
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 <di.wang@intel.com>
Change-Id: Ia2665f3362323337e55618614964ead4f2c740a2
Reviewed-on: http://review.whamcloud.com/10240
Tested-by: Jenkins
Reviewed-by: Andreas Dilger <andreas.dilger@intel.com>
Tested-by: Maloo <hpdd-maloo@intel.com>
Reviewed-by: Oleg Drokin <oleg.drokin@intel.com>
lustre/mdd/mdd_dir.c
lustre/obdclass/linux/linux-obdo.c
lustre/tests/sanity.sh

index c84f820..0b382f3 100644 (file)
@@ -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));
index 033f6b0..5af2ff6 100644 (file)
@@ -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);
 
index 4b8a65a..0229fb0 100644 (file)
@@ -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"