On Fri, 7 Feb 2014 12:08:12 +0600 Roman Mamedov <r...@romanrm.net> wrote:
> > Earlier conventions would have stated Size ~900GB, and Avail ~900GB. But > > that's not exactly true either, is it? > > Much better, and matching the user expectations of how RAID1 should behave, > without a major "gotcha" blowing up into their face the first minute they are > trying it out. In fact next step that I planned would be finding how to adjust > also Size and Used on all my machines to show what you just mentioned. OK done; again, this is just what I will personally use from now on (and for anyone who finds this helpful). ---- --- fs/btrfs/super.c.orig 2014-02-06 01:28:36.636164982 +0600 +++ fs/btrfs/super.c 2014-02-08 17:16:50.361931959 +0600 @@ -1481,6 +1481,11 @@ } kfree(devices_info); + + if (type & BTRFS_BLOCK_GROUP_RAID1) { + do_div(avail_space, min_stripes); + } + *free_bytes = avail_space; return 0; } @@ -1491,8 +1496,10 @@ struct btrfs_super_block *disk_super = fs_info->super_copy; struct list_head *head = &fs_info->space_info; struct btrfs_space_info *found; + u64 total_size; u64 total_used = 0; u64 total_free_data = 0; + u64 type; int bits = dentry->d_sb->s_blocksize_bits; __be32 *fsid = (__be32 *)fs_info->fsid; int ret; @@ -1512,7 +1519,13 @@ rcu_read_unlock(); buf->f_namelen = BTRFS_NAME_LEN; - buf->f_blocks = btrfs_super_total_bytes(disk_super) >> bits; + total_size = btrfs_super_total_bytes(disk_super); + type = btrfs_get_alloc_profile(fs_info->tree_root, 1); + if (type & BTRFS_BLOCK_GROUP_RAID1) { + do_div(total_size, 2); + do_div(total_used, 2); + } + buf->f_blocks = total_size >> bits; buf->f_bfree = buf->f_blocks - (total_used >> bits); buf->f_bsize = dentry->d_sb->s_blocksize; buf->f_type = BTRFS_SUPER_MAGIC; ---- 2x1TB RAID1 with a 1GB file: Filesystem Size Used Avail Use% Mounted on /dev/sda2 912G 1.1G 911G 1% /mnt/p2 -- With respect, Roman
signature.asc
Description: PGP signature