LU-3240 (commit
762f2114d282a98ebfa4dbbeea9298a8088ad24e) set parent
dir fid the same as child fid in getattr by fid case we should not
lu_object_find() the object again, could lead to hung if there is a
concurrent unlink destroyed the object.
Signed-off-by: Bobi Jam <bobijam.xu@intel.com>
Change-Id: I75256c0fa684877cbd2e1f36f8ab2ac3faab2989
Reviewed-on: http://review.whamcloud.com/7990
Tested-by: Jenkins
Reviewed-by: John L. Hammond <john.hammond@intel.com>
Reviewed-by: Fan Yong <fan.yong@intel.com>
Tested-by: Maloo <hpdd-maloo@intel.com>
Reviewed-by: Oleg Drokin <oleg.drokin@intel.com>
mdt_set_disposition(info, ldlm_rep, DISP_LOOKUP_POS);
}
mdt_set_disposition(info, ldlm_rep, DISP_LOOKUP_POS);
}
- /*
- *step 3: find the child object by fid & lock it.
- * regardless if it is local or remote.
- */
- child = mdt_object_find(info->mti_env, info->mti_mdt, child_fid);
+ /*
+ *step 3: find the child object by fid & lock it.
+ * regardless if it is local or remote.
+ *
+ *Note: LU-3240 (commit 762f2114d282a98ebfa4dbbeea9298a8088ad24e)
+ * set parent dir fid the same as child fid in getattr by fid case
+ * we should not lu_object_find() the object again, could lead
+ * to hung if there is a concurrent unlink destroyed the object.
+ */
+ if (lu_fid_eq(mdt_object_fid(parent), child_fid)) {
+ mdt_object_get(info->mti_env, parent);
+ child = parent;
+ } else {
+ child = mdt_object_find(info->mti_env, info->mti_mdt,
+ child_fid);
+ }
if (unlikely(IS_ERR(child)))
GOTO(out_parent, rc = PTR_ERR(child));
if (unlikely(IS_ERR(child)))
GOTO(out_parent, rc = PTR_ERR(child));