From patchwork Tue Jul 29 01:55:09 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Justin Maggard X-Patchwork-Id: 4638041 Return-Path: X-Original-To: patchwork-linux-btrfs@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork1.web.kernel.org (Postfix) with ESMTP id D57F29F36A for ; Tue, 29 Jul 2014 01:55:25 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 0DCC820035 for ; Tue, 29 Jul 2014 01:55:25 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 3E82E20145 for ; Tue, 29 Jul 2014 01:55:24 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752328AbaG2BzV (ORCPT ); Mon, 28 Jul 2014 21:55:21 -0400 Received: from mail-pd0-f169.google.com ([209.85.192.169]:50145 "EHLO mail-pd0-f169.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751952AbaG2BzU (ORCPT ); Mon, 28 Jul 2014 21:55:20 -0400 Received: by mail-pd0-f169.google.com with SMTP id y10so10898070pdj.28 for ; Mon, 28 Jul 2014 18:55:20 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id; bh=YTwlt5gjSBee0erFD3Mc3eVKl8TIVV4v86TltOWUnBo=; b=t9zChy0psVVSewB670h82cb188RtEc0KtuDGVTqN4QeLmaYtZ4YIpHk6j3g8b3LRfb zw4SQYNy59/0kp71oJ7Lum5uN9rlsjU3qLjiCPEAcxSllpAl3wu929BFFy6OCyMfKnlS jNTR3TFZjde48LuASJl/0Re0dGlZoOcK6Yw1TEIldoeeTRk8zrJ67iq/5uBl9MeC8dME /Ipv36GFzBb1vggzHCwZBuUYrVIN2yg7YYX7v3+u3f4GZEh0R7m0D3xkb5mxqDPgBuLK 9098vl+5eW0TUrRriadeAjoWERI7hecjW2Cew7amk5TnTHDe++ZKDpEtd/qNWeGOQ+E6 Bcqw== X-Received: by 10.68.95.225 with SMTP id dn1mr7935010pbb.126.1406598920276; Mon, 28 Jul 2014 18:55:20 -0700 (PDT) Received: from jmaggard-ThinkPad-W520.infrant-6.com ([209.249.181.1]) by mx.google.com with ESMTPSA id am2sm19034446pbc.59.2014.07.28.18.55.17 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 28 Jul 2014 18:55:18 -0700 (PDT) From: Justin Maggard To: linux-btrfs@vger.kernel.org Cc: Justin Maggard Subject: [PATCH v2] btrfs-progs: add always option to restore's looping prompt Date: Mon, 28 Jul 2014 18:55:09 -0700 Message-Id: <1406598909-9658-1-git-send-email-jmaggard10@gmail.com> X-Mailer: git-send-email 1.9.1 Sender: linux-btrfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org X-Spam-Status: No, score=-7.5 required=5.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED, FREEMAIL_FROM, RCVD_IN_DNSWL_HI, RP_MATCHES_RCVD, T_DKIM_INVALID, UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP If you are using btrfs restore to try to recover a very large or fragmented file, you may encounter _lots_ of prompts requiring you to press 'y' to continue because we are looping a lot. Add the option to press 'a', to supress these prompts for the rest of the file. Signed-off-by: Justin Maggard Reviewed-by: Qu Wenruo --- cmds-restore.c | 31 ++++++++++++++++++++++--------- 1 file changed, 22 insertions(+), 9 deletions(-) diff --git a/cmds-restore.c b/cmds-restore.c index 3465f84..059194d 100644 --- a/cmds-restore.c +++ b/cmds-restore.c @@ -410,23 +410,31 @@ out: return ret; } -static int ask_to_continue(const char *file) +enum loop_response { + LOOP_STOP, + LOOP_CONTINUE, + LOOP_DONTASK +}; + +static enum loop_response ask_to_continue(const char *file) { char buf[2]; char *ret; printf("We seem to be looping a lot on %s, do you want to keep going " - "on ? (y/N): ", file); + "on ? (y/N/a): ", file); again: ret = fgets(buf, 2, stdin); if (*ret == '\n' || tolower(*ret) == 'n') - return 1; + return LOOP_STOP; + if (tolower(*ret) == 'a') + return LOOP_DONTASK; if (tolower(*ret) != 'y') { - printf("Please enter either 'y' or 'n': "); + printf("Please enter one of 'y', 'n', or 'a': "); goto again; } - return 0; + return LOOP_CONTINUE; } @@ -594,11 +602,16 @@ static int copy_file(struct btrfs_root *root, int fd, struct btrfs_key *key, } while (1) { - if (loops++ >= 1024) { - ret = ask_to_continue(file); - if (ret) + if (loops >= 0 && loops++ >= 1024) { + enum loop_response resp; + + resp = ask_to_continue(file); + if (resp == LOOP_STOP) break; - loops = 0; + else if (resp == LOOP_CONTINUE) + loops = 0; + else if (resp == LOOP_DONTASK) + loops = -1; } if (path->slots[0] >= btrfs_header_nritems(leaf)) { do {