Whamcloud - gitweb
LU-3931 hsm: reprocess LDLM resource in mdt_hsm_release() 21/7621/3
authorJohn L. Hammond <john.hammond@intel.com>
Wed, 11 Sep 2013 21:55:11 +0000 (16:55 -0500)
committerOleg Drokin <oleg.drokin@intel.com>
Tue, 24 Sep 2013 18:18:56 +0000 (18:18 +0000)
In mdt_hsm_release() manually reprocess the LDLM resource (the file
being released) after cancelling the lease (exclusive open lock on the
same file).

Signed-off-by: John L. Hammond <john.hammond@intel.com>
Change-Id: Idc2333bc14432f24ef45d5f5d59c8518717c99c2
Reviewed-on: http://review.whamcloud.com/7621
Reviewed-by: Jinshan Xiong <jinshan.xiong@intel.com>
Tested-by: Hudson
Tested-by: Maloo <whamcloud.maloo@gmail.com>
Reviewed-by: Bobi Jam <bobijam@gmail.com>
Reviewed-by: Oleg Drokin <oleg.drokin@intel.com>
lustre/ldlm/ldlm_lock.c
lustre/mdt/mdt_open.c

index 70e09be..6758410 100644 (file)
@@ -2097,6 +2097,7 @@ restart:
 #endif
         EXIT;
 }
+EXPORT_SYMBOL(ldlm_reprocess_all);
 
 /**
  * Helper function to call blocking AST for LDLM lock \a lock in a
index 801d6a8..947023c 100644 (file)
@@ -1986,8 +1986,7 @@ static int mdt_hsm_release(struct mdt_thread_info *info, struct mdt_object *o,
        /* try to hold open_sem so that nobody else can open the file */
        if (!down_write_trylock(&o->mot_open_sem)) {
                ldlm_lock_cancel(lease);
-               LDLM_LOCK_PUT(lease);
-               RETURN(-EBUSY);
+               GOTO(out_reprocess, rc = -EBUSY);
        }
 
        /* Check if the lease open lease has already canceled */
@@ -2002,7 +2001,6 @@ static int mdt_hsm_release(struct mdt_thread_info *info, struct mdt_object *o,
         * have been cancelled. It's okay to cancel it now as we've
         * held mot_open_sem. */
        ldlm_lock_cancel(lease);
-       LDLM_LOCK_PUT(lease);
 
        if (lease_broken) /* don't perform release task */
                GOTO(out_unlock, rc = -ESTALE);
@@ -2130,6 +2128,10 @@ out_unlock:
                repbody->valid |= OBD_MD_FLRELEASED;
        }
 
+out_reprocess:
+       ldlm_reprocess_all(lease->l_resource);
+       LDLM_LOCK_PUT(lease);
+
        ma->ma_valid = 0;
        ma->ma_need = 0;