r=niu
- memleak in lov_match() fixed: it didn't handle LDLM_FL_TEST_LOCK well
-static int enqueue_done(struct lov_request_set *set, __u32 mode)
+static int enqueue_done(struct lov_request_set *set, __u32 mode, int flags)
{
struct list_head *pos;
struct lov_request *req;
{
struct list_head *pos;
struct lov_request *req;
LASSERT(set->set_completes);
/* enqueue/match success, just return */
LASSERT(set->set_completes);
/* enqueue/match success, just return */
- if (set->set_completes == set->set_success)
+ if (set->set_completes == set->set_success) {
+ if (flags & LDLM_FL_TEST_LOCK)
+ lov_llh_put(set->set_lockh);
/* cancel enqueued/matched locks */
list_for_each (pos, &set->set_list) {
/* cancel enqueued/matched locks */
list_for_each (pos, &set->set_list) {
if (!req->rq_complete || req->rq_rc)
continue;
if (!req->rq_complete || req->rq_rc)
continue;
+ if (flags & LDLM_FL_TEST_LOCK)
+ continue;
lov_lockhp = set->set_lockh->llh_handles + req->rq_stripe;
LASSERT(lov_lockhp);
lov_lockhp = set->set_lockh->llh_handles + req->rq_stripe;
LASSERT(lov_lockhp);
if (set == NULL)
RETURN(0);
if (set->set_completes)
if (set == NULL)
RETURN(0);
if (set->set_completes)
- rc = enqueue_done(set, mode);
+ rc = enqueue_done(set, mode, 0);
else
lov_llh_put(set->set_lockh);
else
lov_llh_put(set->set_lockh);
int lov_update_match_set(struct lov_request_set *set, struct lov_request *req,
int rc)
{
int lov_update_match_set(struct lov_request_set *set, struct lov_request *req,
int rc)
{
-
- if (rc == 1)
- ret = 0;
- lov_update_set(set, req, ret);
+ lov_update_set(set, req, !rc);
LASSERT(set->set_exp);
if (set == NULL)
RETURN(0);
LASSERT(set->set_exp);
if (set == NULL)
RETURN(0);
- if (set->set_completes) {
- if (set->set_count == set->set_success &&
- flags & LDLM_FL_TEST_LOCK)
- lov_llh_put(set->set_lockh);
- rc = enqueue_done(set, mode);
- } else {
+ if (set->set_completes)
+ rc = enqueue_done(set, mode, flags);
+ else
lov_llh_put(set->set_lockh);
lov_llh_put(set->set_lockh);
if (atomic_dec_and_test(&set->set_refcount))
lov_finish_set(set);
if (atomic_dec_and_test(&set->set_refcount))
lov_finish_set(set);