From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on dcvr.yhbt.net X-Spam-Level: X-Spam-ASN: AS31976 209.132.180.0/23 X-Spam-Status: No, score=-4.0 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_EF,HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,RCVD_IN_DNSWL_MED,RCVD_IN_MSPIKE_H3, RCVD_IN_MSPIKE_WL,SPF_HELO_PASS,SPF_PASS shortcircuit=no autolearn=ham autolearn_force=no version=3.4.2 Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dcvr.yhbt.net (Postfix) with ESMTPS id 2FDA11F466 for ; Tue, 14 Jan 2020 12:57:52 +0000 (UTC) DomainKey-Signature: a=rsa-sha1; c=nofws; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:from:to:cc:subject:date:message-id :mime-version:content-transfer-encoding:content-type; q=dns; s= default; b=QrrmZFf2Lajr3l6B/p51oqco1uJ2WKnI3JlQZClMceB9QHKTjsy4O Jn517cYJ7gc2TKVQw3eUE6GAtunC4mszVIaET0rvq45YVjBn8UjBP9f+mryPamRw kcYSBe+HedXsuLC7M2E6oF0CAvnhHRkgeYmVXGFOhQHOORvCKHqRMs= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:from:to:cc:subject:date:message-id :mime-version:content-transfer-encoding:content-type; s=default; bh=utvbeYHVFhAyj2E87v1s5CviOkQ=; b=h7KjYp1VjUOUtP1Z5JCl5eF7AeYv IZ5zvzpZ+sU8fYWcGqNoY2EwQGIy5w1VbqYWUklXL/e6TGcEwTh4QCWA34eMp5vH b3/1dm4RgHh8gZDmXCeOrlWA3OvSsafLEQZgjTmK6VWt9zagMdoc7qh0+mZelspt YzMqmc7CZvDVOZE= Received: (qmail 1053 invoked by alias); 14 Jan 2020 12:57:49 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Received: (qmail 1045 invoked by uid 89); 14 Jan 2020 12:57:49 -0000 Authentication-Results: sourceware.org; auth=none X-HELO: heian.cn.fujitsu.com From: Xiao Yang To: CC: Xiao Yang Subject: [PATCH] sysdeps/posix/posix_fallocate*: Make emulated posix_fallocate() work properly Date: Tue, 14 Jan 2020 20:53:14 +0800 Message-ID: <20200114125314.19093-1-yangx.jy@cn.fujitsu.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain X-yoursite-MailScanner-ID: BAA394CE1CB3.AAEF4 X-yoursite-MailScanner: Found to be clean X-yoursite-MailScanner-From: yangx.jy@cn.fujitsu.com Emulated posix_fallocate() only writes data in one block if block size is 4096, offset is 4095 and len is 2. The emulated code should write data in two blocks in the case because it actually crosses two blocks. Signed-off-by: Xiao Yang --- sysdeps/posix/posix_fallocate.c | 14 ++++++++++++++ sysdeps/posix/posix_fallocate64.c | 14 ++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/sysdeps/posix/posix_fallocate.c b/sysdeps/posix/posix_fallocate.c index e7fccfc1c8..f661124c0f 100644 --- a/sysdeps/posix/posix_fallocate.c +++ b/sysdeps/posix/posix_fallocate.c @@ -93,6 +93,20 @@ posix_fallocate (int fd, __off_t offset, __off_t len) increment = 4096; } + if (offset % increment + len % increment > increment) + { + if (offset < st.st_size) + { + unsigned char b; + ssize_t rdsize = __pread (fd, &b, 1, offset); + if (rdsize < 0) + return errno; + } else { + if (__pwrite (fd, "", 1, offset) != 1) + return errno; + } + } + /* Write a null byte to every block. This is racy; we currently lack a better option. Compare-and-swap against a file mapping might additional local races, but requires interposition of a diff --git a/sysdeps/posix/posix_fallocate64.c b/sysdeps/posix/posix_fallocate64.c index f9d4fe5ca3..2d75ce2786 100644 --- a/sysdeps/posix/posix_fallocate64.c +++ b/sysdeps/posix/posix_fallocate64.c @@ -93,6 +93,20 @@ __posix_fallocate64_l64 (int fd, __off64_t offset, __off64_t len) increment = 4096; } + if (offset % increment + len % increment > increment) + { + if (offset < st.st_size) + { + unsigned char b; + ssize_t rdsize = __pread (fd, &b, 1, offset); + if (rdsize < 0) + return errno; + } else { + if (__pwrite (fd, "", 1, offset) != 1) + return errno; + } + } + /* Write a null byte to every block. This is racy; we currently lack a better option. Compare-and-swap against a file mapping might address local races, but requires interposition of a signal -- 2.21.0