From patchwork Thu Jul 16 12:15:38 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Zhaolei X-Patchwork-Id: 6806761 Return-Path: X-Original-To: patchwork-linux-btrfs@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork2.web.kernel.org (Postfix) with ESMTP id D0850C05AC for ; Thu, 16 Jul 2015 12:18:35 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 99084206F7 for ; Thu, 16 Jul 2015 12:18:34 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 58D06206EB for ; Thu, 16 Jul 2015 12:18:33 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754353AbbGPMRS (ORCPT ); Thu, 16 Jul 2015 08:17:18 -0400 Received: from cn.fujitsu.com ([59.151.112.132]:25242 "EHLO heian.cn.fujitsu.com" rhost-flags-OK-FAIL-OK-FAIL) by vger.kernel.org with ESMTP id S1751565AbbGPMRR (ORCPT ); Thu, 16 Jul 2015 08:17:17 -0400 X-IronPort-AV: E=Sophos;i="5.13,665,1427731200"; d="scan'208";a="98522731" Received: from bogon (HELO edo.cn.fujitsu.com) ([10.167.33.5]) by heian.cn.fujitsu.com with ESMTP; 16 Jul 2015 20:20:59 +0800 Received: from G08CNEXCHPEKD03.g08.fujitsu.local (localhost.localdomain [127.0.0.1]) by edo.cn.fujitsu.com (8.14.3/8.13.1) with ESMTP id t6GCFRBU030571 for ; Thu, 16 Jul 2015 20:15:27 +0800 Received: from localhost.localdomain (10.167.226.114) by G08CNEXCHPEKD03.g08.fujitsu.local (10.167.33.89) with Microsoft SMTP Server id 14.3.181.6; Thu, 16 Jul 2015 20:17:13 +0800 From: Zhaolei To: CC: Zhao Lei Subject: [PATCH] btrfs: Add raid56 support for updating num_tolerated_disk_barrier_failures in btrfs_balance() Date: Thu, 16 Jul 2015 20:15:38 +0800 Message-ID: X-Mailer: git-send-email 1.8.5.1 MIME-Version: 1.0 Sender: linux-btrfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org X-Spam-Status: No, score=-8.2 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_HI, RP_MATCHES_RCVD, 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 From: Zhao Lei Code for updating fs_info->num_tolerated_disk_barrier_failures in btrfs_balance() lacks raid56 support. Reason: Above code was wroten in 2012-08-01, together with btrfs_calc_num_tolerated_disk_barrier_failures()'s first version. Then, btrfs_calc_num_tolerated_disk_barrier_failures() was updated later to support raid56, but code in btrfs_balance() was not updated together. Fix: Merge these similar code by adding a argument to btrfs_calc_num_tolerated_disk_barrier_failures() to make it support both case. It can fix this bug with a bonus of cleanup, and make these code never in current no-sync state from now on. Signed-off-by: Zhao Lei --- fs/btrfs/disk-io.c | 9 +++++---- fs/btrfs/disk-io.h | 2 +- fs/btrfs/volumes.c | 28 +++++++++------------------- 3 files changed, 15 insertions(+), 24 deletions(-) diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index b6600c7..ac26111 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c @@ -2946,7 +2946,7 @@ retry_root_backup: goto fail_sysfs; } fs_info->num_tolerated_disk_barrier_failures = - btrfs_calc_num_tolerated_disk_barrier_failures(fs_info); + btrfs_calc_num_tolerated_disk_barrier_failures(fs_info, 0); if (fs_info->fs_devices->missing_devices > fs_info->num_tolerated_disk_barrier_failures && !(sb->s_flags & MS_RDONLY)) { @@ -3441,7 +3441,7 @@ static int barrier_all_devices(struct btrfs_fs_info *info) } int btrfs_calc_num_tolerated_disk_barrier_failures( - struct btrfs_fs_info *fs_info) + struct btrfs_fs_info *fs_info, u64 extra_flags) { struct btrfs_ioctl_space_info space; struct btrfs_space_info *sinfo; @@ -3481,7 +3481,7 @@ int btrfs_calc_num_tolerated_disk_barrier_failures( &space); if (space.total_bytes == 0 || space.used_bytes == 0) continue; - flags = space.flags; + flags = space.flags | extra_flags; /* * return * 0: if dup, single or RAID0 is configured for @@ -3493,7 +3493,8 @@ int btrfs_calc_num_tolerated_disk_barrier_failures( */ if (num_tolerated_disk_barrier_failures > 0 && ((flags & (BTRFS_BLOCK_GROUP_DUP | - BTRFS_BLOCK_GROUP_RAID0)) || + BTRFS_BLOCK_GROUP_RAID0 | + BTRFS_AVAIL_ALLOC_BIT_SINGLE)) || ((flags & BTRFS_BLOCK_GROUP_PROFILE_MASK) == 0))) num_tolerated_disk_barrier_failures = 0; else if (num_tolerated_disk_barrier_failures > 1 && diff --git a/fs/btrfs/disk-io.h b/fs/btrfs/disk-io.h index d4cbfee..aceaa8d 100644 --- a/fs/btrfs/disk-io.h +++ b/fs/btrfs/disk-io.h @@ -140,7 +140,7 @@ struct btrfs_root *btrfs_create_tree(struct btrfs_trans_handle *trans, int btree_lock_page_hook(struct page *page, void *data, void (*flush_fn)(void *)); int btrfs_calc_num_tolerated_disk_barrier_failures( - struct btrfs_fs_info *fs_info); + struct btrfs_fs_info *fs_info, u64 extra_flags); int __init btrfs_end_io_wq_init(void); void btrfs_end_io_wq_exit(void); diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c index fbe7c10..d739915 100644 --- a/fs/btrfs/volumes.c +++ b/fs/btrfs/volumes.c @@ -1812,7 +1812,8 @@ int btrfs_rm_device(struct btrfs_root *root, char *device_path) } root->fs_info->num_tolerated_disk_barrier_failures = - btrfs_calc_num_tolerated_disk_barrier_failures(root->fs_info); + btrfs_calc_num_tolerated_disk_barrier_failures(root->fs_info, + 0); /* * at this point, the device is zero sized. We want to @@ -2342,7 +2343,8 @@ int btrfs_init_new_device(struct btrfs_root *root, char *device_path) } root->fs_info->num_tolerated_disk_barrier_failures = - btrfs_calc_num_tolerated_disk_barrier_failures(root->fs_info); + btrfs_calc_num_tolerated_disk_barrier_failures(root->fs_info, + 0); ret = btrfs_commit_transaction(trans, root); if (seeding_dev) { @@ -3573,23 +3575,10 @@ int btrfs_balance(struct btrfs_balance_control *bctl, } while (read_seqretry(&fs_info->profiles_lock, seq)); if (bctl->sys.flags & BTRFS_BALANCE_ARGS_CONVERT) { - int num_tolerated_disk_barrier_failures; - u64 target = bctl->sys.target; - - num_tolerated_disk_barrier_failures = - btrfs_calc_num_tolerated_disk_barrier_failures(fs_info); - if (num_tolerated_disk_barrier_failures > 0 && - (target & - (BTRFS_BLOCK_GROUP_DUP | BTRFS_BLOCK_GROUP_RAID0 | - BTRFS_AVAIL_ALLOC_BIT_SINGLE))) - num_tolerated_disk_barrier_failures = 0; - else if (num_tolerated_disk_barrier_failures > 1 && - (target & - (BTRFS_BLOCK_GROUP_RAID1 | BTRFS_BLOCK_GROUP_RAID10))) - num_tolerated_disk_barrier_failures = 1; - fs_info->num_tolerated_disk_barrier_failures = - num_tolerated_disk_barrier_failures; + btrfs_calc_num_tolerated_disk_barrier_failures( + fs_info, + bctl->sys.target); } ret = insert_balance_item(fs_info->tree_root, bctl); @@ -3616,7 +3605,8 @@ int btrfs_balance(struct btrfs_balance_control *bctl, if (bctl->sys.flags & BTRFS_BALANCE_ARGS_CONVERT) { fs_info->num_tolerated_disk_barrier_failures = - btrfs_calc_num_tolerated_disk_barrier_failures(fs_info); + btrfs_calc_num_tolerated_disk_barrier_failures(fs_info, + 0); } if (bargs) {