diff options
Diffstat (limited to 'fs/xfs/xfs_dir2_leaf.c')
| -rw-r--r-- | fs/xfs/xfs_dir2_leaf.c | 18 | 
1 files changed, 8 insertions, 10 deletions
| diff --git a/fs/xfs/xfs_dir2_leaf.c b/fs/xfs/xfs_dir2_leaf.c index da71a1819d78..e0cc1243a8aa 100644 --- a/fs/xfs/xfs_dir2_leaf.c +++ b/fs/xfs/xfs_dir2_leaf.c @@ -1300,10 +1300,8 @@ out:  int						/* error */  xfs_dir2_leaf_getdents(  	xfs_inode_t		*dp,		/* incore directory inode */ -	void			*dirent, -	size_t			bufsize, -	xfs_off_t		*offset, -	filldir_t		filldir) +	struct dir_context	*ctx, +	size_t			bufsize)  {  	struct xfs_buf		*bp = NULL;	/* data block buffer */  	xfs_dir2_data_hdr_t	*hdr;		/* data block header */ @@ -1322,7 +1320,7 @@ xfs_dir2_leaf_getdents(  	 * If the offset is at or past the largest allowed value,  	 * give up right away.  	 */ -	if (*offset >= XFS_DIR2_MAX_DATAPTR) +	if (ctx->pos >= XFS_DIR2_MAX_DATAPTR)  		return 0;  	mp = dp->i_mount; @@ -1343,7 +1341,7 @@ xfs_dir2_leaf_getdents(  	 * Inside the loop we keep the main offset value as a byte offset  	 * in the directory file.  	 */ -	curoff = xfs_dir2_dataptr_to_byte(mp, *offset); +	curoff = xfs_dir2_dataptr_to_byte(mp, ctx->pos);  	/*  	 * Force this conversion through db so we truncate the offset @@ -1444,8 +1442,8 @@ xfs_dir2_leaf_getdents(  		dep = (xfs_dir2_data_entry_t *)ptr;  		length = xfs_dir2_data_entsize(dep->namelen); -		if (filldir(dirent, (char *)dep->name, dep->namelen, -			    xfs_dir2_byte_to_dataptr(mp, curoff) & 0x7fffffff, +		ctx->pos = xfs_dir2_byte_to_dataptr(mp, curoff) & 0x7fffffff; +		if (!dir_emit(ctx, (char *)dep->name, dep->namelen,  			    be64_to_cpu(dep->inumber), DT_UNKNOWN))  			break; @@ -1462,9 +1460,9 @@ xfs_dir2_leaf_getdents(  	 * All done.  Set output offset value to current offset.  	 */  	if (curoff > xfs_dir2_dataptr_to_byte(mp, XFS_DIR2_MAX_DATAPTR)) -		*offset = XFS_DIR2_MAX_DATAPTR & 0x7fffffff; +		ctx->pos = XFS_DIR2_MAX_DATAPTR & 0x7fffffff;  	else -		*offset = xfs_dir2_byte_to_dataptr(mp, curoff) & 0x7fffffff; +		ctx->pos = xfs_dir2_byte_to_dataptr(mp, curoff) & 0x7fffffff;  	kmem_free(map_info);  	if (bp)  		xfs_trans_brelse(NULL, bp); |