X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fldlm%2Fl_lock.c;h=e23a75530c5344ddd40fee3ff040a48efd79d067;hb=ec295cad998d4d5e7fc915491da5ac646dbc6af6;hp=746b4858868c752f29286640c18a5a46e3df254a;hpb=9065e88a7257a98de247f18f997557bd7ccbcb1d;p=fs%2Flustre-release.git diff --git a/lustre/ldlm/l_lock.c b/lustre/ldlm/l_lock.c index 746b485..e23a755 100644 --- a/lustre/ldlm/l_lock.c +++ b/lustre/ldlm/l_lock.c @@ -3,48 +3,69 @@ * * Copyright (C) 2001, 2002 Cluster File Systems, Inc. * - * This file is part of Lustre, http://www.sf.net/projects/lustre/ + * This file is part of the Lustre file system, http://www.lustre.org + * Lustre is a trademark of Cluster File Systems, Inc. * - * Lustre is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. + * You may have signed or agreed to another license before downloading + * this software. If so, you are bound by the terms and conditions + * of that agreement, and the following does not apply to you. See the + * LICENSE file included with this distribution for more information. * - * Lustre is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. + * If you did not agree to a different license, then this copy of Lustre + * is open source software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. * - * You should have received a copy of the GNU General Public License - * along with Lustre; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * In either case, Lustre is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * license text for more details. * */ #define DEBUG_SUBSYSTEM S_LDLM #ifdef __KERNEL__ -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -#include -#include -#include -#include -#include -#include -#include +#include #else #include #endif -#include -#include +#include +#include + +/* + * ldlm locking uses resource to serialize access to locks + * but there is a case when we change resource of lock upon + * enqueue reply. we rely on that lock->l_resource = new_res + * is atomic + */ +struct ldlm_resource * lock_res_and_lock(struct ldlm_lock *lock) +{ + struct ldlm_resource *res = lock->l_resource; + + if (ns_is_server(res->lr_namespace)) { + /* on server-side resource of lock doesn't change */ + lock_res(res); + return res; + } + + spin_lock(&lock->l_lock); + res = lock->l_resource; + lock_res(res); + return res; +} + +void unlock_res_and_lock(struct ldlm_lock *lock) +{ + struct ldlm_resource *res = lock->l_resource; + + if (ns_is_server(res->lr_namespace)) { + /* on server-side resource of lock doesn't change */ + unlock_res(res); + return; + } + + unlock_res(res); + spin_unlock(&lock->l_lock); +}