From patchwork Tue Aug 23 20:01:44 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ilya Dryomov X-Patchwork-Id: 1089592 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 p7NK29Ie006744 for ; Tue, 23 Aug 2011 20:02:09 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755813Ab1HWUCG (ORCPT ); Tue, 23 Aug 2011 16:02:06 -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 S1756027Ab1HWUCE (ORCPT ); Tue, 23 Aug 2011 16:02:04 -0400 Received: by mail-bw0-f46.google.com with SMTP id 11so372435bke.19 for ; Tue, 23 Aug 2011 13:02:03 -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=uyRjCnQbhRnVRyoDh7fudrzJNKSeYxBy8Lf31vvvYak=; b=IA3/x/HYprl0ZWdB5RAVpZ+oFoI1ArMYiHJ17cbJnUrCpTWT0GzM97nnHxvWQhsdap E8j0YPw08yWEnwA2Vh+OSKk92b7PYp1nYOQUqHozSjHKXfbO1YsOMKzoq8fu8t0ozUIS i/VwaFKflqrQjxjBB3kN7lumb0QDLklS3xt0Y= Received: by 10.204.8.82 with SMTP id g18mr1824632bkg.141.1314129723888; Tue, 23 Aug 2011 13:02:03 -0700 (PDT) Received: from localhost ([31.28.235.172]) by mx.google.com with ESMTPS id p6sm80485bks.50.2011.08.23.13.02.02 (version=TLSv1/SSLv3 cipher=OTHER); Tue, 23 Aug 2011 13:02:03 -0700 (PDT) From: Ilya Dryomov To: linux-btrfs@vger.kernel.org Cc: Chris Mason , Hugo Mills , idryomov@gmail.com Subject: [PATCH 03/21] Btrfs: add BTRFS_AVAIL_ALLOC_BIT_SINGLE bit Date: Tue, 23 Aug 2011 23:01:44 +0300 Message-Id: <1314129722-31601-4-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:09 +0000 (UTC) Right now on-disk BTRFS_BLOCK_GROUP_* profile bits are used for avail_{data,metadata,system}_alloc_bits fields, which are there to tell us about available allocation profiles in the fs. When chunk is created, it's profile is OR'ed with respective avail_alloc_bits field. Since SINGLE is denoted by 0 in the on-disk format, currently there is no way to tell when such chunks become avaialble. Restriper needs that information, so add a separate bit for SINGLE profile. This bit is going to be in-memory only, it should never be written out to disk, so it's not a disk format change. However to avoid remappings in future, reserve corresponding on-disk bit. Signed-off-by: Ilya Dryomov --- fs/btrfs/ctree.h | 12 ++++++++++++ fs/btrfs/extent-tree.c | 22 ++++++++++++++-------- 2 files changed, 26 insertions(+), 8 deletions(-) diff --git a/fs/btrfs/ctree.h b/fs/btrfs/ctree.h index b882c95..5b00eb8 100644 --- a/fs/btrfs/ctree.h +++ b/fs/btrfs/ctree.h @@ -725,6 +725,17 @@ struct btrfs_csum_item { BTRFS_BLOCK_GROUP_RAID1 | \ BTRFS_BLOCK_GROUP_DUP | \ BTRFS_BLOCK_GROUP_RAID10) +/* + * We need a bit for restriper to be able to tell when chunks of type + * SINGLE are available. It is used in avail_*_alloc_bits. + */ +#define BTRFS_AVAIL_ALLOC_BIT_SINGLE (1 << 7) + +/* + * To avoid troubles or remappings, reserve on-disk bit. + */ +#define BTRFS_BLOCK_GROUP_RESERVED (1 << 7) + struct btrfs_block_group_item { __le64 used; __le64 chunk_objectid; @@ -1100,6 +1111,7 @@ struct btrfs_fs_info { spinlock_t ref_cache_lock; u64 total_ref_cache_size; + /* SINGLE has it's own bit for these three */ u64 avail_data_alloc_bits; u64 avail_metadata_alloc_bits; u64 avail_system_alloc_bits; diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c index de4c639..ed35eb5 100644 --- a/fs/btrfs/extent-tree.c +++ b/fs/btrfs/extent-tree.c @@ -2945,14 +2945,17 @@ static int update_space_info(struct btrfs_fs_info *info, u64 flags, static void set_avail_alloc_bits(struct btrfs_fs_info *fs_info, u64 flags) { u64 extra_flags = flags & BTRFS_BLOCK_GROUP_PROFILE_MASK; - if (extra_flags) { - if (flags & BTRFS_BLOCK_GROUP_DATA) - fs_info->avail_data_alloc_bits |= extra_flags; - if (flags & BTRFS_BLOCK_GROUP_METADATA) - fs_info->avail_metadata_alloc_bits |= extra_flags; - if (flags & BTRFS_BLOCK_GROUP_SYSTEM) - fs_info->avail_system_alloc_bits |= extra_flags; - } + + /* on-disk -> in-memory */ + if (extra_flags == 0) + extra_flags = BTRFS_AVAIL_ALLOC_BIT_SINGLE; + + if (flags & BTRFS_BLOCK_GROUP_DATA) + fs_info->avail_data_alloc_bits |= extra_flags; + if (flags & BTRFS_BLOCK_GROUP_METADATA) + fs_info->avail_metadata_alloc_bits |= extra_flags; + if (flags & BTRFS_BLOCK_GROUP_SYSTEM) + fs_info->avail_system_alloc_bits |= extra_flags; } u64 btrfs_reduce_alloc_profile(struct btrfs_root *root, u64 flags) @@ -2986,6 +2989,9 @@ u64 btrfs_reduce_alloc_profile(struct btrfs_root *root, u64 flags) (flags & BTRFS_BLOCK_GROUP_RAID10) | (flags & BTRFS_BLOCK_GROUP_DUP))) flags &= ~BTRFS_BLOCK_GROUP_RAID0; + + /* in-memory -> on-disk */ + flags &= ~BTRFS_AVAIL_ALLOC_BIT_SINGLE; return flags; }