aboutsummaryrefslogtreecommitdiffstats
path: root/fs/btrfs/super.c
diff options
context:
space:
mode:
authorChris Mason <chris.mason@oracle.com>2010-10-29 09:27:49 -0400
committerChris Mason <chris.mason@oracle.com>2010-10-29 09:27:49 -0400
commit6b5b817f103450444f3f658a498f435d92a197e5 (patch)
tree2896588127c4dd6c2867ef09e7e3cdd83391f8ae /fs/btrfs/super.c
parent8216ef866df1119fd5a72372b8b29bce49c18590 (diff)
parente9bb7f10d3617304ef94ff7aa8fefbce3078f08b (diff)
Merge branch 'bug-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/josef/btrfs-work
Conflicts: fs/btrfs/extent-tree.c Signed-off-by: Chris Mason <chris.mason@oracle.com>
Diffstat (limited to 'fs/btrfs/super.c')
-rw-r--r--fs/btrfs/super.c18
1 files changed, 12 insertions, 6 deletions
diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c
index 5f56213908e7..65b62daa3f80 100644
--- a/fs/btrfs/super.c
+++ b/fs/btrfs/super.c
@@ -638,7 +638,7 @@ static int btrfs_get_sb(struct file_system_type *fs_type, int flags,
638 if (IS_ERR(root)) { 638 if (IS_ERR(root)) {
639 error = PTR_ERR(root); 639 error = PTR_ERR(root);
640 deactivate_locked_super(s); 640 deactivate_locked_super(s);
641 goto error; 641 goto error_free_subvol_name;
642 } 642 }
643 /* if they gave us a subvolume name bind mount into that */ 643 /* if they gave us a subvolume name bind mount into that */
644 if (strcmp(subvol_name, ".")) { 644 if (strcmp(subvol_name, ".")) {
@@ -652,14 +652,14 @@ static int btrfs_get_sb(struct file_system_type *fs_type, int flags,
652 deactivate_locked_super(s); 652 deactivate_locked_super(s);
653 error = PTR_ERR(new_root); 653 error = PTR_ERR(new_root);
654 dput(root); 654 dput(root);
655 goto error_close_devices; 655 goto error_free_subvol_name;
656 } 656 }
657 if (!new_root->d_inode) { 657 if (!new_root->d_inode) {
658 dput(root); 658 dput(root);
659 dput(new_root); 659 dput(new_root);
660 deactivate_locked_super(s); 660 deactivate_locked_super(s);
661 error = -ENXIO; 661 error = -ENXIO;
662 goto error_close_devices; 662 goto error_free_subvol_name;
663 } 663 }
664 dput(root); 664 dput(root);
665 root = new_root; 665 root = new_root;
@@ -677,7 +677,6 @@ error_close_devices:
677 btrfs_close_devices(fs_devices); 677 btrfs_close_devices(fs_devices);
678error_free_subvol_name: 678error_free_subvol_name:
679 kfree(subvol_name); 679 kfree(subvol_name);
680error:
681 return error; 680 return error;
682} 681}
683 682
@@ -725,18 +724,25 @@ static int btrfs_statfs(struct dentry *dentry, struct kstatfs *buf)
725 struct list_head *head = &root->fs_info->space_info; 724 struct list_head *head = &root->fs_info->space_info;
726 struct btrfs_space_info *found; 725 struct btrfs_space_info *found;
727 u64 total_used = 0; 726 u64 total_used = 0;
727 u64 total_used_data = 0;
728 int bits = dentry->d_sb->s_blocksize_bits; 728 int bits = dentry->d_sb->s_blocksize_bits;
729 __be32 *fsid = (__be32 *)root->fs_info->fsid; 729 __be32 *fsid = (__be32 *)root->fs_info->fsid;
730 730
731 rcu_read_lock(); 731 rcu_read_lock();
732 list_for_each_entry_rcu(found, head, list) 732 list_for_each_entry_rcu(found, head, list) {
733 if (found->flags & (BTRFS_BLOCK_GROUP_METADATA |
734 BTRFS_BLOCK_GROUP_SYSTEM))
735 total_used_data += found->disk_total;
736 else
737 total_used_data += found->disk_used;
733 total_used += found->disk_used; 738 total_used += found->disk_used;
739 }
734 rcu_read_unlock(); 740 rcu_read_unlock();
735 741
736 buf->f_namelen = BTRFS_NAME_LEN; 742 buf->f_namelen = BTRFS_NAME_LEN;
737 buf->f_blocks = btrfs_super_total_bytes(disk_super) >> bits; 743 buf->f_blocks = btrfs_super_total_bytes(disk_super) >> bits;
738 buf->f_bfree = buf->f_blocks - (total_used >> bits); 744 buf->f_bfree = buf->f_blocks - (total_used >> bits);
739 buf->f_bavail = buf->f_bfree; 745 buf->f_bavail = buf->f_blocks - (total_used_data >> bits);
740 buf->f_bsize = dentry->d_sb->s_blocksize; 746 buf->f_bsize = dentry->d_sb->s_blocksize;
741 buf->f_type = BTRFS_SUPER_MAGIC; 747 buf->f_type = BTRFS_SUPER_MAGIC;
742 748