Whamcloud - gitweb
branch=b1_6
authorzhanghc <zhanghc>
Sun, 30 Nov 2008 16:12:46 +0000 (16:12 +0000)
committerzhanghc <zhanghc>
Sun, 30 Nov 2008 16:12:46 +0000 (16:12 +0000)
b=17031

during refreshing locks waiting its I/O to complete,
take current service time into account, not only using
the timeout gotten by ldlm_get_enqueue_timeout

i=Andreas
i=Nathan.Rutman

lustre/ldlm/ldlm_lockd.c

index ef6c4a0..1386afe 100644 (file)
@@ -285,7 +285,8 @@ static void waiting_locks_callback(unsigned long unused)
                         LDLM_LOCK_GET(lock);
                         spin_unlock_bh(&waiting_locks_spinlock);
                         LDLM_DEBUG(lock, "prolong the busy lock");
-                        ldlm_refresh_waiting_lock(lock);
+                        ldlm_refresh_waiting_lock(lock, 
+                                                  ldlm_get_enq_timeout(lock));
                         spin_lock_bh(&waiting_locks_spinlock);
 
                         if (!cont) {
@@ -362,7 +363,7 @@ static void waiting_locks_callback(unsigned long unused)
  *
  * Called with the namespace lock held.
  */
-static int __ldlm_add_waiting_lock(struct ldlm_lock *lock)
+static int __ldlm_add_waiting_lock(struct ldlm_lock *lock, int seconds)
 {
         cfs_time_t timeout;
         cfs_time_t timeout_rounded;
@@ -372,11 +373,9 @@ static int __ldlm_add_waiting_lock(struct ldlm_lock *lock)
 
         if (OBD_FAIL_CHECK(OBD_FAIL_PTLRPC_HPREQ_NOTIMEOUT) ||
             OBD_FAIL_CHECK(OBD_FAIL_PTLRPC_HPREQ_TIMEOUT))
-                timeout = 2;
-        else
-                timeout = ldlm_get_enq_timeout(lock);
+                seconds = 2;
 
-        timeout = cfs_time_shift(timeout);
+        timeout = cfs_time_shift(seconds);
         if (likely(cfs_time_after(timeout, lock->l_callback_timeout)))
                 lock->l_callback_timeout = timeout;
 
@@ -411,7 +410,7 @@ static int ldlm_add_waiting_lock(struct ldlm_lock *lock)
                 return 0;
         }
 
-        ret = __ldlm_add_waiting_lock(lock);
+        ret = __ldlm_add_waiting_lock(lock, ldlm_get_enq_timeout(lock));
         if (ret)
                 /* grab ref on the lock if it has been added to the
                  * waiting list */
@@ -485,7 +484,7 @@ int ldlm_del_waiting_lock(struct ldlm_lock *lock)
  *
  * Called with namespace lock held.
  */
-int ldlm_refresh_waiting_lock(struct ldlm_lock *lock)
+int ldlm_refresh_waiting_lock(struct ldlm_lock *lock, int timeout)
 {
         if (lock->l_export == NULL) {
                 /* We don't have a "waiting locks list" on clients. */
@@ -504,7 +503,7 @@ int ldlm_refresh_waiting_lock(struct ldlm_lock *lock)
         /* we remove/add the lock to the waiting list, so no needs to
          * release/take a lock reference */
         __ldlm_del_waiting_lock(lock);
-        __ldlm_add_waiting_lock(lock);
+        __ldlm_add_waiting_lock(lock, timeout);
         spin_unlock_bh(&waiting_locks_spinlock);
 
         LDLM_DEBUG(lock, "refreshed");
@@ -523,7 +522,7 @@ int ldlm_del_waiting_lock(struct ldlm_lock *lock)
         RETURN(0);
 }
 
-int ldlm_refresh_waiting_lock(struct ldlm_lock *lock)
+int ldlm_refresh_waiting_lock(struct ldlm_lock *lock, int timeout)
 {
         RETURN(0);
 }