• Dave Wysochanski's avatar
    NFS: Fix fscache super_cookie index_key from changing after umount · d9bfced1
    Dave Wysochanski authored
    Commit 402cb8dd ("fscache: Attach the index key and aux data to
    the cookie") added the index_key and index_key_len parameters to
    fscache_acquire_cookie(), and updated the callers in the NFS client.
    One of the callers was inside nfs_fscache_get_super_cookie()
    and was changed to use the full struct nfs_fscache_key as the
    index_key.  However, a couple members of this structure contain
    pointers and thus will change each time the same NFS share is
    remounted.  Since index_key is used for fscache_cookie->key_hash
    and this subsequently is used to compare cookies, the effectiveness
    of fscache with NFS is reduced to the point at which a umount
    occurs.   Any subsequent remount of the same share will cause a
    unique NFS super_block index_key and key_hash to be generated for
    the same data, rendering any prior fscache data unable to be
    found.  A simple reproducer demonstrates the problem.
    
    1. Mount share with 'fsc', create a file, drop page cache
    systemctl start cachefilesd
    mount -o vers=3,fsc 127.0.0.1:/export /mnt
    dd if=/dev/zero of=/mnt/file1.bin bs=4096 count=1
    echo 3 > /proc/sys/vm/drop_caches
    
    2. Read file into page cache and fscache, then unmount
    dd if=/mnt/file1.bin of=/dev/null bs=4096 count=1
    umount /mnt
    
    3. Remount and re-read which should come from fscache
    mount -o vers=3,fsc 127.0.0.1:/export /mnt
    echo 3 > /proc/sys/vm/drop_caches
    dd if=/mnt/file1.bin of=/dev/null bs=4096 count=1
    
    4. Check for READ ops in mountstats - there should be none
    grep READ: /proc/self/mountstats
    
    Looking at the history and the removed function, nfs_super_get_key(),
    we should only use nfs_fscache_key.key plus any uniquifier, for
    the fscache index_key.
    
    Fixes: 402cb8dd ("fscache: Attach the index key and aux data to the cookie")
    Signed-off-by: default avatarDave Wysochanski <dwysocha@redhat.com>
    Signed-off-by: default avatarDavid Howells <dhowells@redhat.com>
    d9bfced1
fscache.c 14.4 KB