From patchwork Thu Sep 7 07:26:38 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Amir Goldstein X-Patchwork-Id: 9941675 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 C86586038C for ; Thu, 7 Sep 2017 07:26:18 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id BADB42847D for ; Thu, 7 Sep 2017 07:26:18 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id AFC9528534; Thu, 7 Sep 2017 07:26:18 +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=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 3F4822847D for ; Thu, 7 Sep 2017 07:26:18 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753908AbdIGH0R (ORCPT ); Thu, 7 Sep 2017 03:26:17 -0400 Received: from mail-wm0-f66.google.com ([74.125.82.66]:33258 "EHLO mail-wm0-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753062AbdIGH0R (ORCPT ); Thu, 7 Sep 2017 03:26:17 -0400 Received: by mail-wm0-f66.google.com with SMTP id 187so775353wmn.0 for ; Thu, 07 Sep 2017 00:26:16 -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=ZUZGpHS5d/wvy/A/8Tyc78ZCtYWo+Sgb+VykcKsqIp0=; b=Bs4gg+0nzBLo4oujjwaFPntdMBYFsTDWO7d6R/Y0evkEhKiDdI/c6DqGkAZVtteS3G rhuXItR/V/yNNZkUCAqJCYdJlTGGo9A4RRQR5ycNFQuOhbq2M7XcWAmvCWQ+pF5ocWbk EOERYw0PDR42a0WgBqVpOABJo6cwccrPnw2dME5EH347nTVcKg9JPg77ToS9MaGY+by2 OQJD/Vqa96aiFo4Yn65ImB9IZhOqcgE0dgtGuTltpwbL2p5M8k5CJ4DmMZBtTzTGaHhA xY/ztQxiX/S/flT7TKfWMHBfM5KKz/4ERqQC4pd1yVzvuZLRmhNba1kB2DkWmeGPgES/ 7cAQ== 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=ZUZGpHS5d/wvy/A/8Tyc78ZCtYWo+Sgb+VykcKsqIp0=; b=jgfu3oxdUwPY1MEh/RAdWVEZzaUfOy/SeVNxJZhw+bxKYNVTnzi0jA+zPj9xb5MPIp JdVr4p5b+4G4QBOurobqy3cJAv142zTXyNXQDFIEI7EFcjA2/blqlX9nht1eqDoLpTOk 4z/7sPGNW/txKH4uMg5a76tU1VBD/IEPb07FSVNx3bXl/0nPJiEmiufB0K7eWBfydO/5 3dq6SsHbLa8EVXWXnacHM95cDW5OVZHD83NZHP7T6LL4/hS/GzO3RQxVNWdwp5FXahel eK3X3jozX3GqB74XjGy5DN6qZdJIudftSK43XbKFUbvFshrFPpykPwezd3LkJAhmo8RN 28Hw== X-Gm-Message-State: AHPjjUihhp68fhictHmpALeLL4j3OwuM1P6yFCtbAxACFwb45ljmDqg6 HxyWKaa5ibrahQ== X-Google-Smtp-Source: ADKCNb408Z6hTGeOsfxELOmqU6cssVs2ql1gZVMaGBJnFwwNjTfyiAFTCAp4+syJQTyfv+V+fL+O2Q== X-Received: by 10.28.94.85 with SMTP id s82mr1364900wmb.13.1504769176006; Thu, 07 Sep 2017 00:26:16 -0700 (PDT) Received: from localhost.localdomain (bzq-166-168-31-246.red.bezeqint.net. [31.168.166.246]) by smtp.gmail.com with ESMTPSA id 61sm1394452wre.44.2017.09.07.00.26.14 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Thu, 07 Sep 2017 00:26:15 -0700 (PDT) From: Amir Goldstein To: Eryu Guan Cc: fstests@vger.kernel.org Subject: [PATCH v4 5/5] fsx: add support for keeping existing file Date: Thu, 7 Sep 2017 10:26:38 +0300 Message-Id: <1504769198-4921-6-git-send-email-amir73il@gmail.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1504769198-4921-1-git-send-email-amir73il@gmail.com> References: <1504769198-4921-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 fsx -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 fd00962..5cd599d 100644 --- a/ltp/fsx.c +++ b/ltp/fsx.c @@ -628,17 +628,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); @@ -1635,7 +1636,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\ @@ -1643,6 +1644,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 debug log messsages 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\ @@ -1833,7 +1835,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 " @@ -1841,7 +1843,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); } @@ -1865,6 +1867,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; @@ -1878,7 +1881,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) exit(101); } 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); + prt("file_size is %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);