X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Flov%2Flovsub_lock.c;h=3f0593cca61e2de7aad4de3036d393bae1cdb4b7;hb=9c6ebfd11be1cc11629a2960c8c818492e1f0980;hp=f15662aef77e47bb0d79e1661154ba771e584a5f;hpb=65701b4a30efdb695776bcf690a2b3cabc928da1;p=fs%2Flustre-release.git diff --git a/lustre/lov/lovsub_lock.c b/lustre/lov/lovsub_lock.c index f15662a..3f0593c 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. @@ -29,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/ @@ -155,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 */ @@ -169,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; @@ -301,6 +298,11 @@ static int lovsub_lock_delete_one(const struct lu_env *env, result = 0; switch (parent->cll_state) { + 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_FREEING: cl_lock_signal(env, parent); @@ -376,7 +378,6 @@ static int lovsub_lock_delete_one(const struct lu_env *env, } } break; - case CLS_ENQUEUED: case CLS_HELD: CL_LOCK_DEBUG(D_ERROR, env, parent, "Delete CLS_HELD lock\n"); default: @@ -471,7 +472,7 @@ int lovsub_lock_init(const struct lu_env *env, struct cl_object *obj, int result; ENTRY; - OBD_SLAB_ALLOC_PTR_GFP(lsk, lovsub_lock_kmem, CFS_ALLOC_IO); + OBD_SLAB_ALLOC_PTR_GFP(lsk, lovsub_lock_kmem, __GFP_IO); if (lsk != NULL) { CFS_INIT_LIST_HEAD(&lsk->lss_parents); cl_lock_slice_add(lock, &lsk->lss_cl, obj, &lovsub_lock_ops);