Commit e080a267 authored by Gao Xiang's avatar Gao Xiang
Browse files

erofs: allow large folios for compressed files

As commit 2e6506e1 ("mm/migrate: fix deadlock in
migrate_pages_batch() on large folios") has landed upstream, large
folios can be safely enabled for compressed inodes since all
prerequisites have already landed in 6.11-rc1.

Stress tests has been running on my fleet for over 20 days without any
regression.  Additionally, users [1] have requested it for months.
Let's allow large folios for EROFS full cases upstream now for wider
testing.

[1] https://lore.kernel.org/r/CAGsJ_4wtE8OcpinuqVwG4jtdx6Qh5f+TON6wz+4HMCq=A2qFcA@mail.gmail.com



Cc: Barry Song <21cnbao@gmail.com>
Cc: Matthew Wilcox (Oracle) <willy@infradead.org>
[ Gao Xiang: minor commit typo fixes. ]
Signed-off-by: default avatarGao Xiang <hsiangkao@linux.alibaba.com>
Link: https://lore.kernel.org/r/20240819025207.3808649-1-hsiangkao@linux.alibaba.com
parent 2c534624
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -75,7 +75,7 @@ Here are the main features of EROFS:

 - Support merging tail-end data into a special inode as fragments.

 - Support large folios for uncompressed files.
 - Support large folios to make use of THPs (Transparent Hugepages);

 - Support direct I/O on uncompressed files to avoid double caching for loop
   devices;
+8 −10
Original line number Diff line number Diff line
@@ -257,25 +257,23 @@ static int erofs_fill_inode(struct inode *inode)
		goto out_unlock;
	}

	mapping_set_large_folios(inode->i_mapping);
	if (erofs_inode_is_data_compressed(vi->datalayout)) {
#ifdef CONFIG_EROFS_FS_ZIP
		DO_ONCE_LITE_IF(inode->i_blkbits != PAGE_SHIFT,
			  erofs_info, inode->i_sb,
			  "EXPERIMENTAL EROFS subpage compressed block support in use. Use at your own risk!");
		inode->i_mapping->a_ops = &z_erofs_aops;
		err = 0;
		goto out_unlock;
#endif
#else
		err = -EOPNOTSUPP;
		goto out_unlock;
	}
#endif
	} else {
		inode->i_mapping->a_ops = &erofs_raw_access_aops;
	mapping_set_large_folios(inode->i_mapping);
#ifdef CONFIG_EROFS_FS_ONDEMAND
		if (erofs_is_fscache_mode(inode->i_sb))
			inode->i_mapping->a_ops = &erofs_fscache_access_aops;
#endif

	}
out_unlock:
	erofs_put_metabuf(&buf);
	return err;