]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - fs/btrfs/qgroup.c
Merge tag 'trace-v5.6-2' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt...
[linux.git] / fs / btrfs / qgroup.c
index d4282e12f2a64a2e3c1fa696d00c9862baff6861..98d9a50352d6d2bf6314cf4dc6720303e53e496e 100644 (file)
@@ -1243,7 +1243,6 @@ int btrfs_add_qgroup_relation(struct btrfs_trans_handle *trans, u64 src,
                              u64 dst)
 {
        struct btrfs_fs_info *fs_info = trans->fs_info;
-       struct btrfs_root *quota_root;
        struct btrfs_qgroup *parent;
        struct btrfs_qgroup *member;
        struct btrfs_qgroup_list *list;
@@ -1259,9 +1258,8 @@ int btrfs_add_qgroup_relation(struct btrfs_trans_handle *trans, u64 src,
                return -ENOMEM;
 
        mutex_lock(&fs_info->qgroup_ioctl_lock);
-       quota_root = fs_info->quota_root;
-       if (!quota_root) {
-               ret = -EINVAL;
+       if (!fs_info->quota_root) {
+               ret = -ENOTCONN;
                goto out;
        }
        member = find_qgroup_rb(fs_info, src);
@@ -1307,7 +1305,6 @@ static int __del_qgroup_relation(struct btrfs_trans_handle *trans, u64 src,
                                 u64 dst)
 {
        struct btrfs_fs_info *fs_info = trans->fs_info;
-       struct btrfs_root *quota_root;
        struct btrfs_qgroup *parent;
        struct btrfs_qgroup *member;
        struct btrfs_qgroup_list *list;
@@ -1320,9 +1317,8 @@ static int __del_qgroup_relation(struct btrfs_trans_handle *trans, u64 src,
        if (!tmp)
                return -ENOMEM;
 
-       quota_root = fs_info->quota_root;
-       if (!quota_root) {
-               ret = -EINVAL;
+       if (!fs_info->quota_root) {
+               ret = -ENOTCONN;
                goto out;
        }
 
@@ -1387,11 +1383,11 @@ int btrfs_create_qgroup(struct btrfs_trans_handle *trans, u64 qgroupid)
        int ret = 0;
 
        mutex_lock(&fs_info->qgroup_ioctl_lock);
-       quota_root = fs_info->quota_root;
-       if (!quota_root) {
-               ret = -EINVAL;
+       if (!fs_info->quota_root) {
+               ret = -ENOTCONN;
                goto out;
        }
+       quota_root = fs_info->quota_root;
        qgroup = find_qgroup_rb(fs_info, qgroupid);
        if (qgroup) {
                ret = -EEXIST;
@@ -1416,15 +1412,13 @@ int btrfs_create_qgroup(struct btrfs_trans_handle *trans, u64 qgroupid)
 int btrfs_remove_qgroup(struct btrfs_trans_handle *trans, u64 qgroupid)
 {
        struct btrfs_fs_info *fs_info = trans->fs_info;
-       struct btrfs_root *quota_root;
        struct btrfs_qgroup *qgroup;
        struct btrfs_qgroup_list *list;
        int ret = 0;
 
        mutex_lock(&fs_info->qgroup_ioctl_lock);
-       quota_root = fs_info->quota_root;
-       if (!quota_root) {
-               ret = -EINVAL;
+       if (!fs_info->quota_root) {
+               ret = -ENOTCONN;
                goto out;
        }
 
@@ -1465,7 +1459,6 @@ int btrfs_limit_qgroup(struct btrfs_trans_handle *trans, u64 qgroupid,
                       struct btrfs_qgroup_limit *limit)
 {
        struct btrfs_fs_info *fs_info = trans->fs_info;
-       struct btrfs_root *quota_root;
        struct btrfs_qgroup *qgroup;
        int ret = 0;
        /* Sometimes we would want to clear the limit on this qgroup.
@@ -1475,9 +1468,8 @@ int btrfs_limit_qgroup(struct btrfs_trans_handle *trans, u64 qgroupid,
        const u64 CLEAR_VALUE = -1;
 
        mutex_lock(&fs_info->qgroup_ioctl_lock);
-       quota_root = fs_info->quota_root;
-       if (!quota_root) {
-               ret = -EINVAL;
+       if (!fs_info->quota_root) {
+               ret = -ENOTCONN;
                goto out;
        }
 
@@ -2423,8 +2415,12 @@ int btrfs_qgroup_account_extent(struct btrfs_trans_handle *trans, u64 bytenr,
        u64 nr_old_roots = 0;
        int ret = 0;
 
+       /*
+        * If quotas get disabled meanwhile, the resouces need to be freed and
+        * we can't just exit here.
+        */
        if (!test_bit(BTRFS_FS_QUOTA_ENABLED, &fs_info->flags))
-               return 0;
+               goto out_free;
 
        if (new_roots) {
                if (!maybe_fs_roots(new_roots))
@@ -2578,10 +2574,9 @@ int btrfs_qgroup_account_extents(struct btrfs_trans_handle *trans)
 int btrfs_run_qgroups(struct btrfs_trans_handle *trans)
 {
        struct btrfs_fs_info *fs_info = trans->fs_info;
-       struct btrfs_root *quota_root = fs_info->quota_root;
        int ret = 0;
 
-       if (!quota_root)
+       if (!fs_info->quota_root)
                return ret;
 
        spin_lock(&fs_info->qgroup_lock);
@@ -2875,7 +2870,6 @@ static bool qgroup_check_limits(struct btrfs_fs_info *fs_info,
 static int qgroup_reserve(struct btrfs_root *root, u64 num_bytes, bool enforce,
                          enum btrfs_qgroup_rsv_type type)
 {
-       struct btrfs_root *quota_root;
        struct btrfs_qgroup *qgroup;
        struct btrfs_fs_info *fs_info = root->fs_info;
        u64 ref_root = root->root_key.objectid;
@@ -2894,8 +2888,7 @@ static int qgroup_reserve(struct btrfs_root *root, u64 num_bytes, bool enforce,
                enforce = false;
 
        spin_lock(&fs_info->qgroup_lock);
-       quota_root = fs_info->quota_root;
-       if (!quota_root)
+       if (!fs_info->quota_root)
                goto out;
 
        qgroup = find_qgroup_rb(fs_info, ref_root);
@@ -2962,7 +2955,6 @@ void btrfs_qgroup_free_refroot(struct btrfs_fs_info *fs_info,
                               u64 ref_root, u64 num_bytes,
                               enum btrfs_qgroup_rsv_type type)
 {
-       struct btrfs_root *quota_root;
        struct btrfs_qgroup *qgroup;
        struct ulist_node *unode;
        struct ulist_iterator uiter;
@@ -2980,8 +2972,7 @@ void btrfs_qgroup_free_refroot(struct btrfs_fs_info *fs_info,
        }
        spin_lock(&fs_info->qgroup_lock);
 
-       quota_root = fs_info->quota_root;
-       if (!quota_root)
+       if (!fs_info->quota_root)
                goto out;
 
        qgroup = find_qgroup_rb(fs_info, ref_root);
@@ -3681,7 +3672,6 @@ void __btrfs_qgroup_free_meta(struct btrfs_root *root, int num_bytes,
 static void qgroup_convert_meta(struct btrfs_fs_info *fs_info, u64 ref_root,
                                int num_bytes)
 {
-       struct btrfs_root *quota_root = fs_info->quota_root;
        struct btrfs_qgroup *qgroup;
        struct ulist_node *unode;
        struct ulist_iterator uiter;
@@ -3689,7 +3679,7 @@ static void qgroup_convert_meta(struct btrfs_fs_info *fs_info, u64 ref_root,
 
        if (num_bytes == 0)
                return;
-       if (!quota_root)
+       if (!fs_info->quota_root)
                return;
 
        spin_lock(&fs_info->qgroup_lock);