X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Flov%2Flovsub_lock.c;h=a76acf27c118e7ffade07df836329dfcb9b78382;hb=db57d4cb311b5987f1006d4284e3bd10399ae4bb;hp=663547ab17b011b52efc73947f779026c8400305;hpb=51459371a2e146d01f9d2ef27fdf75d77639266f;p=fs%2Flustre-release.git diff --git a/lustre/lov/lovsub_lock.c b/lustre/lov/lovsub_lock.c index 663547a..a76acf2 100644 --- a/lustre/lov/lovsub_lock.c +++ b/lustre/lov/lovsub_lock.c @@ -1,6 +1,4 @@ -/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*- - * vim:expandtab:shiftwidth=8:tabstop=8: - * +/* * GPL HEADER START * * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. @@ -26,8 +24,10 @@ * GPL HEADER END */ /* - * Copyright 2008 Sun Microsystems, Inc. All rights reserved. + * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved. * Use is subject to license terms. + * + * Copyright (c) 2011, 2012, Intel Corporation. */ /* * This file is part of Lustre, http://www.lustre.org/ @@ -59,7 +59,7 @@ static void lovsub_lock_fini(const struct lu_env *env, ENTRY; lsl = cl2lovsub_lock(slice); - LASSERT(list_empty(&lsl->lss_parents)); + LASSERT(cfs_list_empty(&lsl->lss_parents)); OBD_SLAB_FREE_PTR(lsl, lovsub_lock_kmem); EXIT; } @@ -103,7 +103,7 @@ static void lovsub_lock_state(const struct lu_env *env, LASSERT(cl_lock_is_mutexed(slice->cls_lock)); ENTRY; - list_for_each_entry(scan, &sub->lss_parents, lll_list) { + cfs_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 (!list_empty(&lock->lss_parents)) { + if (!cfs_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 @@ -153,10 +153,9 @@ static unsigned long lovsub_lock_weigh(const struct lu_env *env, * Maps start/end offsets within a stripe, to offsets within a file. */ static void lovsub_lock_descr_map(const struct cl_lock_descr *in, - struct lov_object *obj, - int stripe, struct cl_lock_descr *out) + struct lov_object *lov, + int stripe, struct cl_lock_descr *out) { - struct lov_stripe_md *lsm = lov_r0(obj)->lo_lsm; pgoff_t size; /* stripe size in pages */ pgoff_t skip; /* how many pages in every stripe are occupied by * "other" stripes */ @@ -167,9 +166,9 @@ static void lovsub_lock_descr_map(const struct cl_lock_descr *in, start = in->cld_start; end = in->cld_end; - if (lsm->lsm_stripe_count > 1) { - size = cl_index(lov2cl(obj), lsm->lsm_stripe_size); - skip = (lsm->lsm_stripe_count - 1) * size; + if (lov->lo_lsm->lsm_stripe_count > 1) { + size = cl_index(lov2cl(lov), lov->lo_lsm->lsm_stripe_size); + skip = (lov->lo_lsm->lsm_stripe_count - 1) * size; /* XXX overflow check here? */ start += start/size * skip + stripe * size; @@ -205,7 +204,6 @@ int lov_sublock_modify(const struct lu_env *env, struct lov_lock *lov, const struct cl_lock_descr *d, int idx) { struct cl_lock *parent; - struct cl_lock *child; struct lovsub_object *subobj; struct cl_lock_descr *pd; struct cl_lock_descr *parent_descr; @@ -215,7 +213,6 @@ int lov_sublock_modify(const struct lu_env *env, struct lov_lock *lov, parent_descr = &parent->cll_descr; LASSERT(cl_lock_mode_match(d->cld_mode, parent_descr->cld_mode)); - child = sublock->lss_cl.cls_lock; subobj = cl2lovsub(sublock->lss_cl.cls_obj); pd = &lov_env_info(env)->lti_ldescr; @@ -248,7 +245,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)); - list_for_each_entry(scan, &lock->lss_parents, lll_list) { + cfs_list_for_each_entry(scan, &lock->lss_parents, lll_list) { int rc; lov = scan->lll_super; @@ -275,7 +272,7 @@ static int lovsub_lock_closure(const struct lu_env *env, sub = cl2lovsub_lock(slice); result = 0; - list_for_each_entry(scan, &sub->lss_parents, lll_list) { + cfs_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) @@ -301,9 +298,12 @@ static int lovsub_lock_delete_one(const struct lu_env *env, result = 0; switch (parent->cll_state) { - case CLS_NEW: + case CLS_ENQUEUED: + /* See LU-1355 for the case that a glimpse lock is + * interrupted by signal */ + LASSERT(parent->cll_flags & CLF_CANCELLED); + break; case CLS_QUEUING: - case CLS_ENQUEUED: case CLS_FREEING: cl_lock_signal(env, parent); break; @@ -337,6 +337,8 @@ static int lovsub_lock_delete_one(const struct lu_env *env, * enqueues missing sub-lock. */ cl_lock_state_set(env, parent, CLS_NEW); + /* fall through */ + case CLS_NEW: /* * if last sub-lock is canceled, destroy the top-lock (which * is now `empty') proactively. @@ -379,7 +381,7 @@ static int lovsub_lock_delete_one(const struct lu_env *env, case CLS_HELD: CL_LOCK_DEBUG(D_ERROR, env, parent, "Delete CLS_HELD lock\n"); default: - CERROR("Impossible state: %i\n", parent->cll_state); + CERROR("Impossible state: %d\n", parent->cll_state); LBUG(); break; } @@ -416,8 +418,8 @@ static void lovsub_lock_delete(const struct lu_env *env, struct lov_lock_sub *subdata; restart = 0; - list_for_each_entry_safe(scan, temp, - &sub->lss_parents, lll_list) { + cfs_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); @@ -442,7 +444,7 @@ static int lovsub_lock_print(const struct lu_env *env, void *cookie, struct lov_lock *lov; struct lov_lock_link *scan; - list_for_each_entry(scan, &sub->lss_parents, lll_list) { + cfs_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)