aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lib/libzfs_core/libzfs_core.c13
-rw-r--r--man/man8/zfs.88
2 files changed, 21 insertions, 0 deletions
diff --git a/lib/libzfs_core/libzfs_core.c b/lib/libzfs_core/libzfs_core.c
index 0d74aa213..681fd8c7b 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 08996861a..bf8e86a5b 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 .