diff options
Diffstat (limited to 'fs/xfs/libxfs/xfs_dir2.c')
| -rw-r--r-- | fs/xfs/libxfs/xfs_dir2.c | 39 | 
1 files changed, 24 insertions, 15 deletions
| diff --git a/fs/xfs/libxfs/xfs_dir2.c b/fs/xfs/libxfs/xfs_dir2.c index c58d72c220f5..2f389d366e93 100644 --- a/fs/xfs/libxfs/xfs_dir2.c +++ b/fs/xfs/libxfs/xfs_dir2.c @@ -36,21 +36,29 @@  struct xfs_name xfs_name_dotdot = { (unsigned char *)"..", 2, XFS_DIR3_FT_DIR };  /* - * @mode, if set, indicates that the type field needs to be set up. - * This uses the transformation from file mode to DT_* as defined in linux/fs.h - * for file type specification. This will be propagated into the directory - * structure if appropriate for the given operation and filesystem config. + * Convert inode mode to directory entry filetype   */ -const unsigned char xfs_mode_to_ftype[S_IFMT >> S_SHIFT] = { -	[0]			= XFS_DIR3_FT_UNKNOWN, -	[S_IFREG >> S_SHIFT]    = XFS_DIR3_FT_REG_FILE, -	[S_IFDIR >> S_SHIFT]    = XFS_DIR3_FT_DIR, -	[S_IFCHR >> S_SHIFT]    = XFS_DIR3_FT_CHRDEV, -	[S_IFBLK >> S_SHIFT]    = XFS_DIR3_FT_BLKDEV, -	[S_IFIFO >> S_SHIFT]    = XFS_DIR3_FT_FIFO, -	[S_IFSOCK >> S_SHIFT]   = XFS_DIR3_FT_SOCK, -	[S_IFLNK >> S_SHIFT]    = XFS_DIR3_FT_SYMLINK, -}; +unsigned char xfs_mode_to_ftype(int mode) +{ +	switch (mode & S_IFMT) { +	case S_IFREG: +		return XFS_DIR3_FT_REG_FILE; +	case S_IFDIR: +		return XFS_DIR3_FT_DIR; +	case S_IFCHR: +		return XFS_DIR3_FT_CHRDEV; +	case S_IFBLK: +		return XFS_DIR3_FT_BLKDEV; +	case S_IFIFO: +		return XFS_DIR3_FT_FIFO; +	case S_IFSOCK: +		return XFS_DIR3_FT_SOCK; +	case S_IFLNK: +		return XFS_DIR3_FT_SYMLINK; +	default: +		return XFS_DIR3_FT_UNKNOWN; +	} +}  /*   * ASCII case-insensitive (ie. A-Z) support for directories that was @@ -631,7 +639,8 @@ xfs_dir2_isblock(  	if ((rval = xfs_bmap_last_offset(args->dp, &last, XFS_DATA_FORK)))  		return rval;  	rval = XFS_FSB_TO_B(args->dp->i_mount, last) == args->geo->blksize; -	ASSERT(rval == 0 || args->dp->i_d.di_size == args->geo->blksize); +	if (rval != 0 && args->dp->i_d.di_size != args->geo->blksize) +		return -EFSCORRUPTED;  	*vp = rval;  	return 0;  } | 
