From patchwork Tue Aug 23 20:01:59 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ilya Dryomov X-Patchwork-Id: 1089742 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by demeter1.kernel.org (8.14.4/8.14.4) with ESMTP id p7NK2ks2007043 for ; Tue, 23 Aug 2011 20:03:06 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756136Ab1HWUCw (ORCPT ); Tue, 23 Aug 2011 16:02:52 -0400 Received: from mail-bw0-f46.google.com ([209.85.214.46]:56659 "EHLO mail-bw0-f46.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1756133Ab1HWUCv (ORCPT ); Tue, 23 Aug 2011 16:02:51 -0400 Received: by mail-bw0-f46.google.com with SMTP id 11so372435bke.19 for ; Tue, 23 Aug 2011 13:02:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=from:to:cc:subject:date:message-id:x-mailer:in-reply-to:references; bh=ER4fg1rozY8DsqU+n6QO0eixLJ9sRO8jlq8GJVmascg=; b=AIhQIzdJHJsJUtgffwjJWovtA4PCuf/bIbrmwXWZz5oYxrSC7CEIaE1LsLVWE/d1b/ ldKbzen8Dygsl1TDgvjGayqYzIORtFt8jNbu6G8mbwRPWKzeDBReyMf7l9R/sGA8oefT 9v8SLEOQ1a/n7Ehdy6kkh8kfZCest9MnVJYVA= Received: by 10.204.134.140 with SMTP id j12mr1819212bkt.53.1314129771100; Tue, 23 Aug 2011 13:02:51 -0700 (PDT) Received: from localhost ([31.28.235.172]) by mx.google.com with ESMTPS id v1sm83388bkd.22.2011.08.23.13.02.49 (version=TLSv1/SSLv3 cipher=OTHER); Tue, 23 Aug 2011 13:02:50 -0700 (PDT) From: Ilya Dryomov To: linux-btrfs@vger.kernel.org Cc: Chris Mason , Hugo Mills , idryomov@gmail.com Subject: [PATCH 18/21] Btrfs: allow for resuming restriper after it was paused Date: Tue, 23 Aug 2011 23:01:59 +0300 Message-Id: <1314129722-31601-19-git-send-email-idryomov@gmail.com> X-Mailer: git-send-email 1.7.5.4 In-Reply-To: <1314129722-31601-1-git-send-email-idryomov@gmail.com> References: <1314129722-31601-1-git-send-email-idryomov@gmail.com> Sender: linux-btrfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org X-Greylist: IP, sender and recipient auto-whitelisted, not delayed by milter-greylist-4.2.6 (demeter1.kernel.org [140.211.167.41]); Tue, 23 Aug 2011 20:03:06 +0000 (UTC) Implement an ioctl for resuming restriper. We use the same heuristics used when recovering restripe after a crash to try to start where we left off last time. If needed those parameters can be made configurable through the userspace "resume" command in future. Signed-off-by: Ilya Dryomov --- fs/btrfs/ioctl.c | 2 ++ fs/btrfs/ioctl.h | 1 + fs/btrfs/volumes.c | 25 +++++++++++++++++++++++++ fs/btrfs/volumes.h | 1 + 4 files changed, 29 insertions(+), 0 deletions(-) diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c index 61978ac..cb2f420 100644 --- a/fs/btrfs/ioctl.c +++ b/fs/btrfs/ioctl.c @@ -2923,6 +2923,8 @@ static long btrfs_ioctl_restripe_ctl(struct btrfs_root *root, return btrfs_cancel_restripe(root->fs_info); case BTRFS_RESTRIPE_CTL_PAUSE: return btrfs_pause_restripe(root->fs_info, 0); + case BTRFS_RESTRIPE_CTL_RESUME: + return btrfs_resume_restripe(root->fs_info); } return -EINVAL; diff --git a/fs/btrfs/ioctl.h b/fs/btrfs/ioctl.h index e468d5b..365d06c 100644 --- a/fs/btrfs/ioctl.h +++ b/fs/btrfs/ioctl.h @@ -111,6 +111,7 @@ struct btrfs_ioctl_fs_info_args { #define BTRFS_RESTRIPE_CTL_CANCEL 1 #define BTRFS_RESTRIPE_CTL_PAUSE 2 +#define BTRFS_RESTRIPE_CTL_RESUME 3 struct btrfs_restripe_args { __u64 profiles; diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c index 65deaa7..bfe2b03 100644 --- a/fs/btrfs/volumes.c +++ b/fs/btrfs/volumes.c @@ -2898,6 +2898,31 @@ out: return ret; } +int btrfs_resume_restripe(struct btrfs_fs_info *fs_info) +{ + int ret; + + if (fs_info->sb->s_flags & MS_RDONLY) + return -EROFS; + + mutex_lock(&fs_info->restripe_mutex); + if (!fs_info->restripe_ctl) { + ret = -ENOTCONN; + goto out; + } + + if (test_bit(RESTRIPE_RUNNING, &fs_info->restripe_state)) { + ret = -EINPROGRESS; + goto out; + } + + ret = btrfs_restripe(fs_info->restripe_ctl, 1); + +out: + mutex_unlock(&fs_info->restripe_mutex); + return ret; +} + /* * shrinking a device means finding all of the device extents past * the new size, and then following the back refs to the chunks. diff --git a/fs/btrfs/volumes.h b/fs/btrfs/volumes.h index b8c234a..c0652c9 100644 --- a/fs/btrfs/volumes.h +++ b/fs/btrfs/volumes.h @@ -263,6 +263,7 @@ int btrfs_restripe(struct restripe_control *rctl, int resume); int btrfs_recover_restripe(struct btrfs_root *tree_root); int btrfs_cancel_restripe(struct btrfs_fs_info *fs_info); int btrfs_pause_restripe(struct btrfs_fs_info *fs_info, int unset); +int btrfs_resume_restripe(struct btrfs_fs_info *fs_info); int btrfs_chunk_readonly(struct btrfs_root *root, u64 chunk_offset); int find_free_dev_extent(struct btrfs_trans_handle *trans, struct btrfs_device *device, u64 num_bytes,