diff options
| -rw-r--r-- | fs/cachefiles/namei.c | 102 |
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 | */ | ||
| 35 | static noinline | ||
| 36 | void __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 | */ | ||
| 87 | static 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, | |||
| 42 | try_again: | 112 | try_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); |
