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

erofs: fix fsdax partition offset handling

After seeking time on testing today upstream fsdax, I found it
actually doesn't work well as below:

[  186.492983] ------------[ cut here ]------------
[  186.493629] WARNING: CPU: 1 PID: 205 at fs/iomap/iter.c:33 iomap_iter+0x2f6/0x310

The problem is that m_dax_part_off should be applied to physical
addresses and very sorry about that I didn't catch this eariler.

Anyway, let's fix it up now. Also, I need to find a way to set up
a standalone testcase to look after this later.

Link: https://lore.kernel.org/r/20220113051845.244461-1-hsiangkao@linux.alibaba.com


Fixes: de205114 ("fsdax: shift partition offset handling into the file systems")
Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
Reviewed-by: default avatarChao Yu <chao@kernel.org>
Signed-off-by: default avatarGao Xiang <hsiangkao@linux.alibaba.com>
parent e783362e
Loading
Loading
Loading
Loading
+4 −4
Original line number Diff line number Diff line
@@ -252,12 +252,10 @@ static int erofs_iomap_begin(struct inode *inode, loff_t offset, loff_t length,
		return ret;

	iomap->offset = map.m_la;
	if (flags & IOMAP_DAX) {
	if (flags & IOMAP_DAX)
		iomap->dax_dev = mdev.m_daxdev;
		iomap->offset += mdev.m_dax_part_off;
	} else {
	else
		iomap->bdev = mdev.m_bdev;
	}
	iomap->length = map.m_llen;
	iomap->flags = 0;
	iomap->private = NULL;
@@ -284,6 +282,8 @@ static int erofs_iomap_begin(struct inode *inode, loff_t offset, loff_t length,
	} else {
		iomap->type = IOMAP_MAPPED;
		iomap->addr = mdev.m_pa;
		if (flags & IOMAP_DAX)
			iomap->addr += mdev.m_dax_part_off;
	}
	return 0;
}