Details : imp_lock should be held while iterating over imp_sending_list for
prevent destroy request after get timeout in ptlrpc_queue_wait.
+Severity : normal
+Bugzilla : 12689
+Description: replay-single.sh test 52 fails
+Details : A lock's skiplist need to be cleanup when it being unlinked
+ from its resource list.
+
--------------------------------------------------------------------------------
2007-05-03 Cluster File Systems, Inc. <info@clusterfs.com>
void ldlm_reprocess_all_ns(struct ldlm_namespace *ns);
void ldlm_lock_dump(int level, struct ldlm_lock *lock, int pos);
void ldlm_lock_dump_handle(int level, struct lustre_handle *);
+void ldlm_unlink_lock_skiplist(struct ldlm_lock *req);
/* resource.c */
struct ldlm_namespace *ldlm_namespace_new(char *name, __u32 local);
}
}
-static void ldlm_unlink_lock_skiplist(struct ldlm_lock *req)
+void ldlm_unlink_lock_skiplist(struct ldlm_lock *req)
{
struct ldlm_lock *lock;
+
+ if (req->l_resource->lr_type != LDLM_PLAIN &&
+ req->l_resource->lr_type != LDLM_IBITS)
+ return;
if (LDLM_SL_HEAD(&req->l_sl_mode)) {
lock = list_entry(req->l_res_link.next, struct ldlm_lock,
/* Yes, second time, just in case it was added again while we were
running with no res lock in ldlm_cancel_callback */
ldlm_del_waiting_lock(lock);
- if (!(LDLM_SL_EMPTY(&lock->l_sl_mode) &&
- LDLM_SL_EMPTY(&lock->l_sl_policy)) &&
- (lock->l_resource->lr_type == LDLM_PLAIN ||
- lock->l_resource->lr_type == LDLM_IBITS))
- ldlm_unlink_lock_skiplist(lock);
ldlm_resource_unlink_lock(lock);
ldlm_lock_destroy_nolock(lock);
unlock_res_and_lock(lock);
else if (lock->l_res_link.next != &res->lr_granted)
mark_lock = list_entry(lock->l_res_link.next,
struct ldlm_lock, l_res_link);
- if (join != LDLM_JOIN_NONE)
- ldlm_unlink_lock_skiplist(lock);
}
ldlm_resource_unlink_lock(lock);