| /* 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 */ |