• David Howells's avatar
    NFS: Use FS-Cache invalidation · de242c0b
    David Howells authored
    Use the new FS-Cache invalidation facility from NFS to deal with foreign
    changes being detected on the server rather than attempting to retire the old
    cookie and get a new one.
    
    The problem with the old method was that NFS did not wait for all outstanding
    storage and retrieval ops on the cache to complete.  There was no automatic
    wait between the calls to ->readpages() and calls to invalidate_inode_pages2()
    as the latter can only wait on locked pages that have been added to the
    pagecache (which they haven't yet on entry to ->readpages()).
    
    This was leading to oopses like the one below when an outstanding read got cut
    off from its cookie by a premature release.
    
    BUG: unable to handle kernel NULL pointer dereference at 00000000000000a8
    IP: [<ffffffffa0075118>] __fscache_read_or_alloc_pages+0x1dd/0x315 [fscache]
    PGD 15889067 PUD 15890067 PMD 0
    Oops: 0000 [#1] SMP
    CPU 0
    Modules linked in: cachefiles nfs fscache auth_rpcgss nfs_acl lockd sunrpc
    
    Pid: 4544, comm: tar Not tainted 3.1.0-rc4-fsdevel+ #1064                  /DG965RY
    RIP: 0010:[<ffffffffa0075118>]  [<ffffffffa0075118>] __fscache_read_or_alloc_pages+0x1dd/0x315 [fscache]
    RSP: 0018:ffff8800158799e8  EFLAGS: 00010246
    RAX: 0000000000000000 RBX: ffff8800070d41e0 RCX: ffff8800083dc1b0
    RDX: 0000000000000000 RSI: ffff880015879960 RDI: ffff88003e627b90
    RBP: ffff880015879a28 R08: 0000000000000002 R09: 0000000000000002
    R10: 0000000000000001 R11: ffff880015879950 R12: ffff880015879aa4
    R13: 0000000000000000 R14: ffff8800083dc158 R15: ffff880015879be8
    FS:  00007f671e9d87c0(0000) GS:ffff88003bc00000(0000) knlGS:0000000000000000
    CS:  0010 DS: 0000 ES: 0000 CR0: 000000008005003b
    CR2: 00000000000000a8 CR3: 000000001587f000 CR4: 00000000000006f0
    DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
    DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400
    Process tar (pid: 4544, threadinfo ffff880015878000, task ffff880015875040)
    Stack:
     ffffffffa00b1759 ffff8800070dc158 ffff8800000213da ffff88002a286508
     ffff880015879aa4 ffff880015879be8 0000000000000001 ffff88002a2866e8
     ffff880015879a88 ffffffffa00b20be 00000000000200da ffff880015875040
    Call Trace:
     [<ffffffffa00b1759>] ? nfs_fscache_wait_bit+0xd/0xd [nfs]
     [<ffffffffa00b20be>] __nfs_readpages_from_fscache+0x7e/0x13f [nfs]
     [<ffffffff81095fe7>] ? __alloc_pages_nodemask+0x156/0x662
     [<ffffffffa0098763>] nfs_readpages+0xee/0x187 [nfs]
     [<ffffffff81098a5e>] __do_page_cache_readahead+0x1be/0x267
     [<ffffffff81098942>] ? __do_page_cache_readahead+0xa2/0x267
     [<ffffffff81098d7b>] ra_submit+0x1c/0x20
     [<ffffffff8109900a>] ondemand_readahead+0x28b/0x29a
     [<ffffffff810990ce>] page_cache_sync_readahead+0x38/0x3a
     [<ffffffff81091d8a>] generic_file_aio_read+0x2ab/0x67e
     [<ffffffffa008cfbe>] nfs_file_read+0xa4/0xc9 [nfs]
     [<ffffffff810c22c4>] do_sync_read+0xba/0xfa
     [<ffffffff810a62c9>] ? might_fault+0x4e/0x9e
     [<ffffffff81177a47>] ? security_file_permission+0x7b/0x84
     [<ffffffff810c25dd>] ? rw_verify_area+0xab/0xc8
     [<ffffffff810c29a4>] vfs_read+0xaa/0x13a
     [<ffffffff810c2a79>] sys_read+0x45/0x6c
     [<ffffffff813ac37b>] system_call_fastpath+0x16/0x1b
    Reported-by: default avatarMark Moseley <moseleymark@gmail.com>
    Signed-off-by: default avatarDavid Howells <dhowells@redhat.com>
    de242c0b
inode.c 48.4 KB