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 "../../include/linux/libcfs/libcfs.h" 39 40#include "../include/lustre_dlm.h" 41#include "../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 spin_lock(&lock->l_lock); 54 55 lock_res(lock->l_resource); 56 57 lock->l_flags |= LDLM_FL_RES_LOCKED; 58 return lock->l_resource; 59} 60EXPORT_SYMBOL(lock_res_and_lock); 61 62/** 63 * Unlock a lock and its resource previously locked with lock_res_and_lock 64 */ 65void unlock_res_and_lock(struct ldlm_lock *lock) 66{ 67 /* on server-side resource of lock doesn't change */ 68 lock->l_flags &= ~LDLM_FL_RES_LOCKED; 69 70 unlock_res(lock->l_resource); 71 spin_unlock(&lock->l_lock); 72} 73EXPORT_SYMBOL(unlock_res_and_lock); 74