From patchwork Tue Aug 23 20:01:49 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ilya Dryomov X-Patchwork-Id: 1089642 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 p7NK2Pc7006874 for ; Tue, 23 Aug 2011 20:02:25 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756079Ab1HWUCW (ORCPT ); Tue, 23 Aug 2011 16:02:22 -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 S1756054Ab1HWUCU (ORCPT ); Tue, 23 Aug 2011 16:02:20 -0400 Received: by mail-bw0-f46.google.com with SMTP id 11so372435bke.19 for ; Tue, 23 Aug 2011 13:02:20 -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=yTRpM0/vtz83DXJfIXw3IbYxs4eFlvJAUO7e8ylo1I0=; b=PhIMX0tePfXOPr02gH5y5IV7tX78Ao4otDA4Q3AekbdLKp07URN118kiAzuEOhSEnp L8+phAe0G8C85nWUy+BGykXtmoTqz+hkdFNcxFvIiCOYsLV2/s8pecyDViG752OlrYA+ vPitW4pFqNTzqxHCamrv5ZuXv/WFVPoDwBP0c= Received: by 10.204.153.27 with SMTP id i27mr1833123bkw.323.1314129740143; Tue, 23 Aug 2011 13:02:20 -0700 (PDT) Received: from localhost ([31.28.235.172]) by mx.google.com with ESMTPS id v1sm83291bkd.22.2011.08.23.13.02.18 (version=TLSv1/SSLv3 cipher=OTHER); Tue, 23 Aug 2011 13:02:19 -0700 (PDT) From: Ilya Dryomov To: linux-btrfs@vger.kernel.org Cc: Chris Mason , Hugo Mills , idryomov@gmail.com Subject: [PATCH 08/21] Btrfs: soft profile changing mode (aka soft convert) Date: Tue, 23 Aug 2011 23:01:49 +0300 Message-Id: <1314129722-31601-9-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:02:25 +0000 (UTC) When doing convert from one profile to another if soft mode is on restriper won't touch chunks that already have the profile we are converting to. This is useful if e.g. half of the fs was converted earlier. The soft mode switch is per-type (like everything else). This means that we can convert for example meta chunks the "hard" way while converting data chunks selectively with soft switch. Signed-off-by: Ilya Dryomov --- fs/btrfs/volumes.c | 26 ++++++++++++++++++++++++++ fs/btrfs/volumes.h | 5 ++++- 2 files changed, 30 insertions(+), 1 deletions(-) diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c index 95c6310..ff252ef 100644 --- a/fs/btrfs/volumes.c +++ b/fs/btrfs/volumes.c @@ -2175,6 +2175,26 @@ static void unset_restripe_control(struct btrfs_fs_info *fs_info) kfree(rctl); } +/* + * Restripe filters. Return 1 if chunk should be 'filtered out', + * ie should not be restriped. + */ +static int chunk_soft_convert_filter(u64 chunk_profile, + struct btrfs_restripe_args *rargs) +{ + BUG_ON(!(rargs->flags & BTRFS_RESTRIPE_ARGS_CONVERT)); + + chunk_profile &= BTRFS_BLOCK_GROUP_PROFILE_MASK; + + if (chunk_profile == 0) + chunk_profile = BTRFS_AVAIL_ALLOC_BIT_SINGLE; + + if (rargs->target & chunk_profile) + return 1; + + return 0; +} + static int should_restripe_chunk(struct btrfs_root *root, struct extent_buffer *leaf, struct btrfs_chunk *chunk, u64 chunk_offset) @@ -2196,6 +2216,12 @@ static int should_restripe_chunk(struct btrfs_root *root, else if (chunk_type & BTRFS_BLOCK_GROUP_METADATA) rargs = &rctl->meta; + /* soft profile changing mode */ + if ((rargs->flags & BTRFS_RESTRIPE_ARGS_SOFT) && + chunk_soft_convert_filter(chunk_type, rargs)) { + return 0; + } + return 1; } diff --git a/fs/btrfs/volumes.h b/fs/btrfs/volumes.h index f40227e..1852f69 100644 --- a/fs/btrfs/volumes.h +++ b/fs/btrfs/volumes.h @@ -183,9 +183,12 @@ struct map_lookup { #define BTRFS_RESTRIPE_FORCE (1ULL << 3) /* - * Profile changing flags + * Profile changing flags. When SOFT is set we won't relocate chunk if + * it already has the target profile (even though it may be + * half-filled). */ #define BTRFS_RESTRIPE_ARGS_CONVERT (1ULL << 8) +#define BTRFS_RESTRIPE_ARGS_SOFT (1ULL << 9) struct btrfs_restripe_args; struct restripe_control {