diff --git a/lib/libzfs/os/linux/libzfs_sendrecv_os.c b/lib/libzfs/os/linux/libzfs_sendrecv_os.c index ac7ab95a39b6..8fc02fff2d4c 100644 --- a/lib/libzfs/os/linux/libzfs_sendrecv_os.c +++ b/lib/libzfs/os/linux/libzfs_sendrecv_os.c @@ -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) { diff --git a/man/man8/zfs.8 b/man/man8/zfs.8 index fca1ba00da7d..a5c9441699e5 100644 --- a/man/man8/zfs.8 +++ b/man/man8/zfs.8 @@ -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 .