Revision 0dd1e3773ae8afc4bfdce782bdeffc10f9cae6ec authored by Jan Stancek on 22 December 2019, 12:33:24 UTC, committed by Linus Torvalds on 22 December 2019, 17:47:47 UTC
LTP pipeio_1 test is hanging with v5.5-rc2-385-gb8e382a185eb, with read side observing empty pipe and sleeping and write side running out of space and then sleeping as well. In this scenario there are 5 writers and 1 reader. Problem is that after pipe_write() reacquires pipe lock, it re-checks for empty pipe with potentially stale 'head' and doesn't wake up read side anymore. pipe->tail can advance beyond 'head', because there are multiple writers. Use pipe->head for empty pipe check after reacquiring lock to observe current state. Testing: With patch, LTP pipeio_1 ran successfully in loop for 1 hour. Without patch it hanged within a minute. Fixes: 1b6b26ae7053 ("pipe: fix and clarify pipe write wakeup logic") Reported-by: Rachel Sibley <rasibley@redhat.com> Signed-off-by: Jan Stancek <jstancek@redhat.com> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
1 parent b8e382a
File | Mode | Size |
---|---|---|
cluster | ||
dlm | ||
dlmfs | ||
Kconfig | -rw-r--r-- | 2.5 KB |
Makefile | -rw-r--r-- | 1.0 KB |
acl.c | -rw-r--r-- | 9.1 KB |
acl.h | -rw-r--r-- | 776 bytes |
alloc.c | -rw-r--r-- | 196.2 KB |
alloc.h | -rw-r--r-- | 11.2 KB |
aops.c | -rw-r--r-- | 62.2 KB |
aops.h | -rw-r--r-- | 2.4 KB |
blockcheck.c | -rw-r--r-- | 15.2 KB |
blockcheck.h | -rw-r--r-- | 3.3 KB |
buffer_head_io.c | -rw-r--r-- | 11.1 KB |
buffer_head_io.h | -rw-r--r-- | 1.6 KB |
dcache.c | -rw-r--r-- | 12.5 KB |
dcache.h | -rw-r--r-- | 1.2 KB |
dir.c | -rw-r--r-- | 113.4 KB |
dir.h | -rw-r--r-- | 3.2 KB |
dlmglue.c | -rw-r--r-- | 124.7 KB |
dlmglue.h | -rw-r--r-- | 6.7 KB |
export.c | -rw-r--r-- | 6.2 KB |
export.h | -rw-r--r-- | 392 bytes |
extent_map.c | -rw-r--r-- | 23.6 KB |
extent_map.h | -rw-r--r-- | 2.3 KB |
file.c | -rw-r--r-- | 66.5 KB |
file.h | -rw-r--r-- | 2.3 KB |
filecheck.c | -rw-r--r-- | 12.0 KB |
filecheck.h | -rw-r--r-- | 1.9 KB |
heartbeat.c | -rw-r--r-- | 2.8 KB |
heartbeat.h | -rw-r--r-- | 828 bytes |
inode.c | -rw-r--r-- | 45.4 KB |
inode.h | -rw-r--r-- | 5.3 KB |
ioctl.c | -rw-r--r-- | 22.4 KB |
ioctl.h | -rw-r--r-- | 369 bytes |
journal.c | -rw-r--r-- | 61.4 KB |
journal.h | -rw-r--r-- | 21.5 KB |
localalloc.c | -rw-r--r-- | 33.3 KB |
localalloc.h | -rw-r--r-- | 1.5 KB |
locks.c | -rw-r--r-- | 2.8 KB |
locks.h | -rw-r--r-- | 471 bytes |
mmap.c | -rw-r--r-- | 4.3 KB |
mmap.h | -rw-r--r-- | 173 bytes |
move_extents.c | -rw-r--r-- | 25.2 KB |
move_extents.h | -rw-r--r-- | 363 bytes |
namei.c | -rw-r--r-- | 69.2 KB |
namei.h | -rw-r--r-- | 1.1 KB |
ocfs1_fs_compat.h | -rw-r--r-- | 2.3 KB |
ocfs2.h | -rw-r--r-- | 24.5 KB |
ocfs2_fs.h | -rw-r--r-- | 49.6 KB |
ocfs2_ioctl.h | -rw-r--r-- | 6.5 KB |
ocfs2_lockid.h | -rw-r--r-- | 2.7 KB |
ocfs2_lockingver.h | -rw-r--r-- | 562 bytes |
ocfs2_trace.h | -rw-r--r-- | 75.8 KB |
quota.h | -rw-r--r-- | 4.6 KB |
quota_global.c | -rw-r--r-- | 29.8 KB |
quota_local.c | -rw-r--r-- | 35.5 KB |
refcounttree.c | -rw-r--r-- | 120.2 KB |
refcounttree.h | -rw-r--r-- | 4.4 KB |
reservations.c | -rw-r--r-- | 20.0 KB |
reservations.h | -rw-r--r-- | 4.9 KB |
resize.c | -rw-r--r-- | 15.5 KB |
resize.h | -rw-r--r-- | 444 bytes |
slot_map.c | -rw-r--r-- | 11.6 KB |
slot_map.h | -rw-r--r-- | 769 bytes |
stack_o2cb.c | -rw-r--r-- | 11.2 KB |
stack_user.c | -rw-r--r-- | 28.9 KB |
stackglue.c | -rw-r--r-- | 17.0 KB |
stackglue.h | -rw-r--r-- | 8.8 KB |
suballoc.c | -rw-r--r-- | 74.7 KB |
suballoc.h | -rw-r--r-- | 6.9 KB |
super.c | -rw-r--r-- | 68.3 KB |
super.h | -rw-r--r-- | 911 bytes |
symlink.c | -rw-r--r-- | 2.5 KB |
symlink.h | -rw-r--r-- | 634 bytes |
sysfile.c | -rw-r--r-- | 4.1 KB |
sysfile.h | -rw-r--r-- | 416 bytes |
uptodate.c | -rw-r--r-- | 17.0 KB |
uptodate.h | -rw-r--r-- | 2.3 KB |
xattr.c | -rw-r--r-- | 192.9 KB |
xattr.h | -rw-r--r-- | 3.1 KB |
Computing file changes ...