| From 6eadbf4c8ba816c10d1c97bed9aa861d9fd17809 Mon Sep 17 00:00:00 2001 |
| From: "Darrick J. Wong" <darrick.wong@oracle.com> |
| Date: Fri, 12 May 2017 10:44:08 -0700 |
| Subject: xfs: BMAPX shouldn't barf on inline-format directories |
| |
| From: Darrick J. Wong <darrick.wong@oracle.com> |
| |
| commit 6eadbf4c8ba816c10d1c97bed9aa861d9fd17809 upstream. |
| |
| When we're fulfilling a BMAPX request, jump out early if the data fork |
| is in local format. This prevents us from hitting a debugging check in |
| bmapi_read and barfing errors back to userspace. The on-disk extent |
| count check later isn't sufficient for IF_DELALLOC mode because da |
| extents are in memory and not on disk. |
| |
| Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com> |
| Reviewed-by: Brian Foster <bfoster@redhat.com> |
| Reviewed-by: Christoph Hellwig <hch@lst.de> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| fs/xfs/xfs_bmap_util.c | 8 ++++++-- |
| 1 file changed, 6 insertions(+), 2 deletions(-) |
| |
| --- a/fs/xfs/xfs_bmap_util.c |
| +++ b/fs/xfs/xfs_bmap_util.c |
| @@ -588,9 +588,13 @@ xfs_getbmap( |
| } |
| break; |
| default: |
| + /* Local format data forks report no extents. */ |
| + if (ip->i_d.di_format == XFS_DINODE_FMT_LOCAL) { |
| + bmv->bmv_entries = 0; |
| + return 0; |
| + } |
| if (ip->i_d.di_format != XFS_DINODE_FMT_EXTENTS && |
| - ip->i_d.di_format != XFS_DINODE_FMT_BTREE && |
| - ip->i_d.di_format != XFS_DINODE_FMT_LOCAL) |
| + ip->i_d.di_format != XFS_DINODE_FMT_BTREE) |
| return -EINVAL; |
| |
| if (xfs_get_extsz_hint(ip) || |