From patchwork Thu Jun 15 22:10:18 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Adhemerval Zanella Netto X-Patchwork-Id: 9790331 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id E435960325 for ; Thu, 15 Jun 2017 22:10:32 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id CBF5D28417 for ; Thu, 15 Jun 2017 22:10:32 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id C08BC28472; Thu, 15 Jun 2017 22:10:32 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-7.0 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 166CC28417 for ; Thu, 15 Jun 2017 22:10:32 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752140AbdFOWK2 (ORCPT ); Thu, 15 Jun 2017 18:10:28 -0400 Received: from mail-qt0-f173.google.com ([209.85.216.173]:35460 "EHLO mail-qt0-f173.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751546AbdFOWKZ (ORCPT ); Thu, 15 Jun 2017 18:10:25 -0400 Received: by mail-qt0-f173.google.com with SMTP id w1so39224319qtg.2 for ; Thu, 15 Jun 2017 15:10:25 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=to:cc:from:subject:message-id:date:user-agent:mime-version :content-language:content-transfer-encoding; bh=K+i3t1X3wIuIfmnDfsQwdd8wU9As3AMwNpP9xsFsaxM=; b=VT7lG6iv1OxJ5NtdtmQa+w2FNHc2TRfyQThqZ9Cpb//mFhittvKpHSa6VldX2b1IES ebnd0O1l5Q1ujQ7uHCuGxRxm26NJBzjYvxM7wqmZjknX3k0TgGxq1xr/2CdkQL36aCup 9Pxc2f5ptgUB+YeOiqkZrdbwc2F0Me5By9Q+w= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:to:cc:from:subject:message-id:date:user-agent :mime-version:content-language:content-transfer-encoding; bh=K+i3t1X3wIuIfmnDfsQwdd8wU9As3AMwNpP9xsFsaxM=; b=F/B1bTJjMeb0ufGnfvB9hYRnSUVflRiCrHRnBtgjQyvRmvgVPkXp7D2BWvoniZiTBJ uufEHKDQSuVgowODpvEahk63U5cli00x56SKTMqmJdK1CHHfWMJn/9VUAuDzheHoeQMI 0S783IH13F8ITcVhEq9K1UwM2IIQ9YcWKewAaylu/QorYmwhdpfzuST+ies0o8ApJPSs 7KwLkc1cEKkIbk6vWgdR32VSpTw/me1gbFZUro29todkpauiaKpkUCOxlycFC8gq68/G SKcaJpPjhhKYsfYXM0p7s/8Zi38Lg/n8D3Uy6zhCEr4H909CwWHp5hXdkR15Rzpozn4k nAjw== X-Gm-Message-State: AKS2vOw1dNsOI/b51mRzOJBiJFo2zbLB44w0GbsAAfxjVwZGsgYmUfSH 9Yk60L0DE1mTnNrt X-Received: by 10.55.152.198 with SMTP id a189mr8803749qke.63.1497564624806; Thu, 15 Jun 2017 15:10:24 -0700 (PDT) Received: from ?IPv6:2804:14c:480:1279::1006? ([2804:14c:480:1279::1006]) by smtp.googlemail.com with ESMTPSA id o49sm364521qta.34.2017.06.15.15.10.20 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 15 Jun 2017 15:10:24 -0700 (PDT) To: GNU C Library , Christoph Hellwig Cc: Stephen Bates , "linux-block@vger.kernel.org" , Christoph Hellwig , "jonathan.derrick@intel.com" , Jens Axboe From: Adhemerval Zanella Subject: RFC: pwritev2 regression test for invalid flags Message-ID: Date: Thu, 15 Jun 2017 19:10:18 -0300 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.1.1 MIME-Version: 1.0 Content-Language: en-GB Sender: linux-block-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-block@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP After the issue with LO_HI_LONG definition on x86_64-linux-gnu, I planed to add this patch to check the above patch for correct check for invalid flags (which would also have show this issue with LO_HI_LONG being used on p{read,write}v2). However it seems to trigger what I think it is a kernel bug on version that provides p{read,write}v, where preadv2 does fails with EOPNOTSUPP but pwritev2 does not. For instance, on x86_64-linux-gnu-x32 and i686-linux-gnu (4.10.0-21-generic/x86_64): [...] [pid 1027] preadv2(3, 0xff96d3d0, 1, 0, 0x8 /* RWF_??? */) = -1 EOPNOTSUPP (Operation not supported) [pid 1027] pwritev2(3, [{"\0\360bVl\206\4\10\0\0\0\0Z=l\367t\372\226\377\214\362`\367\f\0\0\0\0\320\4\10", 32}], 1, 0, 0x8 /* RWF_??? */) = 32 [...] And on sparcv9-linux-gnu (4.12.0-rc1-sparc64-smp): [...] [pid 139846] preadv2(3, [{iov_base=0xffefcd88, iov_len=32}], 1, 0, 0x8 /* RWF_??? */) = -1 EOPNOTSUPP (Operation not supported) [pid 139846] pwritev2(3, [{iov_base="\377\357\315\300p\1f\314\0\0\0\0\0\0\0\2p\3@\10\0\2B\260p\3+\330\0\1\21\220", iov_len=32}], 1, 0, 0x8 /* RWF_??? */) = 32 [...] For both on 64 bits syscalls works as intended. For instance on x86-64 aforementioned kernel: [...] [pid 24276] preadv2(3, 0x7ffd084c1ee0, 1, 0, 0x8 /* RWF_??? */) = -1 EOPNOTSUPP (Operation not supported) [pid 24276] pwritev2(3, [{"\0\0\0\0\0\0\0\0!`\331\311\304\177\0\0\220\37L\10\375\177\0\0\0\0\0\0\0\0\0\0", 32}], 1, 0, 0x8 /* RWF_??? */) = -1 EOPNOTSUPP (Operation not supported) [...] I haven't tested on newer kernels or on different architectures (these are the ones I have readily available). Any idea why kernel ignores invalid flags for pwritev2 on compatibility mode? Does it invalidate the testcase? PS: I am copying the ones on the original pwritev2/preadv2 email about the status of the syscall on glibc [1]. [1] https://sourceware.org/ml/libc-alpha/2017-04/msg00452.html diff --git a/misc/tst-preadvwritev2-common.c b/misc/tst-preadvwritev2-common.c new file mode 100644 index 0000000000..a8073e6894 --- /dev/null +++ b/misc/tst-preadvwritev2-common.c @@ -0,0 +1,46 @@ +/* Common function for preadv2 and pwritev2 tests. + Copyright (C) 2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#include + +static void +do_test_with_invalid_flags (void) +{ + int invalid_flag = 0x1; +#ifdef RWF_HIPRI + invalid_flag <<= 1; +#endif +#ifdef RWF_DSYNC + invalid_flag <<= 1; +#endif +#ifdef RWF_SYNC + invalid_flag <<= 1; +#endif + + char buf[32]; + const struct iovec vec = { .iov_base = buf, .iov_len = sizeof (buf) }; + if (preadv2 (temp_fd, &vec, 1, 0, invalid_flag) != -1) + FAIL_EXIT1 ("preadv2 did not fail with an invalid flag"); + if (errno != ENOTSUP) + FAIL_EXIT1 ("preadv2 failure did not set errno to ENOTSUP (%d)", errno); + + if (pwritev2 (temp_fd, &vec, 1, 0, invalid_flag) != -1) + FAIL_EXIT1 ("pwritev2 did not fail with an invalid flag"); + if (errno != ENOTSUP) + FAIL_EXIT1 ("pwritev2 failure did not set errno to ENOTSUP (%d)", errno); +} diff --git a/misc/tst-preadvwritev2.c b/misc/tst-preadvwritev2.c index cf36272dd3..682c7579da 100644 --- a/misc/tst-preadvwritev2.c +++ b/misc/tst-preadvwritev2.c @@ -23,9 +23,12 @@ pwritev2 (__fd, __iov, __iovcnt, __offset, 0) #include "tst-preadvwritev-common.c" +#include "tst-preadvwritev2-common.c" static int do_test (void) { + do_test_with_invalid_flags (); + return do_test_with_offset (0); } diff --git a/misc/tst-preadvwritev64v2.c b/misc/tst-preadvwritev64v2.c index 8d0c48ea78..9ddc7625f0 100644 --- a/misc/tst-preadvwritev64v2.c +++ b/misc/tst-preadvwritev64v2.c @@ -25,9 +25,12 @@ pwritev2 (__fd, __iov, __iovcnt, __offset, 0) #include "tst-preadvwritev-common.c" +#include "tst-preadvwritev2-common.c" static int do_test (void) { + do_test_with_invalid_flags (); + return do_test_with_offset (0); }