X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Flov%2Flov_lock.c;h=79a69420c0794d16cb2142a94ac7ad11cb5094b4;hp=2917d78691453c3960845574cbfb2b865df5f196;hb=15385c3b934b511a1452327c701fbb6adad71416;hpb=06e7541eddc964e0b8534bc46d43e9ba4fcb3e1f diff --git a/lustre/lov/lov_lock.c b/lustre/lov/lov_lock.c index 2917d78..79a6942 100644 --- a/lustre/lov/lov_lock.c +++ b/lustre/lov/lov_lock.c @@ -144,7 +144,7 @@ static struct cl_lock *lov_sublock_alloc(const struct lu_env *env, LASSERT(idx < lck->lls_nr); ENTRY; - OBD_SLAB_ALLOC_PTR(link, lov_lock_link_kmem); + OBD_SLAB_ALLOC_PTR_GFP(link, lov_lock_link_kmem, CFS_ALLOC_IO); if (link != NULL) { struct lov_sublock_env *subenv; struct lov_lock_sub *lls; @@ -330,6 +330,8 @@ static int lov_lock_sub_init(const struct lu_env *env, descr->cld_start = cl_index(descr->cld_obj, start); descr->cld_end = cl_index(descr->cld_obj, end); descr->cld_mode = parent->cll_descr.cld_mode; + descr->cld_gid = parent->cll_descr.cld_gid; + /* XXX has no effect */ lck->lls_sub[nr].sub_got = *descr; lck->lls_sub[nr].sub_stripe = stripe; nr++; @@ -401,6 +403,7 @@ static int lov_sublock_release(const struct lu_env *env, struct lov_lock *lck, * while sub-lock is being paged out. */ dying = (sublock->cll_descr.cld_mode == CLM_PHANTOM || + sublock->cll_descr.cld_mode == CLM_GROUP || (sublock->cll_flags & (CLF_CANCELPEND|CLF_DOOMED))) && sublock->cll_holds == 1; if (dying) @@ -823,6 +826,7 @@ static int lov_lock_stripe_is_matching(const struct lu_env *env, subd->cld_obj = NULL; /* don't need sub object at all */ subd->cld_mode = descr->cld_mode; + subd->cld_gid = descr->cld_gid; result = lov_stripe_intersects(lsm, stripe, start, end, &sub_start, &sub_end); LASSERT(result); @@ -856,7 +860,12 @@ static int lov_lock_fits_into(const struct lu_env *env, ENTRY; - if (lov->lls_nr == 1) { + if (need->cld_mode == CLM_GROUP) + /* + * always allow to match group lock. + */ + result = cl_lock_ext_match(&lov->lls_orig, need); + else if (lov->lls_nr == 1) { struct cl_lock_descr *got = &lov->lls_sub[0].sub_got; result = lov_lock_stripe_is_matching(env, cl2lov(slice->cls_obj), @@ -1024,7 +1033,7 @@ int lov_lock_init_raid0(const struct lu_env *env, struct cl_object *obj, int result; ENTRY; - OBD_SLAB_ALLOC_PTR(lck, lov_lock_kmem); + OBD_SLAB_ALLOC_PTR_GFP(lck, lov_lock_kmem, CFS_ALLOC_IO); if (lck != NULL) { cl_lock_slice_add(lock, &lck->lls_cl, obj, &lov_lock_ops); result = lov_lock_sub_init(env, lck, io); @@ -1039,7 +1048,7 @@ static struct cl_lock_closure *lov_closure_get(const struct lu_env *env, struct cl_lock_closure *closure; closure = &lov_env_info(env)->lti_closure; - LINVRNT(list_empty(&closure->clc_list)); + LASSERT(list_empty(&closure->clc_list)); cl_lock_closure_init(env, closure, parent, 1); return closure; }