btrfs: add quota override flag to enable quota override for CAP_SYS_RESOURCE
authorSargun Dhillon <sargun@sargun.me>
Thu, 11 May 2017 21:17:33 +0000 (21:17 +0000)
committerDavid Sterba <dsterba@suse.com>
Mon, 19 Jun 2017 16:25:58 +0000 (18:25 +0200)
This patch introduces the quota override flag to btrfs_fs_info, and a
change to quota limit checking code to temporarily allow for quota to be
overridden for processes with CAP_SYS_RESOURCE.

It's useful for administrative programs, such as log rotation, that may
need to temporarily use more disk space in order to free up a greater
amount of overall disk space without yielding more disk space to the
rest of userland.

Eventually, we may want to add the idea of an operator-specific quota,
operator reserved space, or something else to allow for administrative
override, but this is perhaps the simplest solution.

Signed-off-by: Sargun Dhillon <sargun@sargun.me>
Reviewed-by: David Sterba <dsterba@suse.com>
[ minor changelog edits ]
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/ctree.h
fs/btrfs/qgroup.c

index 0334452a7be1e4731700c123d6bbc18fcbc4ae9c..aea1b3cee8876efd9b2ad11ca340a0d4ba538684 100644 (file)
@@ -716,6 +716,8 @@ struct btrfs_delayed_root;
 #define BTRFS_FS_BTREE_ERR                     11
 #define BTRFS_FS_LOG1_ERR                      12
 #define BTRFS_FS_LOG2_ERR                      13
+#define BTRFS_FS_QUOTA_OVERRIDE                        14
+
 /*
  * Indicate that a whole-filesystem exclusive operation is running
  * (device replace, resize, device add/delete, balance)
index deffbeb74a0be7499c42578efc51903c3737f3bf..458fec01d814d75ad8f0d06becb9af93e19bfd1c 100644 (file)
@@ -2338,6 +2338,11 @@ static int qgroup_reserve(struct btrfs_root *root, u64 num_bytes, bool enforce)
 
        if (num_bytes == 0)
                return 0;
+
+       if (test_bit(BTRFS_FS_QUOTA_OVERRIDE, &fs_info->flags) &&
+           capable(CAP_SYS_RESOURCE))
+               enforce = false;
+
 retry:
        spin_lock(&fs_info->qgroup_lock);
        quota_root = fs_info->quota_root;