]> git.proxmox.com Git - mirror_zfs.git/commitdiff
libzfs_core: simplify max_pipe_buffer(), return new max
authorнаб <nabijaczleweli@nabijaczleweli.xyz>
Sun, 20 Feb 2022 19:17:22 +0000 (20:17 +0100)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Tue, 8 Mar 2022 17:33:07 +0000 (09:33 -0800)
We do still check and only optionally set because all F_SETPIPE_SZ
directives reallocate the pipe buffer

Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Reviewed-by: Rich Ercolani <rincebrain@gmail.com>
Reviewed-by: Paul Dagnelie <pcd@delphix.com>
Signed-off-by: Ahelenia Ziemiańska <nabijaczleweli@nabijaczleweli.xyz>
Closes #13133

lib/libzfs_core/libzfs_core.c

index f7561241af30e43d7b46d3e342f777d50bcc77c2..621e333e14eccfbf8c9c7adcb43ef542a94b2d51 100644 (file)
@@ -91,6 +91,9 @@
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <sys/zfs_ioctl.h>
+#if __FreeBSD__
+#define        BIG_PIPE_SIZE (64 * 1024) /* From sys/pipe.h */
+#endif
 
 static int g_fd = -1;
 static pthread_mutex_t g_lock = PTHREAD_MUTEX_INITIALIZER;
@@ -586,27 +589,31 @@ lzc_get_holds(const char *snapname, nvlist_t **holdsp)
        return (lzc_ioctl(ZFS_IOC_GET_HOLDS, snapname, NULL, holdsp));
 }
 
-static void
+static unsigned int
 max_pipe_buffer(int infd)
 {
 #if __linux__
-       FILE *procf = fopen("/proc/sys/fs/pipe-max-size", "re");
-
-       if (procf != NULL) {
-               unsigned long max_psize;
-               long cur_psize;
-               if (fscanf(procf, "%lu", &max_psize) > 0) {
-                       cur_psize = fcntl(infd, F_GETPIPE_SZ);
-                       if (cur_psize > 0 &&
-                           max_psize > (unsigned long) cur_psize)
-                               fcntl(infd, F_SETPIPE_SZ,
-                                   max_psize);
+       static unsigned int max;
+       if (max == 0) {
+               max = 1048576; /* fs/pipe.c default */
+
+               FILE *procf = fopen("/proc/sys/fs/pipe-max-size", "re");
+               if (procf != NULL) {
+                       if (fscanf(procf, "%u", &max) <= 0) {
+                               /* ignore error: max untouched if parse fails */
+                       }
+                       fclose(procf);
                }
-               fclose(procf);
        }
+
+       unsigned int cur = fcntl(infd, F_GETPIPE_SZ);
+       if (cur < max && fcntl(infd, F_SETPIPE_SZ, max) != -1)
+               cur = max;
+       return (cur);
 #else
        /* FreeBSD automatically resizes */
        (void) infd;
+       return (BIG_PIPE_SIZE);
 #endif
 }
 
@@ -843,7 +850,7 @@ recv_impl(const char *snapname, nvlist_t *recvdprops, nvlist_t *localprops,
        if (fstat(input_fd, &sb) == -1)
                return (errno);
        if (S_ISFIFO(sb.st_mode))
-               max_pipe_buffer(input_fd);
+               (void) max_pipe_buffer(input_fd);
 
        /*
         * The begin_record is normally a non-byteswapped BEGIN record.