Commit dfc0f637 authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Merge tag 'erofs-for-6.17-rc2-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/xiang/erofs

Pull erofs fixes from Gao Xiang:

 - Align FSDAX enablement among multiple devices

 - Fix EROFS_FS_ZIP_ACCEL build dependency again to prevent forcing
   CRYPTO{,_DEFLATE}=y even if EROFS=m

 - Fix atomic context detection to properly launch kworkers on demand

 - Fix block count statistics for 48-bit addressing support

* tag 'erofs-for-6.17-rc2-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/xiang/erofs:
  erofs: fix block count report when 48-bit layout is on
  erofs: fix atomic context detection when !CONFIG_DEBUG_LOCK_ALLOC
  erofs: Do not select tristate symbols from bool symbols
  erofs: Fallback to normal access if DAX is not supported on extra device
parents 3a4a0367 0b96d9be
Loading
Loading
Loading
Loading
+10 −10
Original line number Diff line number Diff line
@@ -3,8 +3,18 @@
config EROFS_FS
	tristate "EROFS filesystem support"
	depends on BLOCK
	select CACHEFILES if EROFS_FS_ONDEMAND
	select CRC32
	select CRYPTO if EROFS_FS_ZIP_ACCEL
	select CRYPTO_DEFLATE if EROFS_FS_ZIP_ACCEL
	select FS_IOMAP
	select LZ4_DECOMPRESS if EROFS_FS_ZIP
	select NETFS_SUPPORT if EROFS_FS_ONDEMAND
	select XXHASH if EROFS_FS_XATTR
	select XZ_DEC if EROFS_FS_ZIP_LZMA
	select XZ_DEC_MICROLZMA if EROFS_FS_ZIP_LZMA
	select ZLIB_INFLATE if EROFS_FS_ZIP_DEFLATE
	select ZSTD_DECOMPRESS if EROFS_FS_ZIP_ZSTD
	help
	  EROFS (Enhanced Read-Only File System) is a lightweight read-only
	  file system with modern designs (e.g. no buffer heads, inline
@@ -38,7 +48,6 @@ config EROFS_FS_DEBUG
config EROFS_FS_XATTR
	bool "EROFS extended attributes"
	depends on EROFS_FS
	select XXHASH
	default y
	help
	  Extended attributes are name:value pairs associated with inodes by
@@ -94,7 +103,6 @@ config EROFS_FS_BACKED_BY_FILE
config EROFS_FS_ZIP
	bool "EROFS Data Compression Support"
	depends on EROFS_FS
	select LZ4_DECOMPRESS
	default y
	help
	  Enable transparent compression support for EROFS file systems.
@@ -104,8 +112,6 @@ config EROFS_FS_ZIP
config EROFS_FS_ZIP_LZMA
	bool "EROFS LZMA compressed data support"
	depends on EROFS_FS_ZIP
	select XZ_DEC
	select XZ_DEC_MICROLZMA
	help
	  Saying Y here includes support for reading EROFS file systems
	  containing LZMA compressed data, specifically called microLZMA. It
@@ -117,7 +123,6 @@ config EROFS_FS_ZIP_LZMA
config EROFS_FS_ZIP_DEFLATE
	bool "EROFS DEFLATE compressed data support"
	depends on EROFS_FS_ZIP
	select ZLIB_INFLATE
	help
	  Saying Y here includes support for reading EROFS file systems
	  containing DEFLATE compressed data.  It gives better compression
@@ -132,7 +137,6 @@ config EROFS_FS_ZIP_DEFLATE
config EROFS_FS_ZIP_ZSTD
	bool "EROFS Zstandard compressed data support"
	depends on EROFS_FS_ZIP
	select ZSTD_DECOMPRESS
	help
	  Saying Y here includes support for reading EROFS file systems
	  containing Zstandard compressed data.  It gives better compression
@@ -147,8 +151,6 @@ config EROFS_FS_ZIP_ZSTD
config EROFS_FS_ZIP_ACCEL
	bool "EROFS hardware decompression support"
	depends on EROFS_FS_ZIP
	select CRYPTO
	select CRYPTO_DEFLATE
	help
	  Saying Y here includes hardware accelerator support for reading
	  EROFS file systems containing compressed data.  It gives better
@@ -163,9 +165,7 @@ config EROFS_FS_ZIP_ACCEL
config EROFS_FS_ONDEMAND
	bool "EROFS fscache-based on-demand read support (deprecated)"
	depends on EROFS_FS
	select NETFS_SUPPORT
	select FSCACHE
	select CACHEFILES
	select CACHEFILES_ONDEMAND
	help
	  This permits EROFS to use fscache-backed data blobs with on-demand
+16 −12
Original line number Diff line number Diff line
@@ -174,6 +174,11 @@ static int erofs_init_device(struct erofs_buf *buf, struct super_block *sb,
		if (!erofs_is_fileio_mode(sbi)) {
			dif->dax_dev = fs_dax_get_by_bdev(file_bdev(file),
					&dif->dax_part_off, NULL, NULL);
			if (!dif->dax_dev && test_opt(&sbi->opt, DAX_ALWAYS)) {
				erofs_info(sb, "DAX unsupported by %s. Turning off DAX.",
					   dif->path);
				clear_opt(&sbi->opt, DAX_ALWAYS);
			}
		} else if (!S_ISREG(file_inode(file)->i_mode)) {
			fput(file);
			return -EINVAL;
@@ -210,8 +215,13 @@ static int erofs_scan_devices(struct super_block *sb,
			  ondisk_extradevs, sbi->devs->extra_devices);
		return -EINVAL;
	}
	if (!ondisk_extradevs)
	if (!ondisk_extradevs) {
		if (test_opt(&sbi->opt, DAX_ALWAYS) && !sbi->dif0.dax_dev) {
			erofs_info(sb, "DAX unsupported by block device. Turning off DAX.");
			clear_opt(&sbi->opt, DAX_ALWAYS);
		}
		return 0;
	}

	if (!sbi->devs->extra_devices && !erofs_is_fscache_mode(sb))
		sbi->devs->flatdev = true;
@@ -313,8 +323,8 @@ static int erofs_read_superblock(struct super_block *sb)
	sbi->islotbits = ilog2(sizeof(struct erofs_inode_compact));
	if (erofs_sb_has_48bit(sbi) && dsb->rootnid_8b) {
		sbi->root_nid = le64_to_cpu(dsb->rootnid_8b);
		sbi->dif0.blocks = (sbi->dif0.blocks << 32) |
				le16_to_cpu(dsb->rb.blocks_hi);
		sbi->dif0.blocks = sbi->dif0.blocks |
				((u64)le16_to_cpu(dsb->rb.blocks_hi) << 32);
	} else {
		sbi->root_nid = le16_to_cpu(dsb->rb.rootnid_2b);
	}
@@ -338,7 +348,6 @@ static int erofs_read_superblock(struct super_block *sb)
	if (ret < 0)
		goto out;

	/* handle multiple devices */
	ret = erofs_scan_devices(sb, dsb);

	if (erofs_sb_has_48bit(sbi))
@@ -671,15 +680,10 @@ static int erofs_fc_fill_super(struct super_block *sb, struct fs_context *fc)
			return invalfc(fc, "cannot use fsoffset in fscache mode");
	}

	if (test_opt(&sbi->opt, DAX_ALWAYS)) {
		if (!sbi->dif0.dax_dev) {
			errorfc(fc, "DAX unsupported by block device. Turning off DAX.");
			clear_opt(&sbi->opt, DAX_ALWAYS);
		} else if (sbi->blkszbits != PAGE_SHIFT) {
			errorfc(fc, "unsupported blocksize for DAX");
	if (test_opt(&sbi->opt, DAX_ALWAYS) && sbi->blkszbits != PAGE_SHIFT) {
		erofs_info(sb, "unsupported blocksize for DAX");
		clear_opt(&sbi->opt, DAX_ALWAYS);
	}
	}

	sb->s_time_gran = 1;
	sb->s_xattr = erofs_xattr_handlers;
+11 −2
Original line number Diff line number Diff line
@@ -1432,6 +1432,16 @@ static void z_erofs_decompressqueue_kthread_work(struct kthread_work *work)
}
#endif

/* Use (kthread_)work in atomic contexts to minimize scheduling overhead */
static inline bool z_erofs_in_atomic(void)
{
	if (IS_ENABLED(CONFIG_PREEMPTION) && rcu_preempt_depth())
		return true;
	if (!IS_ENABLED(CONFIG_PREEMPT_COUNT))
		return true;
	return !preemptible();
}

static void z_erofs_decompress_kickoff(struct z_erofs_decompressqueue *io,
				       int bios)
{
@@ -1446,8 +1456,7 @@ static void z_erofs_decompress_kickoff(struct z_erofs_decompressqueue *io,

	if (atomic_add_return(bios, &io->pending_bios))
		return;
	/* Use (kthread_)work and sync decompression for atomic contexts only */
	if (!in_task() || irqs_disabled() || rcu_read_lock_any_held()) {
	if (z_erofs_in_atomic()) {
#ifdef CONFIG_EROFS_FS_PCPU_KTHREAD
		struct kthread_worker *worker;