diff options
Diffstat (limited to 'fs/xfs/libxfs/xfs_bmap.c')
-rw-r--r-- | fs/xfs/libxfs/xfs_bmap.c | 29 |
1 files changed, 21 insertions, 8 deletions
diff --git a/fs/xfs/libxfs/xfs_bmap.c b/fs/xfs/libxfs/xfs_bmap.c index baf0b72c0a37..07aad70f3931 100644 --- a/fs/xfs/libxfs/xfs_bmap.c +++ b/fs/xfs/libxfs/xfs_bmap.c | |||
@@ -3835,15 +3835,28 @@ xfs_bmapi_read( | |||
3835 | XFS_STATS_INC(mp, xs_blk_mapr); | 3835 | XFS_STATS_INC(mp, xs_blk_mapr); |
3836 | 3836 | ||
3837 | ifp = XFS_IFORK_PTR(ip, whichfork); | 3837 | ifp = XFS_IFORK_PTR(ip, whichfork); |
3838 | if (!ifp) { | ||
3839 | /* No CoW fork? Return a hole. */ | ||
3840 | if (whichfork == XFS_COW_FORK) { | ||
3841 | mval->br_startoff = bno; | ||
3842 | mval->br_startblock = HOLESTARTBLOCK; | ||
3843 | mval->br_blockcount = len; | ||
3844 | mval->br_state = XFS_EXT_NORM; | ||
3845 | *nmap = 1; | ||
3846 | return 0; | ||
3847 | } | ||
3838 | 3848 | ||
3839 | /* No CoW fork? Return a hole. */ | 3849 | /* |
3840 | if (whichfork == XFS_COW_FORK && !ifp) { | 3850 | * A missing attr ifork implies that the inode says we're in |
3841 | mval->br_startoff = bno; | 3851 | * extents or btree format but failed to pass the inode fork |
3842 | mval->br_startblock = HOLESTARTBLOCK; | 3852 | * verifier while trying to load it. Treat that as a file |
3843 | mval->br_blockcount = len; | 3853 | * corruption too. |
3844 | mval->br_state = XFS_EXT_NORM; | 3854 | */ |
3845 | *nmap = 1; | 3855 | #ifdef DEBUG |
3846 | return 0; | 3856 | xfs_alert(mp, "%s: inode %llu missing fork %d", |
3857 | __func__, ip->i_ino, whichfork); | ||
3858 | #endif /* DEBUG */ | ||
3859 | return -EFSCORRUPTED; | ||
3847 | } | 3860 | } |
3848 | 3861 | ||
3849 | if (!(ifp->if_flags & XFS_IFEXTENTS)) { | 3862 | if (!(ifp->if_flags & XFS_IFEXTENTS)) { |