aboutsummaryrefslogtreecommitdiffstats
path: root/fs/cachefiles
diff options
context:
space:
mode:
authorDavid Howells <dhowells@redhat.com>2009-11-19 13:12:02 -0500
committerDavid Howells <dhowells@redhat.com>2009-11-19 13:12:02 -0500
commitd0e27b7808dc667f3015be0b6888f6d680e222c8 (patch)
treebf8451f0d9a95db14ed1ebda50d701f4f387c0d8 /fs/cachefiles
parent6511de33c877a53b3df545bc06c29e0f272837ff (diff)
CacheFiles: Better showing of debugging information in active object problems
Show more debugging information if cachefiles_mark_object_active() is asked to activate an active object. This may happen, for instance, if the netfs tries to register an object with the same key multiple times. The code is changed to (a) get the appropriate object lock to protect the cookie pointer whilst we dereference it, and (b) get and display the cookie key if available. Signed-off-by: David Howells <dhowells@redhat.com>
Diffstat (limited to 'fs/cachefiles')
-rw-r--r--fs/cachefiles/namei.c102
1 files changed, 75 insertions, 27 deletions
diff --git a/fs/cachefiles/namei.c b/fs/cachefiles/namei.c
index 3df86952ca64..00a0cda8f47a 100644
--- a/fs/cachefiles/namei.c
+++ b/fs/cachefiles/namei.c
@@ -27,6 +27,76 @@ static int cachefiles_wait_bit(void *flags)
27 return 0; 27 return 0;
28} 28}
29 29
30#define CACHEFILES_KEYBUF_SIZE 512
31
32/*
33 * dump debugging info about an object
34 */
35static noinline
36void __cachefiles_printk_object(struct cachefiles_object *object,
37 const char *prefix,
38 u8 *keybuf)
39{
40 struct fscache_cookie *cookie;
41 unsigned keylen, loop;
42
43 printk(KERN_ERR "%sobject: OBJ%x\n",
44 prefix, object->fscache.debug_id);
45 printk(KERN_ERR "%sobjstate=%s fl=%lx swfl=%lx ev=%lx[%lx]\n",
46 prefix, fscache_object_states[object->fscache.state],
47 object->fscache.flags, object->fscache.work.flags,
48 object->fscache.events,
49 object->fscache.event_mask & FSCACHE_OBJECT_EVENTS_MASK);
50 printk(KERN_ERR "%sops=%u inp=%u exc=%u\n",
51 prefix, object->fscache.n_ops, object->fscache.n_in_progress,
52 object->fscache.n_exclusive);
53 printk(KERN_ERR "%sparent=%p\n",
54 prefix, object->fscache.parent);
55
56 spin_lock(&object->fscache.lock);
57 cookie = object->fscache.cookie;
58 if (cookie) {
59 printk(KERN_ERR "%scookie=%p [pr=%p nd=%p fl=%lx]\n",
60 prefix,
61 object->fscache.cookie,
62 object->fscache.cookie->parent,
63 object->fscache.cookie->netfs_data,
64 object->fscache.cookie->flags);
65 if (keybuf)
66 keylen = cookie->def->get_key(cookie->netfs_data, keybuf,
67 CACHEFILES_KEYBUF_SIZE);
68 else
69 keylen = 0;
70 } else {
71 printk(KERN_ERR "%scookie=NULL\n", prefix);
72 keylen = 0;
73 }
74 spin_unlock(&object->fscache.lock);
75
76 if (keylen) {
77 printk(KERN_ERR "%skey=[%u] '", prefix, keylen);
78 for (loop = 0; loop < keylen; loop++)
79 printk("%02x", keybuf[loop]);
80 printk("'\n");
81 }
82}
83
84/*
85 * dump debugging info about a pair of objects
86 */
87static noinline void cachefiles_printk_object(struct cachefiles_object *object,
88 struct cachefiles_object *xobject)
89{
90 u8 *keybuf;
91
92 keybuf = kmalloc(CACHEFILES_KEYBUF_SIZE, GFP_NOIO);
93 if (object)
94 __cachefiles_printk_object(object, "", keybuf);
95 if (xobject)
96 __cachefiles_printk_object(xobject, "x", keybuf);
97 kfree(keybuf);
98}
99
30/* 100/*
31 * record the fact that an object is now active 101 * record the fact that an object is now active
32 */ 102 */
@@ -42,8 +112,11 @@ static void cachefiles_mark_object_active(struct cachefiles_cache *cache,
42try_again: 112try_again:
43 write_lock(&cache->active_lock); 113 write_lock(&cache->active_lock);
44 114
45 if (test_and_set_bit(CACHEFILES_OBJECT_ACTIVE, &object->flags)) 115 if (test_and_set_bit(CACHEFILES_OBJECT_ACTIVE, &object->flags)) {
116 printk(KERN_ERR "CacheFiles: Error: Object already active\n");
117 cachefiles_printk_object(object, NULL);
46 BUG(); 118 BUG();
119 }
47 120
48 dentry = object->dentry; 121 dentry = object->dentry;
49 _p = &cache->active_nodes.rb_node; 122 _p = &cache->active_nodes.rb_node;
@@ -76,32 +149,7 @@ wait_for_old_object:
76 printk(KERN_ERR "\n"); 149 printk(KERN_ERR "\n");
77 printk(KERN_ERR "CacheFiles: Error:" 150 printk(KERN_ERR "CacheFiles: Error:"
78 " Unexpected object collision\n"); 151 " Unexpected object collision\n");
79 printk(KERN_ERR "xobject: OBJ%x\n", 152 cachefiles_printk_object(object, xobject);
80 xobject->fscache.debug_id);
81 printk(KERN_ERR "xobjstate=%s\n",
82 fscache_object_states[xobject->fscache.state]);
83 printk(KERN_ERR "xobjflags=%lx\n", xobject->fscache.flags);
84 printk(KERN_ERR "xobjevent=%lx [%lx]\n",
85 xobject->fscache.events, xobject->fscache.event_mask);
86 printk(KERN_ERR "xops=%u inp=%u exc=%u\n",
87 xobject->fscache.n_ops, xobject->fscache.n_in_progress,
88 xobject->fscache.n_exclusive);
89 printk(KERN_ERR "xcookie=%p [pr=%p nd=%p fl=%lx]\n",
90 xobject->fscache.cookie,
91 xobject->fscache.cookie->parent,
92 xobject->fscache.cookie->netfs_data,
93 xobject->fscache.cookie->flags);
94 printk(KERN_ERR "xparent=%p\n",
95 xobject->fscache.parent);
96 printk(KERN_ERR "object: OBJ%x\n",
97 object->fscache.debug_id);
98 printk(KERN_ERR "cookie=%p [pr=%p nd=%p fl=%lx]\n",
99 object->fscache.cookie,
100 object->fscache.cookie->parent,
101 object->fscache.cookie->netfs_data,
102 object->fscache.cookie->flags);
103 printk(KERN_ERR "parent=%p\n",
104 object->fscache.parent);
105 BUG(); 153 BUG();
106 } 154 }
107 atomic_inc(&xobject->usage); 155 atomic_inc(&xobject->usage);