aboutsummaryrefslogtreecommitdiffstats
path: root/fs/xfs/xfs_dir2_leaf.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/xfs/xfs_dir2_leaf.c')
-rw-r--r--fs/xfs/xfs_dir2_leaf.c21
1 files changed, 11 insertions, 10 deletions
diff --git a/fs/xfs/xfs_dir2_leaf.c b/fs/xfs/xfs_dir2_leaf.c
index da71a1819d78..2aed25cae04d 100644
--- a/fs/xfs/xfs_dir2_leaf.c
+++ b/fs/xfs/xfs_dir2_leaf.c
@@ -1108,6 +1108,7 @@ xfs_dir2_leaf_readbuf(
1108 struct xfs_mount *mp = dp->i_mount; 1108 struct xfs_mount *mp = dp->i_mount;
1109 struct xfs_buf *bp = *bpp; 1109 struct xfs_buf *bp = *bpp;
1110 struct xfs_bmbt_irec *map = mip->map; 1110 struct xfs_bmbt_irec *map = mip->map;
1111 struct blk_plug plug;
1111 int error = 0; 1112 int error = 0;
1112 int length; 1113 int length;
1113 int i; 1114 int i;
@@ -1236,6 +1237,7 @@ xfs_dir2_leaf_readbuf(
1236 /* 1237 /*
1237 * Do we need more readahead? 1238 * Do we need more readahead?
1238 */ 1239 */
1240 blk_start_plug(&plug);
1239 for (mip->ra_index = mip->ra_offset = i = 0; 1241 for (mip->ra_index = mip->ra_offset = i = 0;
1240 mip->ra_want > mip->ra_current && i < mip->map_blocks; 1242 mip->ra_want > mip->ra_current && i < mip->map_blocks;
1241 i += mp->m_dirblkfsbs) { 1243 i += mp->m_dirblkfsbs) {
@@ -1287,6 +1289,7 @@ xfs_dir2_leaf_readbuf(
1287 } 1289 }
1288 } 1290 }
1289 } 1291 }
1292 blk_finish_plug(&plug);
1290 1293
1291out: 1294out:
1292 *bpp = bp; 1295 *bpp = bp;
@@ -1300,10 +1303,8 @@ out:
1300int /* error */ 1303int /* error */
1301xfs_dir2_leaf_getdents( 1304xfs_dir2_leaf_getdents(
1302 xfs_inode_t *dp, /* incore directory inode */ 1305 xfs_inode_t *dp, /* incore directory inode */
1303 void *dirent, 1306 struct dir_context *ctx,
1304 size_t bufsize, 1307 size_t bufsize)
1305 xfs_off_t *offset,
1306 filldir_t filldir)
1307{ 1308{
1308 struct xfs_buf *bp = NULL; /* data block buffer */ 1309 struct xfs_buf *bp = NULL; /* data block buffer */
1309 xfs_dir2_data_hdr_t *hdr; /* data block header */ 1310 xfs_dir2_data_hdr_t *hdr; /* data block header */
@@ -1322,7 +1323,7 @@ xfs_dir2_leaf_getdents(
1322 * If the offset is at or past the largest allowed value, 1323 * If the offset is at or past the largest allowed value,
1323 * give up right away. 1324 * give up right away.
1324 */ 1325 */
1325 if (*offset >= XFS_DIR2_MAX_DATAPTR) 1326 if (ctx->pos >= XFS_DIR2_MAX_DATAPTR)
1326 return 0; 1327 return 0;
1327 1328
1328 mp = dp->i_mount; 1329 mp = dp->i_mount;
@@ -1343,7 +1344,7 @@ xfs_dir2_leaf_getdents(
1343 * Inside the loop we keep the main offset value as a byte offset 1344 * Inside the loop we keep the main offset value as a byte offset
1344 * in the directory file. 1345 * in the directory file.
1345 */ 1346 */
1346 curoff = xfs_dir2_dataptr_to_byte(mp, *offset); 1347 curoff = xfs_dir2_dataptr_to_byte(mp, ctx->pos);
1347 1348
1348 /* 1349 /*
1349 * Force this conversion through db so we truncate the offset 1350 * Force this conversion through db so we truncate the offset
@@ -1444,8 +1445,8 @@ xfs_dir2_leaf_getdents(
1444 dep = (xfs_dir2_data_entry_t *)ptr; 1445 dep = (xfs_dir2_data_entry_t *)ptr;
1445 length = xfs_dir2_data_entsize(dep->namelen); 1446 length = xfs_dir2_data_entsize(dep->namelen);
1446 1447
1447 if (filldir(dirent, (char *)dep->name, dep->namelen, 1448 ctx->pos = xfs_dir2_byte_to_dataptr(mp, curoff) & 0x7fffffff;
1448 xfs_dir2_byte_to_dataptr(mp, curoff) & 0x7fffffff, 1449 if (!dir_emit(ctx, (char *)dep->name, dep->namelen,
1449 be64_to_cpu(dep->inumber), DT_UNKNOWN)) 1450 be64_to_cpu(dep->inumber), DT_UNKNOWN))
1450 break; 1451 break;
1451 1452
@@ -1462,9 +1463,9 @@ xfs_dir2_leaf_getdents(
1462 * All done. Set output offset value to current offset. 1463 * All done. Set output offset value to current offset.
1463 */ 1464 */
1464 if (curoff > xfs_dir2_dataptr_to_byte(mp, XFS_DIR2_MAX_DATAPTR)) 1465 if (curoff > xfs_dir2_dataptr_to_byte(mp, XFS_DIR2_MAX_DATAPTR))
1465 *offset = XFS_DIR2_MAX_DATAPTR & 0x7fffffff; 1466 ctx->pos = XFS_DIR2_MAX_DATAPTR & 0x7fffffff;
1466 else 1467 else
1467 *offset = xfs_dir2_byte_to_dataptr(mp, curoff) & 0x7fffffff; 1468 ctx->pos = xfs_dir2_byte_to_dataptr(mp, curoff) & 0x7fffffff;
1468 kmem_free(map_info); 1469 kmem_free(map_info);
1469 if (bp) 1470 if (bp)
1470 xfs_trans_brelse(NULL, bp); 1471 xfs_trans_brelse(NULL, bp);