diff options
Diffstat (limited to 'fs/xfs/xfs_dir2_leaf.c')
-rw-r--r-- | fs/xfs/xfs_dir2_leaf.c | 21 |
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 | ||
1291 | out: | 1294 | out: |
1292 | *bpp = bp; | 1295 | *bpp = bp; |
@@ -1300,10 +1303,8 @@ out: | |||
1300 | int /* error */ | 1303 | int /* error */ |
1301 | xfs_dir2_leaf_getdents( | 1304 | xfs_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); |