diff options
author | Omar Sandoval <osandov@fb.com> | 2016-05-20 13:50:33 -0700 |
---|---|---|
committer | Chris Mason <clm@fb.com> | 2016-06-25 06:20:10 -0700 |
commit | 02dbfc99b424dde3cf0a492ed3bec4f222441754 (patch) | |
tree | d08f267bac15ea5939185424bbe73306b7f11cb6 /fs/jffs2/gc.c | |
parent | 33688abb2802ff3a230bd2441f765477b94cc89e (diff) | |
download | op-kernel-dev-02dbfc99b424dde3cf0a492ed3bec4f222441754.zip op-kernel-dev-02dbfc99b424dde3cf0a492ed3bec4f222441754.tar.gz |
Btrfs: fix ->iterate_shared() by upgrading i_rwsem for delayed nodes
Commit fe742fd4f90f ("Revert "btrfs: switch to ->iterate_shared()"")
backed out the conversion to ->iterate_shared() for Btrfs because the
delayed inode handling in btrfs_real_readdir() is racy. However, we can
still do readdir in parallel if there are no delayed nodes.
This is a temporary fix which upgrades the shared inode lock to an
exclusive lock only when we have delayed items until we come up with a
more complete solution. While we're here, rename the
btrfs_{get,put}_delayed_items functions to make it very clear that
they're just for readdir.
Tested with xfstests and by doing a parallel kernel build:
while make tinyconfig && make -j4 && git clean dqfx; do
:
done
along with a bunch of parallel finds in another shell:
while true; do
for ((i=0; i<4; i++)); do
find . >/dev/null &
done
wait
done
Signed-off-by: Omar Sandoval <osandov@fb.com>
Signed-off-by: David Sterba <dsterba@suse.com>
Signed-off-by: Chris Mason <clm@fb.com>
Diffstat (limited to 'fs/jffs2/gc.c')
0 files changed, 0 insertions, 0 deletions