Btrfs: qgroup: free reserved in exceeding quota.
authorDongsheng Yang <yangds.fnst@cn.fujitsu.com>
Fri, 12 Dec 2014 08:44:34 +0000 (16:44 +0800)
committerChris Mason <clm@fb.com>
Mon, 13 Apr 2015 14:52:46 +0000 (07:52 -0700)
When we exceed quota limit in writing, we will free
some reserved extent when we need to drop but not free
account in qgroup. It means, each time we exceed quota
in writing, there will be some remain space in qg->reserved
we can not use any more. If things go on like this, the
all space will be ate up.

Signed-off-by: Dongsheng Yang <yangds.fnst@cn.fujitsu.com>
Reviewed-by: Josef Bacik <jbacik@fb.com>
Signed-off-by: Chris Mason <clm@fb.com>
fs/btrfs/extent-tree.c

index 2713dcbc70f79e892c978e093e30bbf4308306d6..695d5110e02057abf9f8b3f4a0f1cbf878a6441d 100644 (file)
@@ -5475,8 +5475,11 @@ out_fail:
                        to_free = 0;
        }
        spin_unlock(&BTRFS_I(inode)->lock);
-       if (dropped)
+       if (dropped) {
+               if (root->fs_info->quota_enabled)
+                       btrfs_qgroup_free(root, dropped * root->nodesize);
                to_free += btrfs_calc_trans_metadata_size(root, dropped);
+       }
 
        if (to_free) {
                btrfs_block_rsv_release(root, block_rsv, to_free);