diff options
author | Dave Wysochanski <dwysocha@redhat.com> | 2020-04-15 22:14:41 +0200 |
---|---|---|
committer | David Howells <dhowells@redhat.com> | 2020-05-08 23:20:24 +0200 |
commit | d9bfced1fbcb35b28d8fbed4e785d2807055ed2b (patch) | |
tree | 753562fc75e601c311b446dffa48d2c6b4996cf0 /net | |
parent | cachefiles: Fix corruption of the return value in cachefiles_read_or_alloc_pa... (diff) | |
download | linux-d9bfced1fbcb35b28d8fbed4e785d2807055ed2b.tar.xz linux-d9bfced1fbcb35b28d8fbed4e785d2807055ed2b.zip |
NFS: Fix fscache super_cookie index_key from changing after umount
Commit 402cb8dda949 ("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: 402cb8dda949 ("fscache: Attach the index key and aux data to the cookie")
Signed-off-by: Dave Wysochanski <dwysocha@redhat.com>
Signed-off-by: David Howells <dhowells@redhat.com>
Diffstat (limited to 'net')
0 files changed, 0 insertions, 0 deletions