aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJosef Bacik <josef@redhat.com>2010-01-13 13:19:06 -0500
committerChris Mason <chris.mason@oracle.com>2010-03-15 11:00:14 -0400
commit1406e4327be3a533a2b18582f715ce2cfbcf6804 (patch)
tree40cafa639095b1a652cd013746394b7a77e52b69
parent2ac55d41b5d6bf49e76bc85db5431240617e2f8f (diff)
Btrfs: add a "df" ioctl for btrfs
df is a very loaded question in btrfs. This gives us a way to get the per-space usage information so we can tell exactly what is in use where. This will help us figure out ENOSPC problems, and help users better understand where their disk space is going. Signed-off-by: Josef Bacik <josef@redhat.com> Signed-off-by: Chris Mason <chris.mason@oracle.com>
-rw-r--r--fs/btrfs/ioctl.c45
-rw-r--r--fs/btrfs/ioctl.h14
2 files changed, 58 insertions, 1 deletions
diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c
index 9aaba6e472d3..9213d39d36cc 100644
--- a/fs/btrfs/ioctl.c
+++ b/fs/btrfs/ioctl.c
@@ -1843,6 +1843,49 @@ static long btrfs_ioctl_default_subvol(struct file *file, void __user *argp)
1843 return 0; 1843 return 0;
1844} 1844}
1845 1845
1846long btrfs_ioctl_space_info(struct btrfs_root *root, void __user *arg)
1847{
1848 struct btrfs_ioctl_space_args space_args;
1849 struct btrfs_ioctl_space_info space;
1850 struct btrfs_ioctl_space_info *dest;
1851 struct btrfs_space_info *info;
1852 int ret = 0;
1853
1854 if (copy_from_user(&space_args,
1855 (struct btrfs_ioctl_space_args __user *)arg,
1856 sizeof(space_args)))
1857 return -EFAULT;
1858
1859 space_args.total_spaces = 0;
1860 dest = (struct btrfs_ioctl_space_info *)
1861 (arg + sizeof(struct btrfs_ioctl_space_args));
1862
1863 rcu_read_lock();
1864 list_for_each_entry_rcu(info, &root->fs_info->space_info, list) {
1865 if (!space_args.space_slots) {
1866 space_args.total_spaces++;
1867 continue;
1868 }
1869 if (space_args.total_spaces >= space_args.space_slots)
1870 break;
1871 space.flags = info->flags;
1872 space.total_bytes = info->total_bytes;
1873 space.used_bytes = info->bytes_used;
1874 if (copy_to_user(dest, &space, sizeof(space))) {
1875 ret = -EFAULT;
1876 break;
1877 }
1878 dest++;
1879 space_args.total_spaces++;
1880 }
1881 rcu_read_unlock();
1882
1883 if (copy_to_user(arg, &space_args, sizeof(space_args)))
1884 ret = -EFAULT;
1885
1886 return ret;
1887}
1888
1846/* 1889/*
1847 * there are many ways the trans_start and trans_end ioctls can lead 1890 * there are many ways the trans_start and trans_end ioctls can lead
1848 * to deadlocks. They should only be used by applications that 1891 * to deadlocks. They should only be used by applications that
@@ -1915,6 +1958,8 @@ long btrfs_ioctl(struct file *file, unsigned int
1915 return btrfs_ioctl_tree_search(file, argp); 1958 return btrfs_ioctl_tree_search(file, argp);
1916 case BTRFS_IOC_INO_LOOKUP: 1959 case BTRFS_IOC_INO_LOOKUP:
1917 return btrfs_ioctl_ino_lookup(file, argp); 1960 return btrfs_ioctl_ino_lookup(file, argp);
1961 case BTRFS_IOC_SPACE_INFO:
1962 return btrfs_ioctl_space_info(root, argp);
1918 case BTRFS_IOC_SYNC: 1963 case BTRFS_IOC_SYNC:
1919 btrfs_sync_fs(file->f_dentry->d_sb, 1); 1964 btrfs_sync_fs(file->f_dentry->d_sb, 1);
1920 return 0; 1965 return 0;
diff --git a/fs/btrfs/ioctl.h b/fs/btrfs/ioctl.h
index 2d64a65842f3..81eac0a59ea3 100644
--- a/fs/btrfs/ioctl.h
+++ b/fs/btrfs/ioctl.h
@@ -1,4 +1,3 @@
1
2/* 1/*
3 * Copyright (C) 2007 Oracle. All rights reserved. 2 * Copyright (C) 2007 Oracle. All rights reserved.
4 * 3 *
@@ -127,6 +126,17 @@ struct btrfs_ioctl_defrag_range_args {
127 __u32 unused[5]; 126 __u32 unused[5];
128}; 127};
129 128
129struct btrfs_ioctl_space_info {
130 u64 flags;
131 u64 total_bytes;
132 u64 used_bytes;
133};
134
135struct btrfs_ioctl_space_args {
136 u64 space_slots;
137 u64 total_spaces;
138 struct btrfs_ioctl_space_info spaces[0];
139};
130 140
131#define BTRFS_IOC_SNAP_CREATE _IOW(BTRFS_IOCTL_MAGIC, 1, \ 141#define BTRFS_IOC_SNAP_CREATE _IOW(BTRFS_IOCTL_MAGIC, 1, \
132 struct btrfs_ioctl_vol_args) 142 struct btrfs_ioctl_vol_args)
@@ -166,4 +176,6 @@ struct btrfs_ioctl_defrag_range_args {
166#define BTRFS_IOC_INO_LOOKUP _IOWR(BTRFS_IOCTL_MAGIC, 18, \ 176#define BTRFS_IOC_INO_LOOKUP _IOWR(BTRFS_IOCTL_MAGIC, 18, \
167 struct btrfs_ioctl_ino_lookup_args) 177 struct btrfs_ioctl_ino_lookup_args)
168#define BTRFS_IOC_DEFAULT_SUBVOL _IOW(BTRFS_IOCTL_MAGIC, 19, u64) 178#define BTRFS_IOC_DEFAULT_SUBVOL _IOW(BTRFS_IOCTL_MAGIC, 19, u64)
179#define BTRFS_IOC_SPACE_INFO _IOWR(BTRFS_IOCTL_MAGIC, 20, \
180 struct btrfs_ioctl_space_args)
169#endif 181#endif