CacheFiles: Handle object being killed before being set up
authorDavid Howells <dhowells@redhat.com>
Tue, 30 Sep 2014 13:50:28 +0000 (14:50 +0100)
committerDavid Howells <dhowells@redhat.com>
Tue, 30 Sep 2014 13:50:28 +0000 (14:50 +0100)
commita3b7c00484e1177e7eb9b047c46cac571b82442f
treeaf896c176c43d334691e5853104fe7bc126c4842
parentfe82dcec644244676d55a1384c958d5f67979adb
CacheFiles: Handle object being killed before being set up

If a cache object gets killed whilst in the process of being set up - for
instance if the netfs relinquishes the cookie that the object is associated
with - then the object's state machine will transit to the DROP_OBJECT state
without necessarily going through the LOOKUP_OBJECT or CREATE_OBJECT states.

This is a problem for CacheFiles because cachefiles_drop_object() assumes that
object->dentry will be set upon reaching the DROP_OBJECT state and has an
ASSERT() to that effect (see the oops below) - but object->dentry doesn't get
set until the LOOKUP_OBJECT or CREATE_OBJECT states (and not always then if
they fail).

To fix this, just make the dentry cleanup in cachefiles_drop_object()
conditional on the dentry actually being set and remove the assertion.

CacheFiles: Assertion failed
------------[ cut here ]------------
kernel BUG at .../fs/cachefiles/namei.c:425!
...
Workqueue: fscache_object fscache_object_work_func [fscache]
...
RIP: ... cachefiles_delete_object+0xcd/0x110 [cachefiles]
...
Call Trace:
 [<ffffffffa043280f>] ? cachefiles_drop_object+0xff/0x130 [cachefiles]
 [<ffffffffa02ac511>] ? fscache_drop_object+0xd1/0x1d0 [fscache]
 [<ffffffffa02ac697>] ? fscache_object_work_func+0x87/0x210 [fscache]
 [<ffffffff81080635>] ? process_one_work+0x155/0x450
 [<ffffffff81081c44>] ? worker_thread+0x114/0x370
 [<ffffffff81081b30>] ? manage_workers.isra.21+0x2c0/0x2c0
 [<ffffffff81087fcc>] ? kthread+0xbc/0xe0
 [<ffffffff81087f10>] ? flush_kthread_worker+0xa0/0xa0
 [<ffffffff8150638c>] ? ret_from_fork+0x7c/0xb0
 [<ffffffff81087f10>] ? flush_kthread_worker+0xa0/0xa0

Reported-by: Manuel Schölling <manuel.schoelling@gmx.de>
Signed-off-by: David Howells <dhowells@redhat.com>
Acked-by: Steve Dickson <steved@redhat.com>
fs/cachefiles/interface.c