diff options
Diffstat (limited to 'fs/xfs/xfs_dir2_readdir.c')
-rw-r--r-- | fs/xfs/xfs_dir2_readdir.c | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/fs/xfs/xfs_dir2_readdir.c b/fs/xfs/xfs_dir2_readdir.c index 098cd78fe708..a989a9c7edb7 100644 --- a/fs/xfs/xfs_dir2_readdir.c +++ b/fs/xfs/xfs_dir2_readdir.c | |||
@@ -171,6 +171,7 @@ xfs_dir2_block_getdents( | |||
171 | int wantoff; /* starting block offset */ | 171 | int wantoff; /* starting block offset */ |
172 | xfs_off_t cook; | 172 | xfs_off_t cook; |
173 | struct xfs_da_geometry *geo = args->geo; | 173 | struct xfs_da_geometry *geo = args->geo; |
174 | int lock_mode; | ||
174 | 175 | ||
175 | /* | 176 | /* |
176 | * If the block number in the offset is out of range, we're done. | 177 | * If the block number in the offset is out of range, we're done. |
@@ -178,7 +179,9 @@ xfs_dir2_block_getdents( | |||
178 | if (xfs_dir2_dataptr_to_db(geo, ctx->pos) > geo->datablk) | 179 | if (xfs_dir2_dataptr_to_db(geo, ctx->pos) > geo->datablk) |
179 | return 0; | 180 | return 0; |
180 | 181 | ||
182 | lock_mode = xfs_ilock_data_map_shared(dp); | ||
181 | error = xfs_dir3_block_read(NULL, dp, &bp); | 183 | error = xfs_dir3_block_read(NULL, dp, &bp); |
184 | xfs_iunlock(dp, lock_mode); | ||
182 | if (error) | 185 | if (error) |
183 | return error; | 186 | return error; |
184 | 187 | ||
@@ -529,9 +532,12 @@ xfs_dir2_leaf_getdents( | |||
529 | * current buffer, need to get another one. | 532 | * current buffer, need to get another one. |
530 | */ | 533 | */ |
531 | if (!bp || ptr >= (char *)bp->b_addr + geo->blksize) { | 534 | if (!bp || ptr >= (char *)bp->b_addr + geo->blksize) { |
535 | int lock_mode; | ||
532 | 536 | ||
537 | lock_mode = xfs_ilock_data_map_shared(dp); | ||
533 | error = xfs_dir2_leaf_readbuf(args, bufsize, map_info, | 538 | error = xfs_dir2_leaf_readbuf(args, bufsize, map_info, |
534 | &curoff, &bp); | 539 | &curoff, &bp); |
540 | xfs_iunlock(dp, lock_mode); | ||
535 | if (error || !map_info->map_valid) | 541 | if (error || !map_info->map_valid) |
536 | break; | 542 | break; |
537 | 543 | ||
@@ -653,7 +659,6 @@ xfs_readdir( | |||
653 | struct xfs_da_args args = { NULL }; | 659 | struct xfs_da_args args = { NULL }; |
654 | int rval; | 660 | int rval; |
655 | int v; | 661 | int v; |
656 | uint lock_mode; | ||
657 | 662 | ||
658 | trace_xfs_readdir(dp); | 663 | trace_xfs_readdir(dp); |
659 | 664 | ||
@@ -666,7 +671,7 @@ xfs_readdir( | |||
666 | args.dp = dp; | 671 | args.dp = dp; |
667 | args.geo = dp->i_mount->m_dir_geo; | 672 | args.geo = dp->i_mount->m_dir_geo; |
668 | 673 | ||
669 | lock_mode = xfs_ilock_data_map_shared(dp); | 674 | xfs_ilock(dp, XFS_IOLOCK_SHARED); |
670 | if (dp->i_d.di_format == XFS_DINODE_FMT_LOCAL) | 675 | if (dp->i_d.di_format == XFS_DINODE_FMT_LOCAL) |
671 | rval = xfs_dir2_sf_getdents(&args, ctx); | 676 | rval = xfs_dir2_sf_getdents(&args, ctx); |
672 | else if ((rval = xfs_dir2_isblock(&args, &v))) | 677 | else if ((rval = xfs_dir2_isblock(&args, &v))) |
@@ -675,7 +680,7 @@ xfs_readdir( | |||
675 | rval = xfs_dir2_block_getdents(&args, ctx); | 680 | rval = xfs_dir2_block_getdents(&args, ctx); |
676 | else | 681 | else |
677 | rval = xfs_dir2_leaf_getdents(&args, ctx, bufsize); | 682 | rval = xfs_dir2_leaf_getdents(&args, ctx, bufsize); |
678 | xfs_iunlock(dp, lock_mode); | 683 | xfs_iunlock(dp, XFS_IOLOCK_SHARED); |
679 | 684 | ||
680 | return rval; | 685 | return rval; |
681 | } | 686 | } |