aboutsummaryrefslogtreecommitdiffstats
path: root/fs/btrfs/ioctl.c
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 /fs/btrfs/ioctl.c
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>
Diffstat (limited to 'fs/btrfs/ioctl.c')
-rw-r--r--fs/btrfs/ioctl.c45
1 files changed, 45 insertions, 0 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;