aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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