Add workaround for broken Linux pipes

Linux has an unresolved hang if you resize a pipe with bytes
in it.

Since there's no obvious way to detect this happening, added a
workaround to disable resizing the pipe buffer if you set an
environment variable.

Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: Rich Ercolani <rincebrain@gmail.com>
Closes #13309
This commit is contained in:
Rich Ercolani 2022-05-09 19:33:55 -04:00 committed by Brian Behlendorf
parent f28c7302cb
commit e84a2ed7a8
2 changed files with 24 additions and 0 deletions

View File

@ -35,6 +35,22 @@
void void
libzfs_set_pipe_max(int infd) libzfs_set_pipe_max(int infd)
{ {
#if __linux__
/*
* Sadly, Linux has an unfixed deadlock if you do SETPIPE_SZ on a pipe
* with data in it.
* cf. #13232, https://bugzilla.kernel.org/show_bug.cgi?id=212295
*
* And since the problem is in waking up the writer, there's nothing
* we can do about it from here.
*
* So if people want to, they can set this, but they
* may regret it...
*/
if (getenv("ZFS_SET_PIPE_MAX") == NULL)
return;
#endif
FILE *procf = fopen("/proc/sys/fs/pipe-max-size", "re"); FILE *procf = fopen("/proc/sys/fs/pipe-max-size", "re");
if (procf != NULL) { if (procf != NULL) {

View File

@ -713,6 +713,14 @@ to use
to mount ZFS datasets. to mount ZFS datasets.
This option is provided for backwards compatibility with older ZFS versions. This option is provided for backwards compatibility with older ZFS versions.
.El .El
.Bl -tag -width "ZFS_SET_PIPE_MAX"
.It Sy ZFS_SET_PIPE_MAX
Tells
.Nm zfs
to set the maximum pipe size for sends/recieves.
Disabled by default on Linux
due to an unfixed deadlock in Linux's pipe size handling code.
.El
. .
.Sh INTERFACE STABILITY .Sh INTERFACE STABILITY
.Sy Committed . .Sy Committed .