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
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");
if (procf != NULL) {

View File

@ -713,6 +713,14 @@ to use
to mount ZFS datasets.
This option is provided for backwards compatibility with older ZFS versions.
.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
.Sy Committed .