X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Flov%2Flovsub_lock.c;h=7916d204305cfddc10e7e7a8182de7f2cc174232;hb=b356ff8e1bec6a1653c3ab5ed393742344457f64;hp=3915be9a14418b9b2ccf11201ec678346bb45dfe;hpb=2989b9dab9e87529ccadfc5711960b71e5e57b18;p=fs%2Flustre-release.git diff --git a/lustre/lov/lovsub_lock.c b/lustre/lov/lovsub_lock.c index 3915be9..7916d20 100644 --- a/lustre/lov/lovsub_lock.c +++ b/lustre/lov/lovsub_lock.c @@ -27,7 +27,7 @@ * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved. * Use is subject to license terms. * - * Copyright (c) 2011, Whamcloud, Inc. + * Copyright (c) 2011, 2012, Intel Corporation. */ /* * This file is part of Lustre, http://www.lustre.org/ @@ -59,33 +59,33 @@ static void lovsub_lock_fini(const struct lu_env *env, ENTRY; lsl = cl2lovsub_lock(slice); - LASSERT(cfs_list_empty(&lsl->lss_parents)); + LASSERT(list_empty(&lsl->lss_parents)); OBD_SLAB_FREE_PTR(lsl, lovsub_lock_kmem); EXIT; } static void lovsub_parent_lock(const struct lu_env *env, struct lov_lock *lov) { - struct cl_lock *parent; - - ENTRY; - parent = lov->lls_cl.cls_lock; - cl_lock_get(parent); - lu_ref_add(&parent->cll_reference, "lovsub-parent", cfs_current()); - cl_lock_mutex_get(env, parent); - EXIT; + struct cl_lock *parent; + + ENTRY; + parent = lov->lls_cl.cls_lock; + cl_lock_get(parent); + lu_ref_add(&parent->cll_reference, "lovsub-parent", current); + cl_lock_mutex_get(env, parent); + EXIT; } static void lovsub_parent_unlock(const struct lu_env *env, struct lov_lock *lov) { - struct cl_lock *parent; - - ENTRY; - parent = lov->lls_cl.cls_lock; - cl_lock_mutex_put(env, lov->lls_cl.cls_lock); - lu_ref_del(&parent->cll_reference, "lovsub-parent", cfs_current()); - cl_lock_put(env, parent); - EXIT; + struct cl_lock *parent; + + ENTRY; + parent = lov->lls_cl.cls_lock; + cl_lock_mutex_put(env, lov->lls_cl.cls_lock); + lu_ref_del(&parent->cll_reference, "lovsub-parent", current); + cl_lock_put(env, parent); + EXIT; } /** @@ -103,7 +103,7 @@ static void lovsub_lock_state(const struct lu_env *env, LASSERT(cl_lock_is_mutexed(slice->cls_lock)); ENTRY; - cfs_list_for_each_entry(scan, &sub->lss_parents, lll_list) { + list_for_each_entry(scan, &sub->lss_parents, lll_list) { struct lov_lock *lov = scan->lll_super; struct cl_lock *parent = lov->lls_cl.cls_lock; @@ -131,7 +131,7 @@ static unsigned long lovsub_lock_weigh(const struct lu_env *env, LASSERT(cl_lock_is_mutexed(slice->cls_lock)); - if (!cfs_list_empty(&lock->lss_parents)) { + if (!list_empty(&lock->lss_parents)) { /* * It is not clear whether all parents have to be asked and * their estimations summed, or it is enough to ask one. For @@ -220,7 +220,14 @@ int lov_sublock_modify(const struct lu_env *env, struct lov_lock *lov, pd->cld_mode = parent_descr->cld_mode; pd->cld_gid = parent_descr->cld_gid; lovsub_lock_descr_map(d, subobj->lso_super, subobj->lso_index, pd); - lov->lls_sub[idx].sub_got = *d; + + /* LU-3027: only update extent of lock, plus the change in + * lovsub_lock_delete() that lock extent is modified after a sublock + * is canceled, we can make sure that the lock extent won't be updated + * any more. Therefore, lov_lock_fits_into() will always find feasible + * locks */ + lov->lls_sub[idx].sub_got.cld_start = d->cld_start; + lov->lls_sub[idx].sub_got.cld_end = d->cld_end; /* * Notify top-lock about modification, if lock description changes * materially. @@ -245,7 +252,7 @@ static int lovsub_lock_modify(const struct lu_env *env, LASSERT(cl_lock_mode_match(d->cld_mode, s->cls_lock->cll_descr.cld_mode)); - cfs_list_for_each_entry(scan, &lock->lss_parents, lll_list) { + list_for_each_entry(scan, &lock->lss_parents, lll_list) { int rc; lov = scan->lll_super; @@ -272,7 +279,7 @@ static int lovsub_lock_closure(const struct lu_env *env, sub = cl2lovsub_lock(slice); result = 0; - cfs_list_for_each_entry(scan, &sub->lss_parents, lll_list) { + list_for_each_entry(scan, &sub->lss_parents, lll_list) { parent = scan->lll_super->lls_cl.cls_lock; result = cl_lock_closure_build(env, parent, closure); if (result != 0) @@ -297,6 +304,7 @@ static int lovsub_lock_delete_one(const struct lu_env *env, RETURN(0); result = 0; + lov->lls_ever_canceled = 1; switch (parent->cll_state) { case CLS_ENQUEUED: /* See LU-1355 for the case that a glimpse lock is @@ -380,6 +388,7 @@ static int lovsub_lock_delete_one(const struct lu_env *env, break; case CLS_HELD: CL_LOCK_DEBUG(D_ERROR, env, parent, "Delete CLS_HELD lock\n"); + /* falling through */ default: CERROR("Impossible state: %d\n", parent->cll_state); LBUG(); @@ -415,15 +424,12 @@ static void lovsub_lock_delete(const struct lu_env *env, struct lov_lock *lov; struct lov_lock_link *scan; struct lov_lock_link *temp; - struct lov_lock_sub *subdata; restart = 0; - cfs_list_for_each_entry_safe(scan, temp, + list_for_each_entry_safe(scan, temp, &sub->lss_parents, lll_list) { lov = scan->lll_super; - subdata = &lov->lls_sub[scan->lll_idx]; lovsub_parent_lock(env, lov); - subdata->sub_got = subdata->sub_descr; lov_lock_unlink(env, scan, sub); restart = lovsub_lock_delete_one(env, child, lov); lovsub_parent_unlock(env, lov); @@ -444,7 +450,7 @@ static int lovsub_lock_print(const struct lu_env *env, void *cookie, struct lov_lock *lov; struct lov_lock_link *scan; - cfs_list_for_each_entry(scan, &sub->lss_parents, lll_list) { + list_for_each_entry(scan, &sub->lss_parents, lll_list) { lov = scan->lll_super; (*p)(env, cookie, "[%d %p ", scan->lll_idx, lov); if (lov != NULL) @@ -466,20 +472,20 @@ static const struct cl_lock_operations lovsub_lock_ops = { }; int lovsub_lock_init(const struct lu_env *env, struct cl_object *obj, - struct cl_lock *lock, const struct cl_io *io) + struct cl_lock *lock, const struct cl_io *io) { - struct lovsub_lock *lsk; - int result; - - ENTRY; - OBD_SLAB_ALLOC_PTR_GFP(lsk, lovsub_lock_kmem, CFS_ALLOC_IO); - if (lsk != NULL) { - CFS_INIT_LIST_HEAD(&lsk->lss_parents); - cl_lock_slice_add(lock, &lsk->lss_cl, obj, &lovsub_lock_ops); - result = 0; - } else - result = -ENOMEM; - RETURN(result); + struct lovsub_lock *lsk; + int result; + + ENTRY; + OBD_SLAB_ALLOC_PTR_GFP(lsk, lovsub_lock_kmem, GFP_NOFS); + if (lsk != NULL) { + INIT_LIST_HEAD(&lsk->lss_parents); + cl_lock_slice_add(lock, &lsk->lss_cl, obj, &lovsub_lock_ops); + result = 0; + } else + result = -ENOMEM; + RETURN(result); } /** @} lov */