btrfs: qgroup: update qgroup in memory at the same time when we update it in btree.
authorDongsheng Yang <yangds.fnst@cn.fujitsu.com>
Fri, 21 Nov 2014 01:58:34 +0000 (20:58 -0500)
committerChris Mason <clm@fb.com>
Mon, 13 Apr 2015 14:52:40 +0000 (07:52 -0700)
When we call btrfs_qgroup_inherit() with BTRFS_QGROUP_INHERIT_SET_LIMITS,
btrfs will update the limit info of qgroup in btree but forget to update
the qgroup in rbtree at the same time. It obviousely will cause an inconsistency.

This patch fix it by updating the rbtree at the same time.

Signed-off-by: Dongsheng Yang <yangds.fnst@cn.fujitsu.com>
Signed-off-by: Chris Mason <clm@fb.com>
fs/btrfs/qgroup.c

index 34c2753fa4e18bddd23ad22379df496cb5ecc462..bf926f76627353035f6d299cc1129dce24b8d93b 100644 (file)
@@ -2230,17 +2230,6 @@ int btrfs_qgroup_inherit(struct btrfs_trans_handle *trans,
        if (ret)
                goto out;
 
-       if (inherit && inherit->flags & BTRFS_QGROUP_INHERIT_SET_LIMITS) {
-               ret = update_qgroup_limit_item(trans, quota_root, objectid,
-                                              inherit->lim.flags,
-                                              inherit->lim.max_rfer,
-                                              inherit->lim.max_excl,
-                                              inherit->lim.rsv_rfer,
-                                              inherit->lim.rsv_excl);
-               if (ret)
-                       goto out;
-       }
-
        if (srcid) {
                struct btrfs_root *srcroot;
                struct btrfs_key srckey;
@@ -2286,6 +2275,23 @@ int btrfs_qgroup_inherit(struct btrfs_trans_handle *trans,
                goto unlock;
        }
 
+       if (inherit && inherit->flags & BTRFS_QGROUP_INHERIT_SET_LIMITS) {
+               ret = update_qgroup_limit_item(trans, quota_root, objectid,
+                                              inherit->lim.flags,
+                                              inherit->lim.max_rfer,
+                                              inherit->lim.max_excl,
+                                              inherit->lim.rsv_rfer,
+                                              inherit->lim.rsv_excl);
+               if (ret)
+                       goto unlock;
+
+               dstgroup->lim_flags = inherit->lim.flags;
+               dstgroup->max_rfer = inherit->lim.max_rfer;
+               dstgroup->max_excl = inherit->lim.max_excl;
+               dstgroup->rsv_rfer = inherit->lim.rsv_rfer;
+               dstgroup->rsv_excl = inherit->lim.rsv_excl;
+       }
+
        if (srcid) {
                srcgroup = find_qgroup_rb(fs_info, srcid);
                if (!srcgroup)