Commit e34df334 authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'work.lookups' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs

Pull parallel lookup fixups from Al Viro:
 "Fix for xfs parallel readdir (turns out the cxfs exposure was not
  enough to catch all problems), and a reversion of btrfs back to
  ->iterate() until the fs/btrfs/delayed-inode.c gets fixed"

* 'work.lookups' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs:
  xfs: concurrent readdir hangs on data buffer locks
  Revert "btrfs: switch to ->iterate_shared()"
parents 442c9ac9 9f541801
...@@ -10181,7 +10181,7 @@ static const struct inode_operations btrfs_dir_ro_inode_operations = { ...@@ -10181,7 +10181,7 @@ static const struct inode_operations btrfs_dir_ro_inode_operations = {
static const struct file_operations btrfs_dir_file_operations = { static const struct file_operations btrfs_dir_file_operations = {
.llseek = generic_file_llseek, .llseek = generic_file_llseek,
.read = generic_read_dir, .read = generic_read_dir,
.iterate_shared = btrfs_real_readdir, .iterate = btrfs_real_readdir,
.unlocked_ioctl = btrfs_ioctl, .unlocked_ioctl = btrfs_ioctl,
#ifdef CONFIG_COMPAT #ifdef CONFIG_COMPAT
.compat_ioctl = btrfs_ioctl, .compat_ioctl = btrfs_ioctl,
......
...@@ -273,10 +273,11 @@ xfs_dir2_leaf_readbuf( ...@@ -273,10 +273,11 @@ xfs_dir2_leaf_readbuf(
size_t bufsize, size_t bufsize,
struct xfs_dir2_leaf_map_info *mip, struct xfs_dir2_leaf_map_info *mip,
xfs_dir2_off_t *curoff, xfs_dir2_off_t *curoff,
struct xfs_buf **bpp) struct xfs_buf **bpp,
bool trim_map)
{ {
struct xfs_inode *dp = args->dp; struct xfs_inode *dp = args->dp;
struct xfs_buf *bp = *bpp; struct xfs_buf *bp = NULL;
struct xfs_bmbt_irec *map = mip->map; struct xfs_bmbt_irec *map = mip->map;
struct blk_plug plug; struct blk_plug plug;
int error = 0; int error = 0;
...@@ -286,13 +287,10 @@ xfs_dir2_leaf_readbuf( ...@@ -286,13 +287,10 @@ xfs_dir2_leaf_readbuf(
struct xfs_da_geometry *geo = args->geo; struct xfs_da_geometry *geo = args->geo;
/* /*
* If we have a buffer, we need to release it and * If the caller just finished processing a buffer, it will tell us
* take it out of the mapping. * we need to trim that block out of the mapping now it is done.
*/ */
if (trim_map) {
if (bp) {
xfs_trans_brelse(NULL, bp);
bp = NULL;
mip->map_blocks -= geo->fsbcount; mip->map_blocks -= geo->fsbcount;
/* /*
* Loop to get rid of the extents for the * Loop to get rid of the extents for the
...@@ -533,10 +531,17 @@ xfs_dir2_leaf_getdents( ...@@ -533,10 +531,17 @@ xfs_dir2_leaf_getdents(
*/ */
if (!bp || ptr >= (char *)bp->b_addr + geo->blksize) { if (!bp || ptr >= (char *)bp->b_addr + geo->blksize) {
int lock_mode; int lock_mode;
bool trim_map = false;
if (bp) {
xfs_trans_brelse(NULL, bp);
bp = NULL;
trim_map = true;
}
lock_mode = xfs_ilock_data_map_shared(dp); lock_mode = xfs_ilock_data_map_shared(dp);
error = xfs_dir2_leaf_readbuf(args, bufsize, map_info, error = xfs_dir2_leaf_readbuf(args, bufsize, map_info,
&curoff, &bp); &curoff, &bp, trim_map);
xfs_iunlock(dp, lock_mode); xfs_iunlock(dp, lock_mode);
if (error || !map_info->map_valid) if (error || !map_info->map_valid)
break; break;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment