• David Howells's avatar
    FS-Cache: Handle removal of unadded object to the fscache_object_list rb tree · 7026f192
    David Howells authored
    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: default avatarNeilBrown <neilb@suse.de>
    Signed-off-by: default avatarDavid Howells <dhowells@redhat.com>
    Tested-by: default avatar(a customer of) NeilBrown <neilb@suse.de>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    7026f192
object-list.c 11.6 KB