Skip to content
  • David Howells's avatar
    FS-Cache: Handle read request vs lookup, creation or other cache failure · e3d4d28b
    David Howells authored
    
    
    FS-Cache doesn't correctly handle the netfs requesting a read from the cache
    on an object that failed or was withdrawn by the cache.  A trace similar to
    the following might be seen:
    
    	CacheFiles: Lookup failed error -105
    	[exe   ] unexpected submission OP165afe [OBJ6cac OBJECT_LC_DYING]
    	[exe   ] objstate=OBJECT_LC_DYING [OBJECT_LC_DYING]
    	[exe   ] objflags=0
    	[exe   ] objevent=9 [fffffffffffffffb]
    	[exe   ] ops=0 inp=0 exc=0
    	Pid: 6970, comm: exe Not tainted 2.6.32-rc6-cachefs #50
    	Call Trace:
    	 [<ffffffffa0076477>] fscache_submit_op+0x3ff/0x45a [fscache]
    	 [<ffffffffa0077997>] __fscache_read_or_alloc_pages+0x187/0x3c4 [fscache]
    	 [<ffffffffa00b6480>] ? nfs_readpage_from_fscache_complete+0x0/0x66 [nfs]
    	 [<ffffffffa00b6388>] __nfs_readpages_from_fscache+0x7e/0x176 [nfs]
    	 [<ffffffff8108e483>] ? __alloc_pages_nodemask+0x11c/0x5cf
    	 [<ffffffffa009d796>] nfs_readpages+0x114/0x1d7 [nfs]
    	 [<ffffffff81090314>] __do_page_cache_readahead+0x15f/0x1ec
    	 [<ffffffff81090228>] ? __do_page_cache_readahead+0x73/0x1ec
    	 [<ffffffff810903bd>] ra_submit+0x1c/0x20
    	 [<ffffffff810906bb>] ondemand_readahead+0x227/0x23a
    	 [<ffffffff81090762>] page_cache_sync_readahead+0x17/0x19
    	 [<ffffffff8108a99e>] generic_file_aio_read+0x236/0x5a0
    	 [<ffffffffa00937bd>] nfs_file_read+0xe4/0xf3 [nfs]
    	 [<ffffffff810b2fa2>] do_sync_read+0xe3/0x120
    	 [<ffffffff81354cc3>] ? _spin_unlock_irq+0x2b/0x31
    	 [<ffffffff8104c0f1>] ? autoremove_wake_function+0x0/0x34
    	 [<ffffffff811848e5>] ? selinux_file_permission+0x5d/0x10f
    	 [<ffffffff81352bdb>] ? thread_return+0x3e/0x101
    	 [<ffffffff8117d7b0>] ? security_file_permission+0x11/0x13
    	 [<ffffffff810b3b06>] vfs_read+0xaa/0x16f
    	 [<ffffffff81058df0>] ? trace_hardirqs_on_caller+0x10c/0x130
    	 [<ffffffff810b3c84>] sys_read+0x45/0x6c
    	 [<ffffffff8100ae2b>] system_call_fastpath+0x16/0x1b
    
    The object state might also be OBJECT_DYING or OBJECT_WITHDRAWING.
    
    This should be handled by simply rejecting the new operation with ENOBUFS.
    There's no need to log an error for it.  Events of this type now appear in the
    stats file under Ops:rej.
    
    Signed-off-by: default avatarDavid Howells <dhowells@redhat.com>
    e3d4d28b