From patchwork Fri Aug 21 07:40:04 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Omar Sandoval X-Patchwork-Id: 11728497 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id BB65F739 for ; Fri, 21 Aug 2020 07:41:13 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id A20FF207DF for ; Fri, 21 Aug 2020 07:41:13 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=osandov-com.20150623.gappssmtp.com header.i=@osandov-com.20150623.gappssmtp.com header.b="zKarahD+" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728432AbgHUHlI (ORCPT ); Fri, 21 Aug 2020 03:41:08 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:37248 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728267AbgHUHkq (ORCPT ); Fri, 21 Aug 2020 03:40:46 -0400 Received: from mail-pl1-x643.google.com (mail-pl1-x643.google.com [IPv6:2607:f8b0:4864:20::643]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 706C7C061386 for ; Fri, 21 Aug 2020 00:40:46 -0700 (PDT) Received: by mail-pl1-x643.google.com with SMTP id t11so518423plr.5 for ; Fri, 21 Aug 2020 00:40:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=osandov-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=URR7tMlgOUKOzcjK5E8NicBnj1Rg4iRoSDJkh2liR1o=; b=zKarahD+70otuDEW4gm8J5J9PDMsQPCnJbs0kGPG8OxJ92n+9S+gkTd2+5al7gS4lQ itIoIFqAMcDZtg10sQYONqy4EkM7jTBqeEU5fHGcplEoKSlxXGbeE6du7eklFTz7NLWa EmpfFZm7OzP1zGQrV1IID53Vgs+i80uW8Zmxh6iMNU+Sx65gWzlGs5Jq2z40tJCOKRTG 6ufp9VZbG/UDrhcbo69ENy8xnb/pepTfkoTbgP6wmxVZk5uQKjCJlkyuasPziKE+WTYM pV363RwWl4NhY+xluWqjlZY9nnFCj4cRliRIPPsGlfNRLP6K8vfmNrAnybwQ/JOug8EZ AGWw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=URR7tMlgOUKOzcjK5E8NicBnj1Rg4iRoSDJkh2liR1o=; b=nC5GSujedDMoZ3d6Sa6UpYz2rntPKTH5O5BWlJbzCGayMvYo8oqegRYeXdDoPWVml1 dJXCUQaDOs9rm3cBeAYAk2FQHCS7Ipm+SoR3s69wWSHhswokY7Xbd+X/MqWGoMahdBcx RNYRkavFfFGelOb3C9ohT4oNHd637cBoAYIjcvVlejMGxRDrlLFHj1yD3cEJIRpiAm5F kp9LLkf8e/UF2+wAjaJ0njeHkI6pc7k2xDTjNwDvU1vb68wErYnIZIpnghykiabWK9W1 CedDGv7MlGewJvM5flnmMVnGTC7JDFD4rQmdKs7GECfZVgwCoT03M2JQjBcRJ2GKWoGe vW1A== X-Gm-Message-State: AOAM533vFhzSh57vqubuJEoyCyCBKmbDXlSdDr1s1fRHKhSA8seNmN2W QcGlZWgLUuf3qAamsivunPbGUzcPvJDR3Q== X-Google-Smtp-Source: ABdhPJwhV8iqJUiJ0/8V0kKRrmFqPmu9SAzuKRUn2QhB22gVhZBUHwNdn4tx9as4cPlmH2FPQKUsHA== X-Received: by 2002:a17:90a:498b:: with SMTP id d11mr1397508pjh.179.1597995645241; Fri, 21 Aug 2020 00:40:45 -0700 (PDT) Received: from exodia.tfbnw.net ([2620:10d:c090:400::5:f2a4]) by smtp.gmail.com with ESMTPSA id jb1sm1080875pjb.9.2020.08.21.00.40.43 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 21 Aug 2020 00:40:43 -0700 (PDT) From: Omar Sandoval To: linux-btrfs@vger.kernel.org Cc: linux-fsdevel@vger.kernel.org Subject: [PATCH 05/11] btrfs-progs: receive: add stub implementation for pwritev2 Date: Fri, 21 Aug 2020 00:40:04 -0700 Message-Id: X-Mailer: git-send-email 2.28.0 In-Reply-To: References: MIME-Version: 1.0 Sender: linux-btrfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org From: Boris Burkov Encoded writes in receive will use pwritev2. It is possible that the system libc does not export this function, so we stub it out and detect whether to build the stub code with autoconf. This syscall has special semantics in x32 (no hi lo, just takes loff_t) so we have to detect that case and use the appropriate arguments. Signed-off-by: Boris Burkov --- Makefile | 4 ++-- configure.ac | 1 + stubs.c | 24 ++++++++++++++++++++++++ stubs.h | 11 +++++++++++ 4 files changed, 38 insertions(+), 2 deletions(-) create mode 100644 stubs.c create mode 100644 stubs.h diff --git a/Makefile b/Makefile index c788b91b..11ecfc6c 100644 --- a/Makefile +++ b/Makefile @@ -173,12 +173,12 @@ libbtrfs_objects = common/send-stream.o common/send-utils.o kernel-lib/rbtree.o kernel-lib/raid56.o kernel-lib/tables.o \ common/device-scan.o common/path-utils.o \ common/utils.o libbtrfsutil/subvolume.o libbtrfsutil/stubs.o \ - crypto/hash.o crypto/xxhash.o $(CRYPTO_OBJECTS) + crypto/hash.o crypto/xxhash.o $(CRYPTO_OBJECTS) stubs.o libbtrfs_headers = common/send-stream.h common/send-utils.h send.h kernel-lib/rbtree.h btrfs-list.h \ crypto/crc32c.h kernel-lib/list.h kerncompat.h \ kernel-lib/radix-tree.h kernel-lib/sizes.h kernel-lib/raid56.h \ common/extent-cache.h kernel-shared/extent_io.h ioctl.h \ - kernel-shared/ctree.h btrfsck.h version.h + kernel-shared/ctree.h btrfsck.h version.h stubs.h libbtrfsutil_major := $(shell sed -rn 's/^\#define BTRFS_UTIL_VERSION_MAJOR ([0-9])+$$/\1/p' libbtrfsutil/btrfsutil.h) libbtrfsutil_minor := $(shell sed -rn 's/^\#define BTRFS_UTIL_VERSION_MINOR ([0-9])+$$/\1/p' libbtrfsutil/btrfsutil.h) libbtrfsutil_patch := $(shell sed -rn 's/^\#define BTRFS_UTIL_VERSION_PATCH ([0-9])+$$/\1/p' libbtrfsutil/btrfsutil.h) diff --git a/configure.ac b/configure.ac index 7c2c9b8d..cbcfbe6d 100644 --- a/configure.ac +++ b/configure.ac @@ -45,6 +45,7 @@ AC_CHECK_FUNCS([openat], [], [AC_MSG_ERROR([cannot find openat() function])]) AC_CHECK_FUNCS([reallocarray]) +AC_CHECK_FUNCS([pwritev2]) m4_ifndef([PKG_PROG_PKG_CONFIG], [m4_fatal([Could not locate the pkg-config autoconf diff --git a/stubs.c b/stubs.c new file mode 100644 index 00000000..ab68a411 --- /dev/null +++ b/stubs.c @@ -0,0 +1,24 @@ +#if HAVE_PWRITEV2 != 1 + +#include "stubs.h" + +#include "kerncompat.h" + +#include +#include +#include + +ssize_t pwritev2(int fd, const struct iovec *iov, int iovcnt, off_t offset, + int flags) +{ +/* these conditions indicate an x32 system, which has a different pwritev2 */ +#if defined(__x86_64__) && defined(__ILP32__) + return syscall(SYS_pwritev2, fd, iov, iovcnt, offset, flags); +#else + unsigned long hi = offset >> (BITS_PER_LONG / 2) >> (BITS_PER_LONG / 2); + unsigned long lo = offset; + + return syscall(SYS_pwritev2, fd, iov, iovcnt, lo, hi, flags); +#endif // X32 +} +#endif /* HAVE_PWRIVEV2 */ diff --git a/stubs.h b/stubs.h new file mode 100644 index 00000000..b39f8a69 --- /dev/null +++ b/stubs.h @@ -0,0 +1,11 @@ +#ifndef _BTRFS_STUBS_H +#define _BTRFS_STUBS_H + +#include + +struct iovec; + +ssize_t pwritev2(int fd, const struct iovec *iov, int iovcnt, off_t offset, + int flags); + +#endif