From: Darrick J. Wong <djwong@xxxxxxxxxx> With iomap support turned on for the pagecache, the kernel issues writeback to directly to block devices and we no longer have to push all those pages through the fuse device to userspace. Therefore, we don't need the tight dirty limits (~1M) that are used for regular fuse. This dramatically increases the performance of fuse's pagecache IO. Signed-off-by: "Darrick J. Wong" <djwong@xxxxxxxxxx> --- fs/fuse/file_iomap.c | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/fs/fuse/file_iomap.c b/fs/fuse/file_iomap.c index c58ac812598d8f..746d9ae192dc55 100644 --- a/fs/fuse/file_iomap.c +++ b/fs/fuse/file_iomap.c @@ -427,6 +427,28 @@ void fuse_iomap_init_reply(struct fuse_mount *fm) if (sb->s_bdev) __fuse_iomap_add_device(fc, sb->s_bdev_file); + + if (fc->iomap_pagecache) { + struct backing_dev_info *old_bdi = sb->s_bdi; + char *suffix = sb->s_bdev ? "-fuseblk" : "-fuse"; + int err; + + /* + * sb->s_bdi points to the initial private bdi however we want + * to redirect it to a new private bdi with default dirty and + * readahead settings because iomap writeback won't be pushing + * a ton of dirty data through the fuse device + */ + sb->s_bdi = &noop_backing_dev_info; + err = super_setup_bdi_name(sb, "%u:%u%s.iomap", MAJOR(fc->dev), + MINOR(fc->dev), suffix); + if (err) { + sb->s_bdi = old_bdi; + } else { + bdi_unregister(old_bdi); + bdi_put(old_bdi); + } + } } int fuse_iomap_add_device(struct fuse_conn *fc,