]> git.karo-electronics.de Git - karo-tx-linux.git/commit
FS-Cache: Handle removal of unadded object to the fscache_object_list rb tree
authorDavid Howells <dhowells@redhat.com>
Wed, 5 Feb 2014 15:14:40 +0000 (15:14 +0000)
committerDavid Howells <dhowells@redhat.com>
Wed, 5 Feb 2014 15:14:40 +0000 (15:14 +0000)
commitfe02fb3ec10932ce07406b1581e28326181fc9d8
treee96b56dc43218af638282eb4abf1efd02dc75ac9
parent38dbfb59d1175ef458d006556061adeaa8751b72
FS-Cache: Handle removal of unadded object to the fscache_object_list rb tree

When FS-Cache allocates an object, the following sequence of events can occur:

 -->fscache_alloc_object()
    -->cachefiles_alloc_object() [via cache->ops->alloc_object]
    <--[returns new object]
    -->fscache_attach_object()
    <--[failed]
    -->cachefiles_put_object() [via cache->ops->put_object]
       -->fscache_object_destroy()
          -->fscache_objlist_remove()
             -->rb_erase() to remove the object from fscache_object_list.

resulting in a crash in the rbtree code.

The problem is that the object is only added to fscache_object_list on the
success path of fscache_attach_object() where it calls fscache_objlist_add().

So if fscache_attach_object() fails, the object won't have been added to the
objlist rbtree.  We do, however, unconditionally try to remove the object from
the tree.

Thanks to NeilBrown for finding this and suggesting this solution.

Reported-by: NeilBrown <neilb@suse.de>
Signed-off-by: David Howells <dhowells@redhat.com>
fs/fscache/object-list.c
fs/fscache/object.c