Whamcloud - gitweb
LU-1347 style: removes obsolete EXPORT_SYMTAB macros
[fs/lustre-release.git] / lustre / obdclass / cl_lock.c
index 70d94a9..2dba495 100644 (file)
@@ -1,6 +1,4 @@
-/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
- * vim:expandtab:shiftwidth=8:tabstop=8:
- *
+/*
  * GPL HEADER START
  *
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
@@ -29,8 +27,7 @@
  * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
  * Use is subject to license terms.
  *
- * Copyright (c) 2011 Whamcloud, Inc.
- *
+ * Copyright (c) 2011, 2012, Whamcloud, Inc.
  */
 /*
  * This file is part of Lustre, http://www.lustre.org/
@@ -42,9 +39,6 @@
  */
 
 #define DEBUG_SUBSYSTEM S_CLASS
-#ifndef EXPORT_SYMTAB
-# define EXPORT_SYMTAB
-#endif
 
 #include <obd_class.h>
 #include <obd_support.h>
@@ -595,7 +589,6 @@ struct cl_lock *cl_lock_peek(const struct lu_env *env, const struct cl_io *io,
         struct cl_object_header *head;
         struct cl_object        *obj;
         struct cl_lock          *lock;
-        int ok;
 
         obj  = need->cld_obj;
         head = cl_object_header(obj);
@@ -616,14 +609,14 @@ struct cl_lock *cl_lock_peek(const struct lu_env *env, const struct cl_io *io,
                 if (result < 0)
                         cl_lock_error(env, lock, result);
         }
-        ok = lock->cll_state == CLS_HELD;
-        if (ok) {
+        if (lock->cll_state == CLS_HELD) {
                 cl_lock_hold_add(env, lock, scope, source);
                 cl_lock_user_add(env, lock);
+                cl_lock_mutex_put(env, lock);
+                cl_lock_lockdep_acquire(env, lock, 0);
                 cl_lock_put(env, lock);
-        }
-        cl_lock_mutex_put(env, lock);
-        if (!ok) {
+        } else {
+                cl_lock_mutex_put(env, lock);
                 cl_lock_put(env, lock);
                 lock = NULL;
         }
@@ -1926,11 +1919,13 @@ static int check_and_discard_cb(const struct lu_env *env, struct cl_io *io,
                         if (tmp->cll_descr.cld_end == CL_PAGE_EOF)
                                 info->clt_fn_index = CL_PAGE_EOF;
                         cl_lock_put(env, tmp);
-                } else { /* discard the page */
-                        cl_page_own(env, io, page);
+                } else if (cl_page_own(env, io, page) == 0) {
+                        /* discard the page */
                         cl_page_unmap(env, io, page);
                         cl_page_discard(env, io, page);
                         cl_page_disown(env, io, page);
+                } else {
+                        LASSERT(page->cp_state == CPS_FREEING);
                 }
         }
 
@@ -2076,10 +2071,22 @@ void cl_locks_prune(const struct lu_env *env, struct cl_object *obj, int cancel)
                 cl_lock_get_trust(lock);
                 cfs_spin_unlock(&head->coh_lock_guard);
                 lu_ref_add(&lock->cll_reference, "prune", cfs_current());
+
+again:
                 cl_lock_mutex_get(env, lock);
                 if (lock->cll_state < CLS_FREEING) {
                         LASSERT(lock->cll_holds == 0);
-                        LASSERT(lock->cll_users == 0);
+                        LASSERT(lock->cll_users <= 1);
+                        if (unlikely(lock->cll_users == 1)) {
+                                struct l_wait_info lwi = { 0 };
+
+                                cl_lock_mutex_put(env, lock);
+                                l_wait_event(lock->cll_wq,
+                                             lock->cll_users == 0,
+                                             &lwi);
+                                goto again;
+                        }
+
                         if (cancel)
                                 cl_lock_cancel(env, lock);
                         cl_lock_delete(env, lock);
@@ -2255,7 +2262,7 @@ void cl_lock_user_add(const struct lu_env *env, struct cl_lock *lock)
 }
 EXPORT_SYMBOL(cl_lock_user_add);
 
-int cl_lock_user_del(const struct lu_env *env, struct cl_lock *lock)
+void cl_lock_user_del(const struct lu_env *env, struct cl_lock *lock)
 {
         LINVRNT(cl_lock_is_mutexed(lock));
         LINVRNT(cl_lock_invariant(env, lock));
@@ -2263,7 +2270,9 @@ int cl_lock_user_del(const struct lu_env *env, struct cl_lock *lock)
 
         ENTRY;
         cl_lock_used_mod(env, lock, -1);
-        RETURN(lock->cll_users == 0);
+        if (lock->cll_users == 0)
+                cfs_waitq_broadcast(&lock->cll_wq);
+        EXIT;
 }
 EXPORT_SYMBOL(cl_lock_user_del);