diff options
Diffstat (limited to 'fs/xfs/xfs_dir2_readdir.c')
| -rw-r--r-- | fs/xfs/xfs_dir2_readdir.c | 25 | 
1 files changed, 13 insertions, 12 deletions
diff --git a/fs/xfs/xfs_dir2_readdir.c b/fs/xfs/xfs_dir2_readdir.c index cf9296b7e06f..06ac5a7de60a 100644 --- a/fs/xfs/xfs_dir2_readdir.c +++ b/fs/xfs/xfs_dir2_readdir.c @@ -157,7 +157,7 @@ xfs_dir2_block_getdents(  	if (xfs_dir2_dataptr_to_db(geo, ctx->pos) > geo->datablk)  		return 0; -	error = xfs_dir3_block_read(args->trans, dp, &bp); +	error = xfs_dir3_block_read(args->trans, dp, args->owner, &bp);  	if (error)  		return error; @@ -282,7 +282,8 @@ xfs_dir2_leaf_readbuf(  	new_off = xfs_dir2_da_to_byte(geo, map.br_startoff);  	if (new_off > *cur_off)  		*cur_off = new_off; -	error = xfs_dir3_data_read(args->trans, dp, map.br_startoff, 0, &bp); +	error = xfs_dir3_data_read(args->trans, dp, args->owner, +			map.br_startoff, 0, &bp);  	if (error)  		goto out; @@ -515,7 +516,6 @@ xfs_readdir(  {  	struct xfs_da_args	args = { NULL };  	unsigned int		lock_mode; -	bool			isblock;  	int			error;  	trace_xfs_readdir(dp); @@ -532,23 +532,24 @@ xfs_readdir(  	args.dp = dp;  	args.geo = dp->i_mount->m_dir_geo;  	args.trans = tp; +	args.owner = dp->i_ino;  	if (dp->i_df.if_format == XFS_DINODE_FMT_LOCAL)  		return xfs_dir2_sf_getdents(&args, ctx);  	lock_mode = xfs_ilock_data_map_shared(dp); -	error = xfs_dir2_isblock(&args, &isblock); -	if (error) -		goto out_unlock; - -	if (isblock) { +	switch (xfs_dir2_format(&args, &error)) { +	case XFS_DIR2_FMT_BLOCK:  		error = xfs_dir2_block_getdents(&args, ctx, &lock_mode); -		goto out_unlock; +		break; +	case XFS_DIR2_FMT_LEAF: +	case XFS_DIR2_FMT_NODE: +		error = xfs_dir2_leaf_getdents(&args, ctx, bufsize, &lock_mode); +		break; +	default: +		break;  	} -	error = xfs_dir2_leaf_getdents(&args, ctx, bufsize, &lock_mode); - -out_unlock:  	if (lock_mode)  		xfs_iunlock(dp, lock_mode);  	return error;  |