Kiran Kumar Modukuri
eee2269fd0
cachefiles: Fix page leak in cachefiles_read_backing_file while vmscan is active
...
[ Upstream commit 9a24ce5b66f9c8190d63b15f4473600db4935f1f ]
[Description]
In a heavily loaded system where the system pagecache is nearing memory
limits and fscache is enabled, pages can be leaked by fscache while trying
read pages from cachefiles backend. This can happen because two
applications can be reading same page from a single mount, two threads can
be trying to read the backing page at same time. This results in one of
the threads finding that a page for the backing file or netfs file is
already in the radix tree. During the error handling cachefiles does not
clean up the reference on backing page, leading to page leak.
[Fix]
The fix is straightforward, to decrement the reference when error is
encountered.
[dhowells: Note that I've removed the clearance and put of newpage as
they aren't attested in the commit message and don't appear to actually
achieve anything since a new page is only allocated is newpage!=NULL and
any residual new page is cleared before returning.]
[Testing]
I have tested the fix using following method for 12+ hrs.
1) mkdir -p /mnt/nfs ; mount -o vers=3,fsc <server_ip>:/export /mnt/nfs
2) create 10000 files of 2.8MB in a NFS mount.
3) start a thread to simulate heavy VM presssure
(while true ; do echo 3 > /proc/sys/vm/drop_caches ; sleep 1 ; done)&
4) start multiple parallel reader for data set at same time
find /mnt/nfs -type f | xargs -P 80 cat > /dev/null &
find /mnt/nfs -type f | xargs -P 80 cat > /dev/null &
find /mnt/nfs -type f | xargs -P 80 cat > /dev/null &
..
..
find /mnt/nfs -type f | xargs -P 80 cat > /dev/null &
find /mnt/nfs -type f | xargs -P 80 cat > /dev/null &
5) finally check using cat /proc/fs/fscache/stats | grep -i pages ;
free -h , cat /proc/meminfo and page-types -r -b lru
to ensure all pages are freed.
Reviewed-by: Daniel Axtens <dja@axtens.net>
Signed-off-by: Shantanu Goel <sgoel01@yahoo.com>
Signed-off-by: Kiran Kumar Modukuri <kiran.modukuri@gmail.com>
[dja: forward ported to current upstream]
Signed-off-by: Daniel Axtens <dja@axtens.net>
Signed-off-by: David Howells <dhowells@redhat.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
2018-12-17 09:24:38 +01:00
..
9p
v9fs_dir_readdir: fix double-free on p9stat_read error
2018-12-01 09:37:27 +01:00
adfs
adfs: use timespec64 for time conversion
2018-08-22 10:52:51 -07:00
affs
afs
afs: Handle EIO from delivery function
2018-11-27 16:13:00 +01:00
autofs
Merge branch 'akpm' (patches from Andrew)
2018-08-22 12:34:08 -07:00
befs
fix a series of Documentation/ broken file name references
2018-06-15 18:10:01 -03:00
bfs
bfs: add sanity check at bfs_fill_super()
2018-12-01 09:37:27 +01:00
btrfs
Btrfs: send, fix infinite loop due to directory rename dependencies
2018-12-17 09:24:34 +01:00
cachefiles
cachefiles: Fix page leak in cachefiles_read_backing_file while vmscan is active
2018-12-17 09:24:38 +01:00
ceph
ceph: quota: fix null pointer dereference in quota check
2018-11-27 16:13:05 +01:00
cifs
cifs: Fix separator when building path from dentry
2018-12-13 09:16:20 +01:00
coda
vfs: change inode times to use struct timespec64
2018-06-05 16:57:31 -07:00
configfs
configfs: fix registered group removal
2018-07-17 06:14:07 -07:00
cramfs
Cramfs: fix abad comparison when wrap-arounds occur
2018-11-13 11:08:55 -08:00
crypto
crypto: speck - remove Speck
2018-11-13 11:08:46 -08:00
debugfs
Revert "debugfs: inode: debugfs_create_dir uses mode permission from parent"
2018-06-12 20:52:16 -07:00
devpts
devpts: Convert to new IDA API
2018-08-21 23:54:17 -04:00
dlm
treewide: Use array_size() in vmalloc()
2018-06-12 16:19:22 -07:00
ecryptfs
efivarfs
efivars: Call guid_parse() against guid_t type of variable
2018-07-22 14:13:44 +02:00
efs
exofs
fs/exofs: fix potential memory leak in mount option parsing
2018-11-27 16:13:00 +01:00
exportfs
exportfs: do not read dentry after free
2018-12-17 09:24:35 +01:00
ext2
ext2: fix potential use after free
2018-12-05 19:32:11 +01:00
ext4
ext4: fix buffer leak in __ext4_read_dirblock() on error path
2018-11-21 09:19:22 +01:00
f2fs
f2fs: fix to account IO correctly
2018-11-13 11:08:39 -08:00
fat
fs/fat/fatent.c: add cond_resched() to fat_count_free_clusters()
2018-10-13 09:31:03 +02:00
freevxfs
fscache
fscache: Fix out of bound read in long cookie keys
2018-10-18 11:32:21 +02:00
fuse
fuse: fix possibly missed wake-up after abort
2018-11-21 09:19:24 +01:00
gfs2
gfs2: Fix iomap buffer head reference counting bug
2018-12-01 09:37:34 +01:00
hfs
hfs: prevent btree data loss on root split
2018-11-27 16:12:59 +01:00
hfsplus
hfsplus: prevent btree data loss on root split
2018-11-27 16:12:59 +01:00
hostfs
vfs: discard ATTR_ATTR_FLAG
2018-08-17 16:20:28 -07:00
hpfs
hpfs: remove unnecessary checks on the value of r when assigning error code
2018-08-25 12:42:33 -07:00
hugetlbfs
mm: zero out the vma in vma_init()
2018-08-22 10:52:44 -07:00
isofs
isofs: reject hardware sector size > 2048 bytes
2018-08-21 11:37:41 +02:00
jbd2
jbd2: fix use after free in jbd2_log_do_checkpoint()
2018-11-13 11:08:43 -08:00
jffs2
jffs2: free jffs2_sb_info through jffs2_kill_sb()
2018-11-13 11:08:16 -08:00
jfs
Just one jfs patch for 4.19
2018-08-15 22:47:23 -07:00
kernfs
Driver core patches for 4.19-rc1
2018-08-18 11:44:53 -07:00
lockd
lockd: fix access beyond unterminated strings in prints
2018-11-13 11:08:49 -08:00
minix
nfs
flexfiles: use per-mirror specified stateid for IO
2018-12-13 09:16:14 +01:00
nfs_common
nfsd
nfsd: COPY and CLONE operations require the saved filehandle to be set
2018-11-21 09:19:23 +01:00
nilfs2
nilfs2: convert to SPDX license tags
2018-09-04 16:45:02 -07:00
nls
notify
fanotify: fix handling of events on child sub-directory
2018-12-01 09:37:31 +01:00
ntfs
ntfs: mft: remove VLA usage
2018-08-17 16:20:27 -07:00
ocfs2
ocfs2: free up write context when direct IO failed
2018-11-21 09:19:18 +01:00
omfs
openpromfs
orangefs
orangefs: remove redundant pointer orangefs_inode
2018-08-14 12:07:14 -04:00
overlayfs
ovl: automatically enable redirect_dir on metacopy=on
2018-11-21 09:19:13 +01:00
proc
mm: /proc/pid/smaps_rollup: fix NULL pointer deref in smaps_pte_range()
2018-11-13 11:08:46 -08:00
pstore
pstore/ram: Fix failure-path memory leak in ramoops_init
2018-09-30 10:15:41 -07:00
qnx4
qnx6
quota
fs/quota: Fix spectre gadget in do_quotactl
2018-08-22 18:17:48 +02:00
ramfs
reiserfs
reiserfs: propagate errors from fill_with_dentries() properly
2018-11-27 16:12:59 +01:00
romfs
squashfs
Squashfs: Compute expected length from inode size rather than block length
2018-08-02 09:34:02 -07:00
sysfs
Driver core patches for 4.19-rc1
2018-08-18 11:44:53 -07:00
sysv
sysv: return 'err' instead of 0 in __sysv_write_inode
2018-12-17 09:24:30 +01:00
tracefs
tracefs: Annotate tracefs_ops with __ro_after_init
2018-07-31 11:32:44 -04:00
ubifs
ubifs: Fix WARN_ON logic in exit path
2018-10-13 11:05:02 +02:00
udf
udf: Allow mounting volumes with incorrect identification strings
2018-12-05 19:32:06 +01:00
ufs
fs/ufs: use ktime_get_real_seconds for sb and cg timestamps
2018-08-17 16:20:27 -07:00
xfs
xfs: fix data corruption w/ unaligned reflink ranges
2018-10-06 11:44:39 +10:00
aio.c
aio: fix failure to put the file pointer
2018-12-17 09:24:33 +01:00
anon_inodes.c
anon_inode_getfile(): switch to alloc_file_pseudo()
2018-07-12 10:04:27 -04:00
attr.c
fs: Fix attr.c kernel-doc
2018-07-03 16:44:45 -04:00
bad_inode.c
get rid of 'opened' argument of ->atomic_open() - part 3
2018-07-12 10:04:20 -04:00
binfmt_aout.c
binfmt_elf.c
Here are the main MIPS changes for 4.19.
2018-08-13 19:24:32 -07:00
binfmt_elf_fdpic.c
treewide: kmalloc() -> kmalloc_array()
2018-06-12 16:19:22 -07:00
binfmt_em86.c
binfmt_flat.c
binfmt_misc.c
turn filp_clone_open() into inline wrapper for dentry_open()
2018-07-10 23:29:03 -04:00
binfmt_script.c
block_dev.c
for-4.19/block-20180812
2018-08-14 10:23:25 -07:00
buffer.c
notifier: Remove notifier header file wherever not used
2018-08-30 12:56:40 +02:00
char_dev.c
compat.c
ncpfs: remove compat functionality
2018-06-05 19:23:26 +02:00
compat_binfmt_elf.c
compat_ioctl.c
media: dvb/audio.h: get rid of unused APIs
2018-07-30 16:21:49 -04:00
coredump.c
d_path.c
dax.c
dax: Avoid losing wakeup in dax_lock_mapping_entry
2018-12-01 09:37:34 +01:00
dcache.c
fs/dcache.c: fix kmemcheck splat at take_dentry_name_snapshot()
2018-08-17 16:20:28 -07:00
dcookies.c
direct-io.c
fs: fix lost error code in dio_complete
2018-12-05 19:32:08 +01:00
drop_caches.c
eventfd.c
Revert changes to convert to ->poll_mask() and aio IOCB_CMD_POLL
2018-06-28 10:40:47 -07:00
eventpoll.c
fs/eventpoll.c: simplify ep_is_linked() callers
2018-08-22 10:52:49 -07:00
exec.c
Merge branch 'siginfo-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ebiederm/user-namespace
2018-08-21 13:47:29 -07:00
fcntl.c
signal: Don't send signals to tasks that don't exist
2018-08-15 23:03:20 -05:00
fhandle.c
file.c
file_table.c
overlayfs update for 4.19
2018-08-21 18:19:09 -07:00
filesystems.c
fs-writeback.c
fs_pin.c
fs_struct.c
inode.c
mm: don't reclaim inodes with many attached pages
2018-11-21 09:19:25 +01:00
internal.h
overlayfs update for 4.19
2018-08-21 18:19:09 -07:00
ioctl.c
vfs: fix FIGETBSZ ioctl on an overlayfs file
2018-11-21 09:19:14 +01:00
iomap.c
iomap: set page dirty after partial delalloc on mkwrite
2018-09-29 13:51:01 +10:00
Kconfig
autofs: remove left-over autofs4 stubs
2018-06-11 08:22:34 -07:00
Kconfig.binfmt
kconfig: move the "Executable file formats" menu to fs/Kconfig.binfmt
2018-08-02 08:06:55 +09:00
libfs.c
locks.c
overlayfs update for 4.19
2018-08-21 18:19:09 -07:00
Makefile
autofs: remove left-over autofs4 stubs
2018-06-11 08:22:34 -07:00
mbcache.c
treewide: kmalloc() -> kmalloc_array()
2018-06-12 16:19:22 -07:00
mount.h
mpage.c
mpage: mpage_readpages() should submit IO as read-ahead
2018-08-17 16:20:29 -07:00
namei.c
namei: allow restricted O_CREAT of FIFOs and regular files
2018-08-23 18:48:43 -07:00
namespace.c
mnt: fix __detach_mounts infinite loop
2018-11-21 09:19:22 +01:00
no-block.c
nsfs.c
open.c
overlayfs update for 4.19
2018-08-21 18:19:09 -07:00
pipe.c
Merge branch 'work.open3' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
2018-08-13 19:58:36 -07:00
pnode.c
pnode.h
posix_acl.c
proc_namespace.c
read_write.c
vfs: swap names of {do,vfs}_clone_file_range()
2018-09-24 10:54:01 +02:00
readdir.c
select.c
Revert changes to convert to ->poll_mask() and aio IOCB_CMD_POLL
2018-06-28 10:40:47 -07:00
seq_file.c
fs/seq_file.c: simplify seq_file iteration code and interface
2018-08-17 16:20:28 -07:00
signalfd.c
Merge branch 'work.compat' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
2018-06-16 16:21:50 +09:00
splice.c
Merge branch 'work.compat' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
2018-06-16 16:21:50 +09:00
stack.c
stat.c
statfs.c
kernel: add kcompat_sys_{f,}statfs64()
2018-07-12 14:49:48 +01:00
super.c
Merge branch 'ida-4.19' of git://git.infradead.org/users/willy/linux-dax
2018-08-26 11:48:42 -07:00
sync.c
timerfd.c
Merge branch 'work.aio' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
2018-08-13 20:56:23 -07:00
userfaultfd.c
userfaultfd: shmem/hugetlbfs: only allow to register VM_MAYWRITE vmas
2018-12-05 19:32:04 +01:00
utimes.c
xattr.c
sysfs: Do not return POSIX ACL xattrs via listxattr
2018-09-18 07:30:48 -04:00