| From 61d819e7bcb7f33da710bf3f5dcb2bcf1e48203c Mon Sep 17 00:00:00 2001 |
| From: "Darrick J. Wong" <darrick.wong@oracle.com> |
| Date: Mon, 19 Jun 2017 13:19:08 -0700 |
| Subject: xfs: don't allow bmap on rt files |
| |
| From: Darrick J. Wong <darrick.wong@oracle.com> |
| |
| commit 61d819e7bcb7f33da710bf3f5dcb2bcf1e48203c upstream. |
| |
| bmap returns a dumb LBA address but not the block device that goes with |
| that LBA. Swapfiles don't care about this and will blindly assume that |
| the data volume is the correct blockdev, which is totally bogus for |
| files on the rt subvolume. This results in the swap code doing IOs to |
| arbitrary locations on the data device(!) if the passed in mapping is a |
| realtime file, so just turn off bmap for rt files. |
| |
| Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com> |
| Reviewed-by: Christoph Hellwig <hch@lst.de> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| |
| --- |
| fs/xfs/xfs_aops.c | 7 +++++-- |
| 1 file changed, 5 insertions(+), 2 deletions(-) |
| |
| --- a/fs/xfs/xfs_aops.c |
| +++ b/fs/xfs/xfs_aops.c |
| @@ -1566,9 +1566,12 @@ xfs_vm_bmap( |
| * The swap code (ab-)uses ->bmap to get a block mapping and then |
| * bypasseѕ the file system for actual I/O. We really can't allow |
| * that on reflinks inodes, so we have to skip out here. And yes, |
| - * 0 is the magic code for a bmap error.. |
| + * 0 is the magic code for a bmap error. |
| + * |
| + * Since we don't pass back blockdev info, we can't return bmap |
| + * information for rt files either. |
| */ |
| - if (xfs_is_reflink_inode(ip)) { |
| + if (xfs_is_reflink_inode(ip) || XFS_IS_REALTIME_INODE(ip)) { |
| xfs_iunlock(ip, XFS_IOLOCK_SHARED); |
| return 0; |
| } |