linux/fs/fuse
Miklos Szeredi c31470a30c fuse: make sure reclaim doesn't write the inode
commit 5c791fe1e2 upstream.

In writeback cache mode mtime/ctime updates are cached, and flushed to the
server using the ->write_inode() callback.

Closing the file will result in a dirty inode being immediately written,
but in other cases the inode can remain dirty after all references are
dropped.  This result in the inode being written back from reclaim, which
can deadlock on a regular allocation while the request is being served.

The usual mechanisms (GFP_NOFS/PF_MEMALLOC*) don't work for FUSE, because
serving a request involves unrelated userspace process(es).

Instead do the same as for dirty pages: make sure the inode is written
before the last reference is gone.

 - fallocate(2)/copy_file_range(2): these call file_update_time() or
   file_modified(), so flush the inode before returning from the call

 - unlink(2), link(2) and rename(2): these call fuse_update_ctime(), so
   flush the ctime directly from this helper

Reported-by: chenguanyou <chenguanyou@xiaomi.com>
Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
Cc: Ed Tsai <ed.tsai@mediatek.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2021-12-17 10:14:41 +01:00
..
acl.c fuse: fix bad inode 2021-01-09 13:46:24 +01:00
control.c fuse: split fuse_mount off of fuse_conn 2020-09-18 15:17:41 +02:00
cuse.c cuse: prevent clone 2021-05-19 10:12:56 +02:00
dax.c fuse: split fuse_mount off of fuse_conn 2020-09-18 15:17:41 +02:00
dev.c fuse: release pipe buf after last use 2021-12-01 09:19:00 +01:00
dir.c fuse: make sure reclaim doesn't write the inode 2021-12-17 10:14:41 +01:00
file.c fuse: make sure reclaim doesn't write the inode 2021-12-17 10:14:41 +01:00
fuse_i.h fuse: make sure reclaim doesn't write the inode 2021-12-17 10:14:41 +01:00
inode.c fuse: make sure reclaim doesn't write the inode 2021-12-17 10:14:41 +01:00
Kconfig virtiofs: implement dax read/write operations 2020-09-10 11:39:23 +02:00
Makefile virtiofs: add a mount option to enable dax 2020-09-10 11:39:22 +02:00
readdir.c fuse: fix illegal access to inode with reused nodeid 2021-09-08 08:49:02 +02:00
virtio_fs.c virtiofs: fix userns 2021-05-19 10:12:56 +02:00
xattr.c fuse: fix bad inode 2021-01-09 13:46:24 +01:00