From: shadow Date: Mon, 19 Jan 2009 21:18:09 +0000 (+0000) Subject: release lock refernce only after add page to pages list. X-Git-Tag: GIT_EPOCH_B1_6~2^5~244 X-Git-Url: https://git.whamcloud.com/?a=commitdiff_plain;h=3f353e3b3647ca2ffa39af0afff3ed773102baf1;p=fs%2Flustre-release.git release lock refernce only after add page to pages list. Branch b1_6 b=17972 i=shadow i=johann --- diff --git a/lustre/ChangeLog b/lustre/ChangeLog index e860d40..57cf3d6 100644 --- a/lustre/ChangeLog +++ b/lustre/ChangeLog @@ -131,6 +131,13 @@ Details : Page index integer overflow in ll_read_ahead_page information, please refer to bugzilla 17630. Severity : normal +Frequency : rarw +Bugzilla : 17972 +Descriptoin: stuck in cache_remove_extent() or panic with accessing to already + freed look. +Details : release lock refernce only after add page to pages list. + +Severity : normal Frequency : always with long access acl Bugzilla : 17636 Descriptoin: mds can't pack reply with long acl. diff --git a/lustre/osc/cache.c b/lustre/osc/cache.c index 1f7f64f..f0a8bce 100644 --- a/lustre/osc/cache.c +++ b/lustre/osc/cache.c @@ -86,6 +86,7 @@ int cache_add_extent(struct lustre_cache *cache, struct ldlm_res_id *res, struct lustre_handle tmplockh; ldlm_policy_data_t tmpex; struct ldlm_lock *lock = NULL; + int mode = 0; ENTRY; /* Don't add anything second time */ @@ -108,7 +109,6 @@ int cache_add_extent(struct lustre_cache *cache, struct ldlm_res_id *res, lock->l_policy_data.l_extent.start, lock->l_policy_data.l_extent.end, extent->oap_obj_off); } else { - int mode; /* Real extent width calculation here once we have real * extents */ @@ -138,13 +138,16 @@ int cache_add_extent(struct lustre_cache *cache, struct ldlm_res_id *res, "under us\n"); RETURN(-ENOLCK); } - ldlm_lock_decref(&tmplockh, mode); } spin_lock(&lock->l_extents_list_lock); list_add_tail(&extent->oap_page_list, &lock->l_extents_list); spin_unlock(&lock->l_extents_list_lock); extent->oap_ldlm_lock = lock; + LASSERTF(!(lock->l_flags & LDLM_FL_CANCEL), "Adding a page to already " + "cancelled lock %p", lock); + if (mode) + ldlm_lock_decref(&tmplockh, mode); LDLM_LOCK_PUT(lock); RETURN(0);