diff options
Diffstat (limited to 'fs/xfs/xfs_dir2_readdir.c')
| -rw-r--r-- | fs/xfs/xfs_dir2_readdir.c | 9 | 
1 files changed, 5 insertions, 4 deletions
diff --git a/fs/xfs/xfs_dir2_readdir.c b/fs/xfs/xfs_dir2_readdir.c index 9f3ceb461515..cc6dc56f455d 100644 --- a/fs/xfs/xfs_dir2_readdir.c +++ b/fs/xfs/xfs_dir2_readdir.c @@ -18,6 +18,7 @@  #include "xfs_bmap.h"  #include "xfs_trans.h"  #include "xfs_error.h" +#include "xfs_health.h"  /*   * Directory file type support functions @@ -51,7 +52,7 @@ xfs_dir2_sf_getdents(  	struct xfs_mount	*mp = dp->i_mount;  	xfs_dir2_dataptr_t	off;		/* current entry's offset */  	xfs_dir2_sf_entry_t	*sfep;		/* shortform directory entry */ -	xfs_dir2_sf_hdr_t	*sfp;		/* shortform structure */ +	struct xfs_dir2_sf_hdr	*sfp = dp->i_df.if_data;  	xfs_dir2_dataptr_t	dot_offset;  	xfs_dir2_dataptr_t	dotdot_offset;  	xfs_ino_t		ino; @@ -59,9 +60,7 @@ xfs_dir2_sf_getdents(  	ASSERT(dp->i_df.if_format == XFS_DINODE_FMT_LOCAL);  	ASSERT(dp->i_df.if_bytes == dp->i_disk_size); -	ASSERT(dp->i_df.if_u1.if_data != NULL); - -	sfp = (xfs_dir2_sf_hdr_t *)dp->i_df.if_u1.if_data; +	ASSERT(sfp != NULL);  	/*  	 * If the block number in the offset is out of range, we're done. @@ -519,6 +518,8 @@ xfs_readdir(  	if (xfs_is_shutdown(dp->i_mount))  		return -EIO; +	if (xfs_ifork_zapped(dp, XFS_DATA_FORK)) +		return -EIO;  	ASSERT(S_ISDIR(VFS_I(dp)->i_mode));  	ASSERT(xfs_isilocked(dp, XFS_IOLOCK_SHARED | XFS_IOLOCK_EXCL));  |