diff options
Diffstat (limited to 'fs/xfs/libxfs/xfs_inode_buf.c')
| -rw-r--r-- | fs/xfs/libxfs/xfs_inode_buf.c | 10 | 
1 files changed, 8 insertions, 2 deletions
| diff --git a/fs/xfs/libxfs/xfs_inode_buf.c b/fs/xfs/libxfs/xfs_inode_buf.c index dd483e2767f7..d93f9d918cfc 100644 --- a/fs/xfs/libxfs/xfs_inode_buf.c +++ b/fs/xfs/libxfs/xfs_inode_buf.c @@ -29,6 +29,7 @@  #include "xfs_icache.h"  #include "xfs_trans.h"  #include "xfs_ialloc.h" +#include "xfs_dir2.h"  /*   * Check that none of the inode's in the buffer have a next @@ -386,6 +387,7 @@ xfs_dinode_verify(  	xfs_ino_t		ino,  	struct xfs_dinode	*dip)  { +	uint16_t		mode;  	uint16_t		flags;  	uint64_t		flags2; @@ -396,8 +398,12 @@ xfs_dinode_verify(  	if (be64_to_cpu(dip->di_size) & (1ULL << 63))  		return false; -	/* No zero-length symlinks. */ -	if (S_ISLNK(be16_to_cpu(dip->di_mode)) && dip->di_size == 0) +	mode = be16_to_cpu(dip->di_mode); +	if (mode && xfs_mode_to_ftype(mode) == XFS_DIR3_FT_UNKNOWN) +		return false; + +	/* No zero-length symlinks/dirs. */ +	if ((S_ISLNK(mode) || S_ISDIR(mode)) && dip->di_size == 0)  		return false;  	/* only version 3 or greater inodes are extensively verified here */ | 
