FS-Cache: Handle removal of unadded object to the fscache_object_list rb tree
authorDavid Howells <dhowells@redhat.com>
Mon, 17 Feb 2014 15:01:47 +0000 (15:01 +0000)
committerJiri Slaby <jslaby@suse.cz>
Thu, 3 Apr 2014 08:32:20 +0000 (10:32 +0200)
commitc8a3d3bcd7dc2893790c38695a8ecd79c4fbad99
tree4f2e58c6ed5847fd65222ebf8da71ff947f7209f
parent67ea60618db0ee32fb9fb37050e467612959d060
FS-Cache: Handle removal of unadded object to the fscache_object_list rb tree

commit 7026f1929e18921fd67bf478f475a8fdfdff16ae upstream.

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>
Tested-by: (a customer of) NeilBrown <neilb@suse.de>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Jiri Slaby <jslaby@suse.cz>
fs/fscache/object-list.c
fs/fscache/object.c