From patchwork Tue Sep 5 19:11:12 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Amir Goldstein X-Patchwork-Id: 9939523 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 395F3604D4 for ; Tue, 5 Sep 2017 19:11:06 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 2A5A6289EB for ; Tue, 5 Sep 2017 19:11:06 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 1F694289FE; Tue, 5 Sep 2017 19:11:06 +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=-6.3 required=2.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED, FREEMAIL_FROM, RCVD_IN_DNSWL_HI, RCVD_IN_SORBS_SPAM, T_DKIM_INVALID autolearn=unavailable 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 AC487289F2 for ; Tue, 5 Sep 2017 19:11:05 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752474AbdIETLD (ORCPT ); Tue, 5 Sep 2017 15:11:03 -0400 Received: from mail-wm0-f67.google.com ([74.125.82.67]:34240 "EHLO mail-wm0-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751959AbdIETK6 (ORCPT ); Tue, 5 Sep 2017 15:10:58 -0400 Received: by mail-wm0-f67.google.com with SMTP id l19so696459wmi.1; Tue, 05 Sep 2017 12:10:57 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=gQzd/oZDaoxD176dZKLCCRobNlX/X1gEZVtFrjhcfuk=; b=OpwnNkhVNhKrytPSXdJxbPKbURgqa8L43a4KHoCNoDsyRZ70uaeFcB9KOEGEoqTfOQ Cx9sU+Cc1DRaH8tNKdh3MZGZAvMJ/upUVC1CK2MmD/4yzzNYPaKGJfoPU1Kz+ggcrVJd BY4lxvbLDPguQ4Uhoh7O0JB7O3Lu9+AFAV4dXmySWQPnXh625gCfa5sgkvYweRi25y54 uwPqhW7xDFKJq/j+fpxpwgglG6qMhkSVqiHZOtRvQ/wu40R0PIKJjoaaWtXbysMmZZVN R/+O4nzdSPpAZ1fFESMVjOViU+2MGZaRfKOY5eZDMiL1TvpnBo/1P5QabR70SPSVko+c hQSg== 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; bh=gQzd/oZDaoxD176dZKLCCRobNlX/X1gEZVtFrjhcfuk=; b=ipmiY6S8S6bthUnd8/KSAMejjkhHSp7G2IaBHvacmGBssJfjHMi7UM90p44X4W+dB0 +HNyP16GKQrSZiYODa8/ZInEZkgoy6lVssQtTqEccRp15pFKgNxgGYcJLJYXvcmec/oQ z4Ju/cMuCVyZdIh0v339Oo5njAm42gt6MA9K/1kVkxD+bEMuYSn++lvwyykT0C0J0wyt P8KafRo2EI7j7qhcVP5LD2kkBomPblmRNprQZ1VLHrosHv2L4YkDCjO+Vs9Zo92cVwfp cBoxzcmtkXQQ3X3TxdxBeiukQMvsHxoNvCTDiMKRisJNzwISMUD1cr1FwELJ2x9yRatb 5eQw== X-Gm-Message-State: AHPjjUg7ZVUdr8LNFluYpBuRRSXZD0z93MMCsO7BWiiMT/i1WV5godsc ZXGqgZeqX1fNPg== X-Google-Smtp-Source: ADKCNb4DvdlCkS6PPZ8gbJn2BPnCZ+VciSXZ6sbdSKuQPTMxJ/jblhsSGaJCiF/Mt67nHruC+qhxWw== X-Received: by 10.28.59.133 with SMTP id i127mr20615wma.154.1504638657284; Tue, 05 Sep 2017 12:10:57 -0700 (PDT) Received: from localhost.localdomain (bzq-79-182-137-119.red.bezeqint.net. [79.182.137.119]) by smtp.gmail.com with ESMTPSA id 30sm1829015wry.34.2017.09.05.12.10.55 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 05 Sep 2017 12:10:56 -0700 (PDT) From: Amir Goldstein To: Eryu Guan Cc: Josef Bacik , fstests@vger.kernel.org, linux-fsdevel@vger.kernel.org Subject: [PATCH v3 05/13] fsx: add support for keeping existing file Date: Tue, 5 Sep 2017 22:11:12 +0300 Message-Id: <1504638680-25682-6-git-send-email-amir73il@gmail.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1504638680-25682-1-git-send-email-amir73il@gmail.com> References: <1504638680-25682-1-git-send-email-amir73il@gmail.com> Sender: fstests-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: fstests@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP With fsxk -k, do not truncate existing file and use its size as upper bound on file size. This is needed to prevent fsx from truncating the file on start of test when testing fsx on cloned files. Signed-off-by: Amir Goldstein --- ltp/fsx.c | 49 ++++++++++++++++++++++++++++++++++++------------- 1 file changed, 36 insertions(+), 13 deletions(-) diff --git a/ltp/fsx.c b/ltp/fsx.c index 3510ace..7a34577 100644 --- a/ltp/fsx.c +++ b/ltp/fsx.c @@ -629,17 +629,18 @@ void check_trunc_hack(void) { struct stat statbuf; + off_t offset = file_size + (off_t)100000; - if (ftruncate(fd, (off_t)0)) + if (ftruncate(fd, file_size)) goto ftruncate_err; - if (ftruncate(fd, (off_t)100000)) + if (ftruncate(fd, offset)) goto ftruncate_err; fstat(fd, &statbuf); - if (statbuf.st_size != (off_t)100000) { + if (statbuf.st_size != offset) { prt("no extend on truncate! not posix!\n"); exit(130); } - if (ftruncate(fd, 0)) { + if (ftruncate(fd, file_size)) { ftruncate_err: prterr("check_trunc_hack: ftruncate"); exit(131); @@ -1636,7 +1637,7 @@ void usage(void) { fprintf(stdout, "usage: %s", - "fsx [-dnqxAFLOWZ] [-b opnum] [-c Prob] [-g filldata] [-i logdev] [-j logid] [-l flen] [-m start:end] [-o oplen] [-p progressinterval] [-r readbdy] [-s style] [-t truncbdy] [-w writebdy] [-D startingop] [-N numops] [-P dirpath] [-S seed] fname\n\ + "fsx [-dknqxAFLOWZ] [-b opnum] [-c Prob] [-g filldata] [-i logdev] [-j logid] [-l flen] [-m start:end] [-o oplen] [-p progressinterval] [-r readbdy] [-s style] [-t truncbdy] [-w writebdy] [-D startingop] [-N numops] [-P dirpath] [-S seed] fname\n\ -b opnum: beginning operation number (default 1)\n\ -c P: 1 in P chance of file close+open at each op (default infinity)\n\ -d: debug output for all operations\n\ @@ -1644,6 +1645,7 @@ usage(void) -g X: write character X instead of random generated data\n\ -i logdev: do integrity testing, logdev is the dm log writes device\n\ -j logid: prefix logs with this id\n\ + -k: do not truncate existing file and use its size as upper bound on file size\n\ -l flen: the upper bound on file size (default 262144)\n\ -m startop:endop: monitor (print debug output) specified byte range (default 0:infinity)\n\ -n: no verifications of file size\n\ @@ -1834,7 +1836,7 @@ __test_fallocate(int mode, const char *mode_str) #ifdef HAVE_LINUX_FALLOC_H int ret = 0; if (!lite) { - if (fallocate(fd, mode, 0, 1) && errno == EOPNOTSUPP) { + if (fallocate(fd, mode, file_size, 1) && errno == EOPNOTSUPP) { if(!quiet) fprintf(stderr, "main: filesystem does not support " @@ -1842,7 +1844,7 @@ __test_fallocate(int mode, const char *mode_str) mode_str); } else { ret = 1; - if (ftruncate(fd, 0)) { + if (ftruncate(fd, file_size)) { warn("main: ftruncate"); exit(132); } @@ -1866,6 +1868,7 @@ main(int argc, char **argv) char goodfile[1024]; char logfile[1024]; struct stat statbuf; + int o_flags = O_RDWR|O_CREAT|O_TRUNC; goodfile[0] = 0; logfile[0] = 0; @@ -1879,7 +1882,7 @@ main(int argc, char **argv) setvbuf(stdout, (char *)0, _IOLBF, 0); /* line buffered stdout */ while ((ch = getopt_long(argc, argv, - "b:c:dfg:i:j:l:m:no:p:qr:s:t:w:xyAD:FKHzCILN:OP:RS:WZ", + "b:c:dfg:i:j:kl:m:no:p:qr:s:t:w:xyAD:FKHzCILN:OP:RS:WZ", longopts, NULL)) != EOF) switch (ch) { case 'b': @@ -1920,6 +1923,9 @@ main(int argc, char **argv) case 'j': logid = getnum(optarg, &endp); break; + case 'k': + o_flags &= ~O_TRUNC; + break; case 'l': maxfilelen = getnum(optarg, &endp); if (maxfilelen <= 0) @@ -2007,6 +2013,7 @@ main(int argc, char **argv) break; case 'L': lite = 1; + o_flags &= ~(O_CREAT|O_TRUNC); break; case 'N': numops = getnum(optarg, &endp); @@ -2046,6 +2053,7 @@ main(int argc, char **argv) break; case 'Z': o_direct = O_DIRECT; + o_flags |= O_DIRECT; break; case 255: /* --record-ops */ if (optarg) @@ -2089,8 +2097,7 @@ main(int argc, char **argv) signal(SIGUSR2, cleanup); srandom(seed); - fd = open(fname, - O_RDWR|(lite ? 0 : O_CREAT|O_TRUNC)|o_direct, 0666); + fd = open(fname, o_flags, 0666); if (fd < 0) { prterr(fname); exit(91); @@ -2150,9 +2157,10 @@ main(int argc, char **argv) aio_setup(); #endif - if (lite) { + if (!(o_flags & O_TRUNC)) { off_t ret; - file_size = maxfilelen = lseek(fd, (off_t)0, SEEK_END); + file_size = maxfilelen = biggest = lseek(fd, (off_t)0, SEEK_END); + printf("file_size=%lu\n", file_size); if (file_size == (off_t)-1) { prterr(fname); warn("main: lseek eof"); @@ -2189,8 +2197,23 @@ main(int argc, char **argv) maxfilelen); exit(98); } - } else + } else { + ssize_t ret, len = file_size; + off_t off = 0; + + while (len > 0) { + ret = read(fd, good_buf + off, len); + if (ret == -1) { + prterr(fname); + warn("main: error on read"); + exit(98); + } + len -= ret; + off += ret; + } + check_trunc_hack(); + } if (fallocate_calls) fallocate_calls = test_fallocate(0);