Btrfs: log ram bytes properly
[firefly-linux-kernel-4.4.55.git] / fs / btrfs / file.c
index 5b4ea5f55b8f47d0bf9a90992dd9da2d33880e14..e81e428a8840529fc408bbb6a23777b32d8c37c0 100644 (file)
@@ -607,6 +607,7 @@ void btrfs_drop_extent_cache(struct inode *inode, u64 start, u64 end,
                                split->block_len = em->block_len;
                        else
                                split->block_len = split->len;
+                       split->ram_bytes = em->ram_bytes;
                        split->orig_block_len = max(split->block_len,
                                                    em->orig_block_len);
                        split->generation = gen;
@@ -632,6 +633,7 @@ void btrfs_drop_extent_cache(struct inode *inode, u64 start, u64 end,
                        split->generation = gen;
                        split->orig_block_len = max(em->block_len,
                                                    em->orig_block_len);
+                       split->ram_bytes = em->ram_bytes;
 
                        if (compressed) {
                                split->block_len = em->block_len;
@@ -1915,6 +1917,7 @@ out:
        } else {
                hole_em->start = offset;
                hole_em->len = end - offset;
+               hole_em->ram_bytes = hole_em->len;
                hole_em->orig_start = offset;
 
                hole_em->block_start = EXTENT_MAP_HOLE;
@@ -2142,6 +2145,7 @@ static long btrfs_fallocate(struct file *file, int mode,
 {
        struct inode *inode = file_inode(file);
        struct extent_state *cached_state = NULL;
+       struct btrfs_root *root = BTRFS_I(inode)->root;
        u64 cur_offset;
        u64 last_byte;
        u64 alloc_start;
@@ -2169,6 +2173,11 @@ static long btrfs_fallocate(struct file *file, int mode,
        ret = btrfs_check_data_free_space(inode, alloc_end - alloc_start);
        if (ret)
                return ret;
+       if (root->fs_info->quota_enabled) {
+               ret = btrfs_qgroup_reserve(root, alloc_end - alloc_start);
+               if (ret)
+                       goto out_reserve_fail;
+       }
 
        /*
         * wait for ordered IO before we have any locks.  We'll loop again
@@ -2272,6 +2281,9 @@ static long btrfs_fallocate(struct file *file, int mode,
                             &cached_state, GFP_NOFS);
 out:
        mutex_unlock(&inode->i_mutex);
+       if (root->fs_info->quota_enabled)
+               btrfs_qgroup_free(root, alloc_end - alloc_start);
+out_reserve_fail:
        /* Let go of our reservation. */
        btrfs_free_reserved_data_space(inode, alloc_end - alloc_start);
        return ret;