Whamcloud - gitweb
LU-7703 mdd: linkea should be updated properly at migration 09/18109/6
authorAlex Zhuravlev <alexey.zhuravlev@intel.com>
Sat, 23 Jan 2016 22:17:41 +0000 (01:17 +0300)
committerOleg Drokin <oleg.drokin@intel.com>
Thu, 4 Feb 2016 04:45:36 +0000 (04:45 +0000)
when we're migrating a directory and fix children's linkeas,
do this correctly - search for old fid, replace with a new one.

Change-Id: Ib48f73d51ca635083d733202c59a9bdcdfe116fb
Signed-off-by: Alex Zhuravlev <alexey.zhuravlev@intel.com>
Reviewed-on: http://review.whamcloud.com/18109
Tested-by: Jenkins
Reviewed-by: wangdi <di.wang@intel.com>
Tested-by: Maloo <hpdd-maloo@intel.com>
Reviewed-by: Lai Siyao <lai.siyao@intel.com>
Reviewed-by: Oleg Drokin <oleg.drokin@intel.com>
lustre/mdd/mdd_dir.c

index 4d7d117..93f1f49 100644 (file)
@@ -3057,6 +3057,7 @@ out_pending:
  **/
 static int mdd_linkea_update_child_internal(const struct lu_env *env,
                                            struct mdd_object *parent,
+                                           struct mdd_object *newparent,
                                            struct mdd_object *child,
                                            const char *name, int namelen,
                                            struct thandle *handle,
@@ -3093,7 +3094,7 @@ static int mdd_linkea_update_child_internal(const struct lu_env *env,
                                    &lname, &fid);
 
                if (strncmp(lname.ln_name, name, namelen) != 0 ||
-                   lu_fid_eq(&fid, mdd_object_fid(parent))) {
+                   !lu_fid_eq(&fid, mdd_object_fid(parent))) {
                        ldata.ld_lee = (struct link_ea_entry *)
                                       ((char *)ldata.ld_lee +
                                        ldata.ld_reclen);
@@ -3103,10 +3104,10 @@ static int mdd_linkea_update_child_internal(const struct lu_env *env,
                CDEBUG(D_INFO, "%s: update "DFID" with %.*s:"DFID"\n",
                       mdd2obd_dev(mdd)->obd_name, PFID(mdd_object_fid(child)),
                       lname.ln_namelen, lname.ln_name,
-                      PFID(mdd_object_fid(parent)));
+                      PFID(mdd_object_fid(newparent)));
                /* update to the new parent fid */
                linkea_entry_pack(ldata.ld_lee, &lname,
-                                 mdd_object_fid(parent));
+                                 mdd_object_fid(newparent));
                if (declare)
                        rc = mdd_declare_links_add(env, child, handle, &ldata,
                                                   MLAO_IGNORE);
@@ -3119,21 +3120,25 @@ static int mdd_linkea_update_child_internal(const struct lu_env *env,
 
 static int mdd_linkea_declare_update_child(const struct lu_env *env,
                                           struct mdd_object *parent,
+                                          struct mdd_object *newparent,
                                           struct mdd_object *child,
                                           const char *name, int namelen,
                                           struct thandle *handle)
 {
-       return mdd_linkea_update_child_internal(env, parent, child, name,
+       return mdd_linkea_update_child_internal(env, parent, newparent,
+                                               child, name,
                                                namelen, handle, true);
 }
 
 static int mdd_linkea_update_child(const struct lu_env *env,
                                   struct mdd_object *parent,
+                                  struct mdd_object *newparent,
                                   struct mdd_object *child,
                                   const char *name, int namelen,
                                   struct thandle *handle)
 {
-       return mdd_linkea_update_child_internal(env, parent, child, name,
+       return mdd_linkea_update_child_internal(env, parent, newparent,
+                                               child, name,
                                                namelen, handle, false);
 }
 
@@ -3729,7 +3734,7 @@ static int mdd_migrate_entries(const struct lu_env *env,
                                GOTO(out_put, rc);
                }
 
-               rc = mdd_linkea_declare_update_child(env, mdd_tobj,
+               rc = mdd_linkea_declare_update_child(env, mdd_sobj,mdd_tobj,
                                                     child, name,
                                                     strlen(name),
                                                     handle);
@@ -3768,7 +3773,8 @@ static int mdd_migrate_entries(const struct lu_env *env,
                                GOTO(out_put, rc);
                }
 
-               rc = mdd_linkea_update_child(env, mdd_tobj, child, name,
+               rc = mdd_linkea_update_child(env, mdd_sobj, mdd_tobj,
+                                            child, name,
                                             strlen(name), handle);
 
 out_put: