From c596549220a1fbed61eedb94eac8cfe81ff091a8 Mon Sep 17 00:00:00 2001 From: Wang Di Date: Mon, 21 Dec 2009 17:43:58 -0500 Subject: [PATCH] b=20607 Correct the refcount of lov_request_set i=Andreas Dilger i=Eric May --- lustre/lov/lov_internal.h | 15 ++++++++++++++ lustre/lov/lov_request.c | 50 ++++++++++++++++++++--------------------------- 2 files changed, 36 insertions(+), 29 deletions(-) diff --git a/lustre/lov/lov_internal.h b/lustre/lov/lov_internal.h index 7df674e..976b064 100644 --- a/lustre/lov/lov_internal.h +++ b/lustre/lov/lov_internal.h @@ -127,6 +127,21 @@ static inline struct lov_lock_handles *lov_llh_new(struct lov_stripe_md *lsm) return llh; } +void lov_finish_set(struct lov_request_set *set); + +static inline void lov_get_reqset(struct lov_request_set *set) +{ + LASSERT(set != NULL); + LASSERT(atomic_read(&set->set_refcount) > 0); + atomic_inc(&set->set_refcount); +} + +static inline void lov_put_reqset(struct lov_request_set *set) +{ + if (atomic_dec_and_test(&set->set_refcount)) + lov_finish_set(set); +} + static inline struct lov_lock_handles * lov_handle2llh(struct lustre_handle *handle) { diff --git a/lustre/lov/lov_request.c b/lustre/lov/lov_request.c index f1b4c05..7f53441 100644 --- a/lustre/lov/lov_request.c +++ b/lustre/lov/lov_request.c @@ -63,7 +63,7 @@ static void lov_init_set(struct lov_request_set *set) spin_lock_init(&set->set_lock); } -static void lov_finish_set(struct lov_request_set *set) +void lov_finish_set(struct lov_request_set *set) { struct list_head *pos, *n; ENTRY; @@ -281,8 +281,7 @@ int lov_fini_enqueue_set(struct lov_request_set *set, __u32 mode, int rc, } else if (set->set_lockh) lov_llh_put(set->set_lockh); - if (atomic_dec_and_test(&set->set_refcount)) - lov_finish_set(set); + lov_put_reqset(set); RETURN(rc ? rc : ret); } @@ -405,8 +404,7 @@ int lov_fini_match_set(struct lov_request_set *set, __u32 mode, int flags) (flags & LDLM_FL_TEST_LOCK)) lov_llh_put(set->set_lockh); - if (atomic_dec_and_test(&set->set_refcount)) - lov_finish_set(set); + lov_put_reqset(set); RETURN(rc); } @@ -497,8 +495,7 @@ int lov_fini_cancel_set(struct lov_request_set *set) if (set->set_lockh) lov_llh_put(set->set_lockh); - if (atomic_dec_and_test(&set->set_refcount)) - lov_finish_set(set); + lov_put_reqset(set); RETURN(rc); } @@ -672,9 +669,7 @@ int lov_fini_create_set(struct lov_request_set *set,struct lov_stripe_md **lsmp) if (set->set_completes) rc = create_done(set->set_exp, set, lsmp); - if (atomic_dec_and_test(&set->set_refcount)) - lov_finish_set(set); - + lov_put_reqset(set); RETURN(rc); } @@ -731,7 +726,10 @@ int cb_create_update(struct obd_info *oinfo, int rc) struct lov_request *lovreq; lovreq = container_of(oinfo, struct lov_request, rq_oi); - return lov_update_create_set(lovreq->rq_rqset, lovreq, rc); + rc= lov_update_create_set(lovreq->rq_rqset, lovreq, rc); + if (lov_finished_set(lovreq->rq_rqset)) + lov_put_reqset(lovreq->rq_rqset); + return rc; } @@ -754,14 +752,17 @@ int lov_prep_create_set(struct obd_export *exp, struct obd_info *oinfo, set->set_oi->oi_md = *lsmp; set->set_oi->oi_oa = src_oa; set->set_oti = oti; + lov_get_reqset(set); rc = qos_prep_create(exp, set); /* qos_shrink_lsm() may have allocated a new lsm */ *lsmp = oinfo->oi_md; - if (rc) + if (rc) { lov_fini_create_set(set, lsmp); - else + lov_put_reqset(set); + } else { *reqset = set; + } RETURN(rc); } @@ -844,8 +845,7 @@ int lov_fini_brw_set(struct lov_request_set *set) rc = brw_done(set); /* FIXME update qos data here */ } - if (atomic_dec_and_test(&set->set_refcount)) - lov_finish_set(set); + lov_put_reqset(set); RETURN(rc); } @@ -981,8 +981,7 @@ int lov_fini_getattr_set(struct lov_request_set *set) if (set->set_completes) rc = common_attr_done(set); - if (atomic_dec_and_test(&set->set_refcount)) - lov_finish_set(set); + lov_put_reqset(set); RETURN(rc); } @@ -1062,8 +1061,7 @@ int lov_fini_destroy_set(struct lov_request_set *set) /* FIXME update qos data here */ } - if (atomic_dec_and_test(&set->set_refcount)) - lov_finish_set(set); + lov_put_reqset(set); RETURN(0); } @@ -1140,8 +1138,7 @@ int lov_fini_setattr_set(struct lov_request_set *set) /* FIXME update qos data here */ } - if (atomic_dec_and_test(&set->set_refcount)) - lov_finish_set(set); + lov_put_reqset(set); RETURN(rc); } @@ -1269,8 +1266,7 @@ int lov_fini_punch_set(struct lov_request_set *set) rc = common_attr_done(set); } - if (atomic_dec_and_test(&set->set_refcount)) - lov_finish_set(set); + lov_put_reqset(set); RETURN(rc); } @@ -1393,8 +1389,7 @@ int lov_fini_sync_set(struct lov_request_set *set) /* FIXME update qos data here */ } - if (atomic_dec_and_test(&set->set_refcount)) - lov_finish_set(set); + lov_put_reqset(set); RETURN(rc); } @@ -1518,10 +1513,7 @@ int lov_fini_statfs_set(struct lov_request_set *set) rc = lov_fini_statfs(set->set_obd, set->set_oi->oi_osfs, set->set_success); } - - if (atomic_dec_and_test(&set->set_refcount)) - lov_finish_set(set); - + lov_put_reqset(set); RETURN(rc); } -- 1.8.3.1