]> git.baikalelectronics.ru Git - kernel.git/commit
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)
committerLinus Torvalds <torvalds@linux-foundation.org>
Mon, 17 Feb 2014 21:47:35 +0000 (13:47 -0800)
commit82b1c67fde2dde63dc05787e17b36e2b436fed3c
treebddfd52b6d380a6620b6fd0703ae6230168d3a6d
parent33d6b589143a8ed8e9a9e009efc2fe87b8d4f73e
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>
Tested-by: (a customer of) NeilBrown <neilb@suse.de>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
fs/fscache/object-list.c
fs/fscache/object.c