From owner-freebsd-hackers@freebsd.org Sun Sep 20 15:45:46 2020 Return-Path: Delivered-To: freebsd-hackers@mailman.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.nyi.freebsd.org (Postfix) with ESMTP id F2B1E3E5D83 for ; Sun, 20 Sep 2020 15:45:46 +0000 (UTC) (envelope-from asomers@gmail.com) Received: from mail-oi1-f182.google.com (mail-oi1-f182.google.com [209.85.167.182]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (2048 bits) client-digest SHA256) (Client CN "smtp.gmail.com", Issuer "GTS CA 1O1" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4BvX3G1WtTz3SvD for ; Sun, 20 Sep 2020 15:45:45 +0000 (UTC) (envelope-from asomers@gmail.com) Received: by mail-oi1-f182.google.com with SMTP id m7so13994707oie.0 for ; Sun, 20 Sep 2020 08:45:45 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:from:date:message-id:subject:to; bh=6n+5NjqidHYV7vdrnmZmZT6qehd7oJZpT0cmsV8w9m0=; b=m7pACWjcoavVUSgfn76eVTmNhLzc1JfbUk6x9hBwHlqMdnHI+uNtdo7lUXZk2uVoi8 E64qKVGbmivgFJAQYmZows1LZpw/Ya1AKq0m2SmtvcPoHuY/E/7yAuHdPPyzt6RJGafc dNdXSorv5MiP3XbWwetmlDLs4gXOem1nj/dp/nE7kIZLZRNpm4236ELqcU6xgP7eWFtH 5YXgkha5NiYowJDVghKALHc2+S5JqUad9PqkO8LdQZBgzGZhqHxykWNjKxayhbhSscAw qmxI+mA85PQpXC8DgZIvEfvO+s6CfodFHKPAt3TL9KxBgSdLNplYYBYw+HFMG7BLyKoN q/SA== X-Gm-Message-State: AOAM533fLlJuCqTIQz41ggSs1+bWFS0u2V50NW0dWlRzXihKrFAa3OTk zpePdB1uSmpn1zxWI2JUAaJ0YGyTgh4YUfHkq6JkqqQU X-Google-Smtp-Source: ABdhPJztz1vrBIHm7dGxVMhFu8K2OY9r4Vmy54tRPBM/U8c7OgDVqtY2OMzTUDkVBUHOSxUmRl7/kbfLodkB5SK2pUE= X-Received: by 2002:aca:45c2:: with SMTP id s185mr15862582oia.57.1600616744898; Sun, 20 Sep 2020 08:45:44 -0700 (PDT) MIME-Version: 1.0 From: Alan Somers Date: Sun, 20 Sep 2020 09:45:34 -0600 Message-ID: Subject: RFC: copy_file_range(3) To: FreeBSD Hackers X-Rspamd-Queue-Id: 4BvX3G1WtTz3SvD X-Spamd-Bar: -- Authentication-Results: mx1.freebsd.org; dkim=none; dmarc=none; spf=pass (mx1.freebsd.org: domain of asomers@gmail.com designates 209.85.167.182 as permitted sender) smtp.mailfrom=asomers@gmail.com X-Spamd-Result: default: False [-2.45 / 15.00]; RCVD_TLS_ALL(0.00)[]; FREEMAIL_ENVFROM(0.00)[gmail.com]; RCVD_COUNT_TWO(0.00)[2]; FREEFALL_USER(0.00)[asomers]; FROM_HAS_DN(0.00)[]; TO_MATCH_ENVRCPT_ALL(0.00)[]; R_SPF_ALLOW(-0.20)[+ip4:209.85.128.0/17]; MIME_GOOD(-0.10)[multipart/alternative,text/plain]; PREVIOUSLY_DELIVERED(0.00)[freebsd-hackers@freebsd.org]; ARC_NA(0.00)[]; RCPT_COUNT_ONE(0.00)[1]; NEURAL_HAM_LONG(-0.90)[-0.901]; DMARC_NA(0.00)[freebsd.org]; TO_DN_ALL(0.00)[]; NEURAL_HAM_SHORT(-0.56)[-0.565]; RCVD_IN_DNSWL_NONE(0.00)[209.85.167.182:from]; NEURAL_HAM_MEDIUM(-0.99)[-0.985]; FORGED_SENDER(0.30)[asomers@freebsd.org,asomers@gmail.com]; RWL_MAILSPIKE_POSSIBLE(0.00)[209.85.167.182:from]; R_DKIM_NA(0.00)[]; MIME_TRACE(0.00)[0:+,1:+,2:~]; ASN(0.00)[asn:15169, ipnet:209.85.128.0/17, country:US]; FROM_NEQ_ENVFROM(0.00)[asomers@freebsd.org,asomers@gmail.com]; MAILMAN_DEST(0.00)[freebsd-hackers]; TO_DOM_EQ_FROM_DOM(0.00)[] Content-Type: text/plain; charset="UTF-8" X-Content-Filtered-By: Mailman/MimeDel 2.1.33 X-BeenThere: freebsd-hackers@freebsd.org X-Mailman-Version: 2.1.33 Precedence: list List-Id: Technical Discussions relating to FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 20 Sep 2020 15:45:47 -0000 copy_file_range(2) is nifty, but it has a few sharp edges: 1) Certain file systems don't support it, necessitating a write/read based fallback 2) It doesn't handle sparse files as well as SEEK_HOLE/SEEK_DATA 3) It's slightly tricky to both efficiently deal with holes and also promptly respond to signals These problems aren't terribly hard, but it seems to me like most applications that use copy_file_range would share the exact same solutions. In particular, I'm thinking about cp(1), dd(1), and install(8). Those three could benefit from sharing a userland wrapper that handles the above problems. Should we add such a wrapper to libc? If so, what should it be called, and should it be public or just private to /usr/src ? -Alan