Skip to content
  • Milosz Tanski's avatar
    fscache: Netfs function for cleanup post readpages · 5a6f282a
    Milosz Tanski authored
    
    
    Currently the fscache code expect the netfs to call fscache_readpages_or_alloc
    inside the aops readpages callback.  It marks all the pages in the list
    provided by readahead with PG_private_2.  In the cases that the netfs fails to
    read all the pages (which is legal) it ends up returning to the readahead and
    triggering a BUG.  This happens because the page list still contains marked
    pages.
    
    This patch implements a simple fscache_readpages_cancel function that the netfs
    should call before returning from readpages.  It will revoke the pages from the
    underlying cache backend and unmark them.
    
    The problem was originally worked out in the Ceph devel tree, but it also
    occurs in CIFS.  It appears that NFS, AFS and 9P are okay as read_cache_pages()
    will clean up the unprocessed pages in the case of an error.
    
    This can be used to address the following oops:
    
    [12410647.597278] BUG: Bad page state in process petabucket  pfn:3d504e
    [12410647.597292] page:ffffea000f541380 count:0 mapcount:0 mapping:
    	(null) index:0x0
    [12410647.597298] page flags: 0x200000000001000(private_2)
    
    ...
    
    [12410647.597334] Call Trace:
    [12410647.597345]  [<ffffffff815523f2>] dump_stack+0x19/0x1b
    [12410647.597356]  [<ffffffff8111def7>] bad_page+0xc7/0x120
    [12410647.597359]  [<ffffffff8111e49e>] free_pages_prepare+0x10e/0x120
    [12410647.597361]  [<ffffffff8111fc80>] free_hot_cold_page+0x40/0x170
    [12410647.597363]  [<ffffffff81123507>] __put_single_page+0x27/0x30
    [12410647.597365]  [<ffffffff81123df5>] put_page+0x25/0x40
    [12410647.597376]  [<ffffffffa02bdcf9>] ceph_readpages+0x2e9/0x6e0 [ceph]
    [12410647.597379]  [<ffffffff81122a8f>] __do_page_cache_readahead+0x1af/0x260
    [12410647.597382]  [<ffffffff81122ea1>] ra_submit+0x21/0x30
    [12410647.597384]  [<ffffffff81118f64>] filemap_fault+0x254/0x490
    [12410647.597387]  [<ffffffff8113a74f>] __do_fault+0x6f/0x4e0
    [12410647.597391]  [<ffffffff810125bd>] ? __switch_to+0x16d/0x4a0
    [12410647.597395]  [<ffffffff810865ba>] ? finish_task_switch+0x5a/0xc0
    [12410647.597398]  [<ffffffff8113d856>] handle_pte_fault+0xf6/0x930
    [12410647.597401]  [<ffffffff81008c33>] ? pte_mfn_to_pfn+0x93/0x110
    [12410647.597403]  [<ffffffff81008cce>] ? xen_pmd_val+0xe/0x10
    [12410647.597405]  [<ffffffff81005469>] ? __raw_callee_save_xen_pmd_val+0x11/0x1e
    [12410647.597407]  [<ffffffff8113f361>] handle_mm_fault+0x251/0x370
    [12410647.597411]  [<ffffffff812b0ac4>] ? call_rwsem_down_read_failed+0x14/0x30
    [12410647.597414]  [<ffffffff8155bffa>] __do_page_fault+0x1aa/0x550
    [12410647.597418]  [<ffffffff8108011d>] ? up_write+0x1d/0x20
    [12410647.597422]  [<ffffffff8113141c>] ? vm_mmap_pgoff+0xbc/0xe0
    [12410647.597425]  [<ffffffff81143bb8>] ? SyS_mmap_pgoff+0xd8/0x240
    [12410647.597427]  [<ffffffff8155c3ae>] do_page_fault+0xe/0x10
    [12410647.597431]  [<ffffffff81558818>] page_fault+0x28/0x30
    
    Signed-off-by: default avatarMilosz Tanski <milosz@adfin.com>
    Signed-off-by: default avatarDavid Howells <dhowells@redhat.com>
    5a6f282a