X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fldlm%2Fl_lock.c;h=b652097355ca025fe4a40ee4f2902b99e253b4d4;hb=258e762d6b42220292c5a634af1e931d32741d0f;hp=25662809a40e1ca56d3d62b8e29651b8efd688ef;hpb=933ae24da26f871feb09bc739ba5a8a593eaacfb;p=fs%2Flustre-release.git diff --git a/lustre/ldlm/l_lock.c b/lustre/ldlm/l_lock.c index 2566280..b652097 100644 --- a/lustre/ldlm/l_lock.c +++ b/lustre/ldlm/l_lock.c @@ -20,8 +20,8 @@ * */ - - +#define DEBUG_SUBSYSTEM S_LDLM +#ifdef __KERNEL__ #include #include #include @@ -41,55 +41,46 @@ #include #include #include +#else +#include +#endif -#define DEBUG_SUBSYSTEM S_LDLM - -#include +#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) +/* + * 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) { - sema_init(&lock->l_sem, 1); - spin_lock_init(&lock->l_spin); -} + struct ldlm_resource *res = lock->l_resource; -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); - } + if (!res->lr_namespace->ns_client) { + /* on server-side resource of lock doesn't change */ + lock_res(res); + return res; + } + + lock_bitlock(lock); + res = lock->l_resource; + lock_res(res); + return res; } -void l_unlock(struct lustre_lock *lock) +void unlock_res_and_lock(struct ldlm_lock *lock) { - if (lock->l_owner != current) - LBUG(); - if (lock->l_depth < 0) - LBUG(); + struct ldlm_resource *res = lock->l_resource; - spin_lock(&lock->l_spin); - if (--lock->l_depth < 0) { - lock->l_owner = NULL; - spin_unlock(&lock->l_spin); - up(&lock->l_sem); - return ; + if (!res->lr_namespace->ns_client) { + /* on server-side resource of lock doesn't change */ + unlock_res(res); + return; } - spin_unlock(&lock->l_spin); + + unlock_res(res); + unlock_bitlock(lock); } +