From 04b7e9da288256072db0882ce74e51a51fc207d3 Mon Sep 17 00:00:00 2001 From: thantry Date: Thu, 5 Sep 2002 21:20:50 +0000 Subject: [PATCH] Re-added lock(s) as library --- lustre/lib/l_lock.c | 96 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 lustre/lib/l_lock.c diff --git a/lustre/lib/l_lock.c b/lustre/lib/l_lock.c new file mode 100644 index 0000000..db072e0 --- /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 + - if a non-owner changes or checks 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 = 0; + 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