Whamcloud - gitweb
LU-4106 mdt: avoid recursive lu_object_find an object 90/7990/4
authorBobi Jam <bobijam.xu@intel.com>
Thu, 17 Oct 2013 07:25:35 +0000 (15:25 +0800)
committerOleg Drokin <oleg.drokin@intel.com>
Tue, 19 Nov 2013 14:00:44 +0000 (14:00 +0000)
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>
lustre/mdt/mdt_handler.c

index 74a0d80..ffad80d 100644 (file)
@@ -1358,11 +1358,22 @@ static int mdt_getattr_name_lock(struct mdt_thread_info *info,
                 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));