* Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
* Use is subject to license terms.
*
+ * Copyright (c) 2012, 2013, Intel Corporation.
+ *
* Author: Nikita Danilov <nikita.danilov@sun.com>
*
* This file is part of Lustre, http://www.lustre.org.
*
* // current thread acquired a temporary reference to foo.
* foo_get(foo);
- * lu_ref_add(&foo->reference, __FUNCTION__, cfs_current());
+ * lu_ref_add(&foo->reference, __FUNCTION__, current);
*
* ...
*
* // temporary reference is released.
- * lu_ref_del(&foo->reference, __FUNCTION__, cfs_current());
+ * lu_ref_del(&foo->reference, __FUNCTION__, current);
* foo_put(foo);
* \endcode
*
#ifdef USE_LU_REF
-/* An incomplete type (defined locally in lu_ref.c) */
-struct lu_ref_link;
-
/**
* Data-structure to keep track of references to a given object. This is used
* for debugging.
* etc.) refer to.
*/
struct lu_ref {
- /**
- * Spin-lock protecting lu_ref::lf_list.
- */
- cfs_spinlock_t lf_guard;
- /**
- * List of all outstanding references (each represented by struct
- * lu_ref_link), pointing to this object.
- */
- cfs_list_t lf_list;
+ /**
+ * Spin-lock protecting lu_ref::lf_list.
+ */
+ spinlock_t lf_guard;
+ /**
+ * List of all outstanding references (each represented by struct
+ * lu_ref_link), pointing to this object.
+ */
+ struct list_head lf_list;
/**
* # of links.
*/
/**
* Linkage into a global list of all lu_ref's (lu_ref_refs).
*/
- cfs_list_t lf_linkage;
+ struct list_head lf_linkage;
+};
+
+struct lu_ref_link {
+ struct lu_ref *ll_ref;
+ struct list_head ll_linkage;
+ const char *ll_scope;
+ const void *ll_source;
};
void lu_ref_init_loc(struct lu_ref *ref, const char *func, const int line);
void lu_ref_fini (struct lu_ref *ref);
#define lu_ref_init(ref) lu_ref_init_loc(ref, __FUNCTION__, __LINE__)
-struct lu_ref_link *lu_ref_add (struct lu_ref *ref, const char *scope,
- const void *source);
-struct lu_ref_link *lu_ref_add_atomic(struct lu_ref *ref, const char *scope,
- const void *source);
-void lu_ref_del (struct lu_ref *ref, const char *scope,
- const void *source);
-void lu_ref_set_at (struct lu_ref *ref,
- struct lu_ref_link *link,
- const char *scope, const void *source0,
- const void *source1);
-void lu_ref_del_at (struct lu_ref *ref,
- struct lu_ref_link *link,
- const char *scope, const void *source);
-void lu_ref_print (const struct lu_ref *ref);
-void lu_ref_print_all (void);
+void lu_ref_add(struct lu_ref *ref, const char *scope, const void *source);
+
+void lu_ref_add_atomic(struct lu_ref *ref, const char *scope,
+ const void *source);
+
+void lu_ref_add_at(struct lu_ref *ref, struct lu_ref_link *link,
+ const char *scope, const void *source);
+
+void lu_ref_del(struct lu_ref *ref, const char *scope, const void *source);
+
+void lu_ref_set_at(struct lu_ref *ref, struct lu_ref_link *link,
+ const char *scope, const void *source0, const void *source1);
+
+void lu_ref_del_at(struct lu_ref *ref, struct lu_ref_link *link,
+ const char *scope, const void *source);
+
+void lu_ref_print(const struct lu_ref *ref);
+
+void lu_ref_print_all(void);
+
+int lu_ref_global_init(void);
+
+void lu_ref_global_fini(void);
#else /* !USE_LU_REF */
-struct lu_ref {};
+struct lu_ref {
+};
+
+struct lu_ref_link {
+};
static inline void lu_ref_init(struct lu_ref *ref)
{
{
}
-static inline struct lu_ref_link *lu_ref_add(struct lu_ref *ref,
- const char *scope,
- const void *source)
+static inline void lu_ref_add(struct lu_ref *ref,
+ const char *scope,
+ const void *source)
+{
+}
+
+static inline void lu_ref_add_atomic(struct lu_ref *ref,
+ const char *scope,
+ const void *source)
{
- return NULL;
}
-static inline struct lu_ref_link *lu_ref_add_atomic(struct lu_ref *ref,
- const char *scope,
- const void *source)
+static inline void lu_ref_add_at(struct lu_ref *ref,
+ struct lu_ref_link *link,
+ const char *scope,
+ const void *source)
{
- return NULL;
}
static inline void lu_ref_del(struct lu_ref *ref, const char *scope,