|
@@ -0,0 +1,165 @@
|
|
|
|
+/* Internal definitions for FS-Cache
|
|
|
|
+ *
|
|
|
|
+ * Copyright (C) 2004-2007 Red Hat, Inc. All Rights Reserved.
|
|
|
|
+ * Written by David Howells (dhowells@redhat.com)
|
|
|
|
+ *
|
|
|
|
+ * This program is free software; you can redistribute it and/or
|
|
|
|
+ * modify it under the terms of the GNU General Public License
|
|
|
|
+ * as published by the Free Software Foundation; either version
|
|
|
|
+ * 2 of the License, or (at your option) any later version.
|
|
|
|
+ */
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+ * Lock order, in the order in which multiple locks should be obtained:
|
|
|
|
+ * - fscache_addremove_sem
|
|
|
|
+ * - cookie->lock
|
|
|
|
+ * - cookie->parent->lock
|
|
|
|
+ * - cache->object_list_lock
|
|
|
|
+ * - object->lock
|
|
|
|
+ * - object->parent->lock
|
|
|
|
+ * - fscache_thread_lock
|
|
|
|
+ *
|
|
|
|
+ */
|
|
|
|
+
|
|
|
|
+#include <linux/fscache-cache.h>
|
|
|
|
+#include <linux/sched.h>
|
|
|
|
+
|
|
|
|
+#define FSCACHE_MIN_THREADS 4
|
|
|
|
+#define FSCACHE_MAX_THREADS 32
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+ * fsc-main.c
|
|
|
|
+ */
|
|
|
|
+extern unsigned fscache_defer_lookup;
|
|
|
|
+extern unsigned fscache_defer_create;
|
|
|
|
+extern unsigned fscache_debug;
|
|
|
|
+extern struct kobject *fscache_root;
|
|
|
|
+
|
|
|
|
+/*****************************************************************************/
|
|
|
|
+/*
|
|
|
|
+ * debug tracing
|
|
|
|
+ */
|
|
|
|
+#define dbgprintk(FMT, ...) \
|
|
|
|
+ printk(KERN_DEBUG "[%-6.6s] "FMT"\n", current->comm, ##__VA_ARGS__)
|
|
|
|
+
|
|
|
|
+/* make sure we maintain the format strings, even when debugging is disabled */
|
|
|
|
+static inline __attribute__((format(printf, 1, 2)))
|
|
|
|
+void _dbprintk(const char *fmt, ...)
|
|
|
|
+{
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+#define kenter(FMT, ...) dbgprintk("==> %s("FMT")", __func__, ##__VA_ARGS__)
|
|
|
|
+#define kleave(FMT, ...) dbgprintk("<== %s()"FMT"", __func__, ##__VA_ARGS__)
|
|
|
|
+#define kdebug(FMT, ...) dbgprintk(FMT, ##__VA_ARGS__)
|
|
|
|
+
|
|
|
|
+#define kjournal(FMT, ...) _dbprintk(FMT, ##__VA_ARGS__)
|
|
|
|
+
|
|
|
|
+#ifdef __KDEBUG
|
|
|
|
+#define _enter(FMT, ...) kenter(FMT, ##__VA_ARGS__)
|
|
|
|
+#define _leave(FMT, ...) kleave(FMT, ##__VA_ARGS__)
|
|
|
|
+#define _debug(FMT, ...) kdebug(FMT, ##__VA_ARGS__)
|
|
|
|
+
|
|
|
|
+#elif defined(CONFIG_FSCACHE_DEBUG)
|
|
|
|
+#define _enter(FMT, ...) \
|
|
|
|
+do { \
|
|
|
|
+ if (__do_kdebug(ENTER)) \
|
|
|
|
+ kenter(FMT, ##__VA_ARGS__); \
|
|
|
|
+} while (0)
|
|
|
|
+
|
|
|
|
+#define _leave(FMT, ...) \
|
|
|
|
+do { \
|
|
|
|
+ if (__do_kdebug(LEAVE)) \
|
|
|
|
+ kleave(FMT, ##__VA_ARGS__); \
|
|
|
|
+} while (0)
|
|
|
|
+
|
|
|
|
+#define _debug(FMT, ...) \
|
|
|
|
+do { \
|
|
|
|
+ if (__do_kdebug(DEBUG)) \
|
|
|
|
+ kdebug(FMT, ##__VA_ARGS__); \
|
|
|
|
+} while (0)
|
|
|
|
+
|
|
|
|
+#else
|
|
|
|
+#define _enter(FMT, ...) _dbprintk("==> %s("FMT")", __func__, ##__VA_ARGS__)
|
|
|
|
+#define _leave(FMT, ...) _dbprintk("<== %s()"FMT"", __func__, ##__VA_ARGS__)
|
|
|
|
+#define _debug(FMT, ...) _dbprintk(FMT, ##__VA_ARGS__)
|
|
|
|
+#endif
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+ * determine whether a particular optional debugging point should be logged
|
|
|
|
+ * - we need to go through three steps to persuade cpp to correctly join the
|
|
|
|
+ * shorthand in FSCACHE_DEBUG_LEVEL with its prefix
|
|
|
|
+ */
|
|
|
|
+#define ____do_kdebug(LEVEL, POINT) \
|
|
|
|
+ unlikely((fscache_debug & \
|
|
|
|
+ (FSCACHE_POINT_##POINT << (FSCACHE_DEBUG_ ## LEVEL * 3))))
|
|
|
|
+#define ___do_kdebug(LEVEL, POINT) \
|
|
|
|
+ ____do_kdebug(LEVEL, POINT)
|
|
|
|
+#define __do_kdebug(POINT) \
|
|
|
|
+ ___do_kdebug(FSCACHE_DEBUG_LEVEL, POINT)
|
|
|
|
+
|
|
|
|
+#define FSCACHE_DEBUG_CACHE 0
|
|
|
|
+#define FSCACHE_DEBUG_COOKIE 1
|
|
|
|
+#define FSCACHE_DEBUG_PAGE 2
|
|
|
|
+#define FSCACHE_DEBUG_OPERATION 3
|
|
|
|
+
|
|
|
|
+#define FSCACHE_POINT_ENTER 1
|
|
|
|
+#define FSCACHE_POINT_LEAVE 2
|
|
|
|
+#define FSCACHE_POINT_DEBUG 4
|
|
|
|
+
|
|
|
|
+#ifndef FSCACHE_DEBUG_LEVEL
|
|
|
|
+#define FSCACHE_DEBUG_LEVEL CACHE
|
|
|
|
+#endif
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+ * assertions
|
|
|
|
+ */
|
|
|
|
+#if 1 /* defined(__KDEBUGALL) */
|
|
|
|
+
|
|
|
|
+#define ASSERT(X) \
|
|
|
|
+do { \
|
|
|
|
+ if (unlikely(!(X))) { \
|
|
|
|
+ printk(KERN_ERR "\n"); \
|
|
|
|
+ printk(KERN_ERR "FS-Cache: Assertion failed\n"); \
|
|
|
|
+ BUG(); \
|
|
|
|
+ } \
|
|
|
|
+} while (0)
|
|
|
|
+
|
|
|
|
+#define ASSERTCMP(X, OP, Y) \
|
|
|
|
+do { \
|
|
|
|
+ if (unlikely(!((X) OP (Y)))) { \
|
|
|
|
+ printk(KERN_ERR "\n"); \
|
|
|
|
+ printk(KERN_ERR "FS-Cache: Assertion failed\n"); \
|
|
|
|
+ printk(KERN_ERR "%lx " #OP " %lx is false\n", \
|
|
|
|
+ (unsigned long)(X), (unsigned long)(Y)); \
|
|
|
|
+ BUG(); \
|
|
|
|
+ } \
|
|
|
|
+} while (0)
|
|
|
|
+
|
|
|
|
+#define ASSERTIF(C, X) \
|
|
|
|
+do { \
|
|
|
|
+ if (unlikely((C) && !(X))) { \
|
|
|
|
+ printk(KERN_ERR "\n"); \
|
|
|
|
+ printk(KERN_ERR "FS-Cache: Assertion failed\n"); \
|
|
|
|
+ BUG(); \
|
|
|
|
+ } \
|
|
|
|
+} while (0)
|
|
|
|
+
|
|
|
|
+#define ASSERTIFCMP(C, X, OP, Y) \
|
|
|
|
+do { \
|
|
|
|
+ if (unlikely((C) && !((X) OP (Y)))) { \
|
|
|
|
+ printk(KERN_ERR "\n"); \
|
|
|
|
+ printk(KERN_ERR "FS-Cache: Assertion failed\n"); \
|
|
|
|
+ printk(KERN_ERR "%lx " #OP " %lx is false\n", \
|
|
|
|
+ (unsigned long)(X), (unsigned long)(Y)); \
|
|
|
|
+ BUG(); \
|
|
|
|
+ } \
|
|
|
|
+} while (0)
|
|
|
|
+
|
|
|
|
+#else
|
|
|
|
+
|
|
|
|
+#define ASSERT(X) do {} while (0)
|
|
|
|
+#define ASSERTCMP(X, OP, Y) do {} while (0)
|
|
|
|
+#define ASSERTIF(C, X) do {} while (0)
|
|
|
|
+#define ASSERTIFCMP(C, X, OP, Y) do {} while (0)
|
|
|
|
+
|
|
|
|
+#endif /* assert or not */
|