From 487dab18f28a36982059c823103993123876778e Mon Sep 17 00:00:00 2001 From: braam Date: Sun, 23 Jun 2002 19:12:57 +0000 Subject: [PATCH] - add reentrant locks --- lustre/include/linux/lustre_lib.h | 14 ++++++ lustre/ldlm/Makefile.am | 11 ++++- lustre/lib/l_lock.c | 96 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 120 insertions(+), 1 deletion(-) create mode 100644 lustre/lib/l_lock.c diff --git a/lustre/include/linux/lustre_lib.h b/lustre/include/linux/lustre_lib.h index 3367c1d..8f5c5ac 100644 --- a/lustre/include/linux/lustre_lib.h +++ b/lustre/include/linux/lustre_lib.h @@ -32,9 +32,23 @@ #endif #include +#include #include #ifdef __KERNEL__ +/* l_lock.c */ +struct lustre_lock { + int l_depth; + struct task_struct *l_owner; + struct semaphore l_sem; + spinlock_t l_spin; +}; + +void l_lock_init(struct lustre_lock *); +void l_lock(struct lustre_lock *); +void l_unlock(struct lustre_lock *); + + /* page.c */ inline void lustre_put_page(struct page *page); struct page *lustre_get_page_read(struct inode *dir, unsigned long index); diff --git a/lustre/ldlm/Makefile.am b/lustre/ldlm/Makefile.am index da6256a..66b9203 100644 --- a/lustre/ldlm/Makefile.am +++ b/lustre/ldlm/Makefile.am @@ -8,8 +8,17 @@ MODULE = ldlm modulefs_DATA = ldlm.o EXTRA_PROGRAMS = ldlm -ldlm_SOURCES = ldlm_lock.c ldlm_resource.c ldlm_test.c ldlm_lockd.c \ +l_lock.c: + test -e l_lock.c || ln -sf $(top_srcdir)/lib/l_lock.c + +LINX=l_lock.c + +ldlm_SOURCES = l_lock.c ldlm_lock.c ldlm_resource.c ldlm_test.c ldlm_lockd.c \ ldlm_extent.c ldlm_request.c +dist-hook: + list='$(LINX)'; for f in $$list; do rm -f $(distdir)/$$f; done + + include $(top_srcdir)/Rules diff --git a/lustre/lib/l_lock.c b/lustre/lib/l_lock.c new file mode 100644 index 0000000..ca253a2 --- /dev/null +++ b/lustre/lib/l_lock.c @@ -0,0 +1,96 @@ +/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*- + * vim:expandtab:shiftwidth=8:tabstop=8: + * + * Copyright (C) 2001, 2002 Cluster File Systems, Inc. + * + * This file is part of Lustre, http://www.sf.net/projects/lustre/ + * + * 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. + * + * 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. + * + * 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. + * + */ + + + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#define DEBUG_SUBSYSTEM S_LDLM + +#include +#include + +/* invariants: + - only the owner of the lock changes l_owner/l_depth + - before changing or checking the variables a spin lock is taken +*/ + +void l_lock_init(struct lustre_lock *lock) +{ + sema_init(&lock->l_sem, 1); + spin_lock_init(&lock->l_spin); +} + +void l_lock(struct lustre_lock *lock) +{ + int owner; + spin_lock(&lock->l_spin); + if (lock->l_owner == current) { + owner = 1; + } + spin_unlock(&lock->l_spin); + if (owner) + ++lock->l_depth; + else { + down(&lock->l_sem); + spin_lock(&lock->l_spin); + lock->l_owner = current; + lock->l_depth = 0; + spin_unlock(&lock->l_spin); + } +} + +void l_unlock(struct lustre_lock *lock) +{ + if (lock->l_owner != current) + LBUG(); + if (lock->l_depth < 0) + LBUG(); + + spin_lock(&lock->l_spin); + if (--lock->l_depth < 0) { + lock->l_owner = NULL; + spin_unlock(&lock->l_spin); + up(&lock->l_sem); + return ; + } + spin_unlock(&lock->l_spin); +} -- 1.8.3.1