|
@@ -674,6 +674,7 @@ xfs_readdir(
|
|
|
{
|
|
|
int rval; /* return value */
|
|
|
int v; /* type-checking value */
|
|
|
+ uint lock_mode;
|
|
|
|
|
|
trace_xfs_readdir(dp);
|
|
|
|
|
@@ -683,6 +684,7 @@ xfs_readdir(
|
|
|
ASSERT(S_ISDIR(dp->i_d.di_mode));
|
|
|
XFS_STATS_INC(xs_dir_getdents);
|
|
|
|
|
|
+ lock_mode = xfs_ilock_data_map_shared(dp);
|
|
|
if (dp->i_d.di_format == XFS_DINODE_FMT_LOCAL)
|
|
|
rval = xfs_dir2_sf_getdents(dp, ctx);
|
|
|
else if ((rval = xfs_dir2_isblock(NULL, dp, &v)))
|
|
@@ -691,5 +693,7 @@ xfs_readdir(
|
|
|
rval = xfs_dir2_block_getdents(dp, ctx);
|
|
|
else
|
|
|
rval = xfs_dir2_leaf_getdents(dp, ctx, bufsize);
|
|
|
+ xfs_iunlock(dp, lock_mode);
|
|
|
+
|
|
|
return rval;
|
|
|
}
|