• David Howells's avatar
    fscache: Clear outstanding writes when disabling a cookie · 6bdded59
    David Howells authored
    fscache_disable_cookie() needs to clear the outstanding writes on the
    cookie it's disabling because they cannot be completed after.
    
    Without this, fscache_nfs_open_file() gets stuck because it disables the
    cookie when the file is opened for writing but can't uncache the pages till
    afterwards - otherwise there's a race between the open routine and anyone
    who already has it open R/O and is still reading from it.
    
    Looking in /proc/pid/stack of the offending process shows:
    
    [<ffffffffa0142883>] __fscache_wait_on_page_write+0x82/0x9b [fscache]
    [<ffffffffa014336e>] __fscache_uncache_all_inode_pages+0x91/0xe1 [fscache]
    [<ffffffffa01740fa>] nfs_fscache_open_file+0x59/0x9e [nfs]
    [<ffffffffa01ccf41>] nfs4_file_open+0x17f/0x1b8 [nfsv4]
    [<ffffffff8117350e>] do_dentry_open+0x16d/0x2b7
    [<ffffffff811743ac>] vfs_open+0x5c/0x65
    [<ffffffff81184185>] path_openat+0x785/0x8fb
    [<ffffffff81184343>] do_filp_open+0x48/0x9e
    [<ffffffff81174710>] do_sys_open+0x13b/0x1cb
    [<ffffffff811747b9>] SyS_open+0x19/0x1b
    [<ffffffff81001c44>] do_syscall_64+0x80/0x17a
    [<ffffffff8165c2da>] return_from_SYSCALL_64+0x0/0x7a
    [<ffffffffffffffff>] 0xffffffffffffffff
    Reported-by: default avatarJianhong Yin <jiyin@redhat.com>
    Signed-off-by: default avatarDavid Howells <dhowells@redhat.com>
    Acked-by: default avatarJeff Layton <jlayton@redhat.com>
    Acked-by: default avatarSteve Dickson <steved@redhat.com>
    Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
    6bdded59