From patchwork Sat Feb 8 16:36:25 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Goffredo Baroncelli X-Patchwork-Id: 3610791 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 4F6839F344 for ; Sat, 8 Feb 2014 16:36:33 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 6C208200E3 for ; Sat, 8 Feb 2014 16:36:32 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 8D5CC2009C for ; Sat, 8 Feb 2014 16:36:31 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751700AbaBHQg1 (ORCPT ); Sat, 8 Feb 2014 11:36:27 -0500 Received: from outrelay07.libero.it ([212.52.84.111]:41940 "EHLO outrelay07.libero.it" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751393AbaBHQg1 (ORCPT ); Sat, 8 Feb 2014 11:36:27 -0500 X-CTCH-Spam: Unknown X-CTCH-RefID: str=0001.0A0C0209.52F65D09.013F,ss=1,re=0.000,fgs=0 X-libjamoibt: 1823 Received: from venice.bhome (151.29.89.157) by outrelay07.libero.it (8.6.033) (authenticated as kreijack@libero.it) id 52EA696D01EB700E; Sat, 8 Feb 2014 17:36:25 +0100 Message-ID: <52F65D09.3030400@libero.it> Date: Sat, 08 Feb 2014 17:36:25 +0100 From: Goffredo Baroncelli Reply-To: kreijack@inwind.it User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.2.0 MIME-Version: 1.0 To: linux-btrfs@vger.kernel.org CC: Roman Mamedov , Brendan Hide Subject: [PATCH][V2] Re: Provide a better free space estimate on RAID1 References: <20140206021516.304732cd@natsu> <52F33BE7.4020708@swiftspirit.co.za> <20140206184502.128b7dbe@natsu> <52F3E86B.4030805@libero.it> <20140207104005.7bd1438a@natsu> In-Reply-To: <20140207104005.7bd1438a@natsu> X-Enigmail-Version: 1.6 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.4 required=5.0 tests=BAYES_00,FREEMAIL_FROM, 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 On 02/07/2014 05:40 AM, Roman Mamedov wrote: > On Thu, 06 Feb 2014 20:54:19 +0100 > Goffredo Baroncelli wrote: > [...] Even I am not entirely convinced, I update the Roman's PoC in order to take in account all the RAID levels. The filesystem test is composed by 7 51GB disks. Here my "df" results: Profile: single Filesystem Size Used Avail Use% Mounted on /dev/vdc 351G 512K 348G 1% /mnt/btrfs1 Profile: raid1 Filesystem Size Used Avail Use% Mounted on /dev/vdc 351G 1.3M 150G 1% /mnt/btrfs1 Profile: raid10 Filesystem Size Used Avail Use% Mounted on /dev/vdc 351G 2.3M 153G 1% /mnt/btrfs1 Profile: raid5 Filesystem Size Used Avail Use% Mounted on /dev/vdc 351G 2.0M 298G 1% /mnt/btrfs1 Profile: raid6 Filesystem Size Used Avail Use% Mounted on /dev/vdc 351G 1.8M 248G 1% /mnt/btrfs1 Note that RAID1 and RAID10 can only use an even number of disks. The mixing mode (data and metadata in the same chunk) return strange results. Below my patch. BR G.Baroncelli Changes history: V1 First issue V2 Correct a (old) bug when in RAID10 the disks aren't a multiple of 4 diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c index d71a11d..aea9afa 100644 --- a/fs/btrfs/super.c +++ b/fs/btrfs/super.c @@ -1481,10 +1481,16 @@ static int btrfs_calc_avail_data_space(struct btrfs_root *root, u64 *free_bytes) num_stripes = nr_devices; } else if (type & BTRFS_BLOCK_GROUP_RAID1) { min_stripes = 2; - num_stripes = 2; + num_stripes = nr_devices & ~1llu; } else if (type & BTRFS_BLOCK_GROUP_RAID10) { min_stripes = 4; - num_stripes = 4; + num_stripes = nr_devices & ~1llu; + } else if (type & BTRFS_BLOCK_GROUP_RAID5) { + min_stripes = 3; + num_stripes = nr_devices; + } else if (type & BTRFS_BLOCK_GROUP_RAID6) { + min_stripes = 4; + num_stripes = nr_devices; } if (type & BTRFS_BLOCK_GROUP_DUP) @@ -1561,8 +1567,30 @@ static int btrfs_calc_avail_data_space(struct btrfs_root *root, u64 *free_bytes) if (devices_info[i].max_avail >= min_stripe_size) { int j; u64 alloc_size; + int k; - avail_space += devices_info[i].max_avail * num_stripes; + /* + * Depending by the RAID profile, we use some + * disk space as redundancy: + * RAID1, RAID10, DUP -> half of space used as redundancy + * RAID5 -> 1 stripe used as redundancy + * RAID6 -> 2 stripes used as redundancy + * RAID0,LINEAR -> no redundancy + */ + if (type & BTRFS_BLOCK_GROUP_RAID1) { + k = num_stripes >> 1; + } else if (type & BTRFS_BLOCK_GROUP_DUP) { + k = num_stripes >> 1; + } else if (type & BTRFS_BLOCK_GROUP_RAID10) { + k = num_stripes >> 1; + } else if (type & BTRFS_BLOCK_GROUP_RAID5) { + k = num_stripes-1; + } else if (type & BTRFS_BLOCK_GROUP_RAID6) { + k = num_stripes-2; + } else { /* RAID0/LINEAR */ + k = num_stripes; + } + avail_space += devices_info[i].max_avail * k; alloc_size = devices_info[i].max_avail; for (j = i + 1 - num_stripes; j <= i; j++) devices_info[j].max_avail -= alloc_size;