linux/drivers/staging/lustre/lustre/ldlm/l_lock.c
<<
>>
Prefs
   1/*
   2 * GPL HEADER START
   3 *
   4 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   5 *
   6 * This program is free software; you can redistribute it and/or modify
   7 * it under the terms of the GNU General Public License version 2 only,
   8 * as published by the Free Software Foundation.
   9 *
  10 * This program is distributed in the hope that it will be useful, but
  11 * WITHOUT ANY WARRANTY; without even the implied warranty of
  12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  13 * General Public License version 2 for more details (a copy is included
  14 * in the LICENSE file that accompanied this code).
  15 *
  16 * You should have received a copy of the GNU General Public License
  17 * version 2 along with this program; If not, see
  18 * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf
  19 *
  20 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
  21 * CA 95054 USA or visit www.sun.com if you need additional information or
  22 * have any questions.
  23 *
  24 * GPL HEADER END
  25 */
  26/*
  27 * Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved.
  28 * Use is subject to license terms.
  29 *
  30 * Copyright (c) 2012, Intel Corporation.
  31 */
  32/*
  33 * This file is part of Lustre, http://www.lustre.org/
  34 * Lustre is a trademark of Sun Microsystems, Inc.
  35 */
  36
  37#define DEBUG_SUBSYSTEM S_LDLM
  38#include <linux/libcfs/libcfs.h>
  39
  40#include <lustre_dlm.h>
  41#include <lustre_lib.h>
  42
  43/**
  44 * Lock a lock and its resource.
  45 *
  46 * LDLM locking uses resource to serialize access to locks
  47 * but there is a case when we change resource of lock upon
  48 * enqueue reply. We rely on lock->l_resource = new_res
  49 * being an atomic operation.
  50 */
  51struct ldlm_resource *lock_res_and_lock(struct ldlm_lock *lock)
  52{
  53        /* on server-side resource of lock doesn't change */
  54        if (!lock->l_ns_srv)
  55                spin_lock(&lock->l_lock);
  56
  57        lock_res(lock->l_resource);
  58
  59        lock->l_res_locked = 1;
  60        return lock->l_resource;
  61}
  62EXPORT_SYMBOL(lock_res_and_lock);
  63
  64/**
  65 * Unlock a lock and its resource previously locked with lock_res_and_lock
  66 */
  67void unlock_res_and_lock(struct ldlm_lock *lock)
  68{
  69        /* on server-side resource of lock doesn't change */
  70        lock->l_res_locked = 0;
  71
  72        unlock_res(lock->l_resource);
  73        if (!lock->l_ns_srv)
  74                spin_unlock(&lock->l_lock);
  75}
  76EXPORT_SYMBOL(unlock_res_and_lock);
  77