From patchwork Sat Aug 24 14:41:07 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Eryu Guan X-Patchwork-Id: 11113011 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 07F7514DB for ; Sat, 24 Aug 2019 14:41:53 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id CA02623400 for ; Sat, 24 Aug 2019 14:41:52 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="kJESAIug" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727651AbfHXOlw (ORCPT ); Sat, 24 Aug 2019 10:41:52 -0400 Received: from mail-pf1-f196.google.com ([209.85.210.196]:43636 "EHLO mail-pf1-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727604AbfHXOlv (ORCPT ); Sat, 24 Aug 2019 10:41:51 -0400 Received: by mail-pf1-f196.google.com with SMTP id v12so8644254pfn.10 for ; Sat, 24 Aug 2019 07:41:51 -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:mime-version :content-transfer-encoding; bh=LTMIMeA+PEmTbChiL3vOmsy/oQmEesBAQr0V+r2+r9c=; b=kJESAIugtQuGZz8n0NlVtkHcXuFl7cCKNsinsukHfYuFpcL9+OKXbZFArITluPNIoA G+pW2or/c2vDgKNny9qnyVwkiL6vuW8Uoo2VkiWm+AXjr9IJhDorlOpLpydVjUDEcowB csNzipE+C06cH8geUk+KpdN/zX8bQnNNmDf8kC18o8opuZGLfA4NMtHMtrgWgq9O+nfc eB0sOaOGuxYvJgKlGerMzNpRhKw7bWs6nDCb4R1MzDYnu/Eyw1ctfHrQR006X0Ugafcl kRcD+kCuiPYF17skjzOe15T3DQL2aPGRuUmaaqXH/oOmIofrh5Us5XOK+nUHyvWGoqxB Yovg== 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:mime-version :content-transfer-encoding; bh=LTMIMeA+PEmTbChiL3vOmsy/oQmEesBAQr0V+r2+r9c=; b=JIlj5fz+StT/6Antd2SioE5I47dMUQC+Qf9IbnBjk3GF3T1Kzt1nnP3bHLMOKW+PfZ ivC9Z+l5ONSYNb0ypd4zje3oPb+uLb/nnKyXkNusn/mi97TyEQ+w/KT5oz/ZdZf8Qu2c tVqiFtDQEzHrTXTwIIDRFvWCdDC+8EKbG3eb8kGwlkYI7SHvjkGwZznLf71kx0bea2zS 6Y9WtFLEz/U6r/EtmJ4Qd7h7ZFzXQt04fZ59FmIzlK6sdWkGGQ+HY9nUSJ5T6/A9y/hv dxxPoo6LsKLo6SQs4kuQWcAo43c+EMfDFbK81MuOg60szVhKQ4aKA2ZPX+el20UfhJnA 1PBA== X-Gm-Message-State: APjAAAW+xcI0jUeeSu7IUfPBgxRs+ZN+CUVVIeagsC3kkbbtuEGd2YJj /1qR74x+4s86P/NkY0vvtcZ/St0pqFo= X-Google-Smtp-Source: APXvYqxu9MWYJYZgzOukNH6YhtcCSKOmqSJGWeys/jLZOciuofCSPO1T3rNOPqkEi7n3fOmBAMLH8Q== X-Received: by 2002:a62:8688:: with SMTP id x130mr11492757pfd.162.1566657710909; Sat, 24 Aug 2019 07:41:50 -0700 (PDT) Received: from localhost ([178.128.102.47]) by smtp.gmail.com with ESMTPSA id t9sm7340895pgj.89.2019.08.24.07.41.47 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 24 Aug 2019 07:41:49 -0700 (PDT) From: Eryu Guan To: fstests@vger.kernel.org Cc: Eryu Guan Subject: [PATCH v2] ltp/fsx: avoid infinite loop while finding offset2 in clone/dedupe/copy range ops Date: Sat, 24 Aug 2019 22:41:07 +0800 Message-Id: <20190824144107.27748-1-guaneryu@gmail.com> X-Mailer: git-send-email 2.21.0 MIME-Version: 1.0 Sender: fstests-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: fstests@vger.kernel.org From: Eryu Guan In CLONE/DEDUPE/COPY RANGE operations, we pick a "offset" and "size" first, then find a suitable "offset2" by looping if there's overlap (|offset2-offset| < size) or final file size is greater than max file size (offset2 + size > maxfilelen). But it's possible that there's no such suitable offset2 and we loop forever. e.g. block_size = 4096, offset = 0, size = 4096 and maxfilelen is a value smaller than 8212 (which could be set via '-l' option). Fix it by making sure maxfilelen/file_size is big enough to hold 'size' bytes from 'offset2', and just skip this operation if not. Signed-off-by: Eryu Guan --- v2: - don't use macro with ugly hacks, use an inline function instead ltp/fsx.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/ltp/fsx.c b/ltp/fsx.c index 06d08e4e93f3..890666ab6140 100644 --- a/ltp/fsx.c +++ b/ltp/fsx.c @@ -1911,6 +1911,15 @@ fail: return 0; } +/* Check if range operations are possible to find a suitable offset */ +static inline bool check_range(unsigned long op, unsigned long off, + unsigned long len, unsigned long size) +{ + bool ret = ((off + len * 2) <= size); + if (!ret) + log5(op, off, len, -1, FL_SKIPPED); + return ret; +} int test(void) @@ -1989,6 +1998,8 @@ test(void) TRIM_OFF_LEN(offset, size, file_size); offset = offset & ~(block_size - 1); size = size & ~(block_size - 1); + if (!check_range(op, offset, size, maxfilelen)) + goto out; do { offset2 = random(); TRIM_OFF(offset2, maxfilelen); @@ -2003,6 +2014,8 @@ test(void) TRIM_OFF_LEN(offset, size, file_size); offset = offset & ~(block_size - 1); size = size & ~(block_size - 1); + if (!check_range(op, offset, size, file_size)) + goto out; do { if (tries++ >= 30) { size = 0; @@ -2020,6 +2033,8 @@ test(void) offset -= offset % readbdy; if (o_direct) size -= size % readbdy; + if (!check_range(op, offset, size, maxfilelen)) + goto out; do { offset2 = random(); TRIM_OFF(offset2, maxfilelen);