diff --git a/lib/libzfs_core/libzfs_core.c b/lib/libzfs_core/libzfs_core.c index 0d74aa2133..681fd8c7ba 100644 --- a/lib/libzfs_core/libzfs_core.c +++ b/lib/libzfs_core/libzfs_core.c @@ -607,6 +607,19 @@ max_pipe_buffer(int infd) } unsigned int cur = fcntl(infd, F_GETPIPE_SZ); + /* + * 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 (cur); if (cur < max && fcntl(infd, F_SETPIPE_SZ, max) != -1) cur = max; return (cur); diff --git a/man/man8/zfs.8 b/man/man8/zfs.8 index 08996861af..bf8e86a5b2 100644 --- a/man/man8/zfs.8 +++ b/man/man8/zfs.8 @@ -745,6 +745,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 .