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