Whamcloud - gitweb
b=23636 extend exp_lock protected area in target_process_req_flags
authorMikhail Pershin <tappro@sun.com>
Tue, 31 Aug 2010 12:21:19 +0000 (16:21 +0400)
committerMikhail Pershin <tappro@sun.com>
Tue, 31 Aug 2010 12:21:19 +0000 (16:21 +0400)
Issue was introduced by bug 17660, previously this was protected by obd lock

i=zam
i=vitaly

lustre/ldlm/ldlm_lib.c

index aa794f7..93f2366 100644 (file)
@@ -1912,25 +1912,27 @@ static int target_process_req_flags(struct obd_device *obd,
         LASSERT(exp != NULL);
         if (lustre_msg_get_flags(req->rq_reqmsg) & MSG_REQ_REPLAY_DONE) {
                 /* client declares he's ready to replay locks */
+                cfs_spin_lock(&exp->exp_lock);
                 if (exp->exp_req_replay_needed) {
-                        LASSERT(cfs_atomic_read(&obd->obd_req_replay_clients) >
-                                0);
-                        cfs_spin_lock(&exp->exp_lock);
                         exp->exp_req_replay_needed = 0;
                         cfs_spin_unlock(&exp->exp_lock);
+                        LASSERT(cfs_atomic_read(&obd->obd_req_replay_clients));
                         cfs_atomic_dec(&obd->obd_req_replay_clients);
+                } else {
+                        cfs_spin_unlock(&exp->exp_lock);
                 }
         }
         if (lustre_msg_get_flags(req->rq_reqmsg) & MSG_LOCK_REPLAY_DONE) {
                 /* client declares he's ready to complete recovery
                  * so, we put the request on th final queue */
+                cfs_spin_lock(&exp->exp_lock);
                 if (exp->exp_lock_replay_needed) {
-                        LASSERT(cfs_atomic_read(&obd->obd_lock_replay_clients) >
-                                0);
-                        cfs_spin_lock(&exp->exp_lock);
                         exp->exp_lock_replay_needed = 0;
                         cfs_spin_unlock(&exp->exp_lock);
+                        LASSERT(cfs_atomic_read(&obd->obd_lock_replay_clients));
                         cfs_atomic_dec(&obd->obd_lock_replay_clients);
+                } else {
+                        cfs_spin_unlock(&exp->exp_lock);
                 }
         }
         return 0;