Btrfs: try to drop dead cow pages from ram
authorChris Mason <chris.mason@oracle.com>
Sat, 28 Apr 2007 12:48:10 +0000 (08:48 -0400)
committerDavid Woodhouse <dwmw2@hera.kernel.org>
Sat, 28 Apr 2007 12:48:10 +0000 (08:48 -0400)
Signed-off-by: Chris Mason <chris.mason@oracle.com>
fs/btrfs/TODO
fs/btrfs/extent-tree.c

index 5ff2cef9f02842e5b22f30c9e3201edee980d665..6a8c8cd03ca490e8578f055b7b19c327611c59a4 100644 (file)
@@ -6,8 +6,7 @@
 * Check compat and incompat flags on the inode
 * Get rid of struct ctree_path, limiting tree levels held at one time
 * Add generation number to key pointer in nodes
-* Add parent pointer back to extent map.
-* Implement real list of pending transactions
+* Add generation number to inode
 * Release
 * Do real tree locking
 * Add extent mirroring (backup copies of blocks)
index aca5802a8a1e8659def1071cc738f9a929e2c135..afc5267515e23729cc8252409eb8310e9b281e4a 100644 (file)
@@ -291,10 +291,18 @@ static int update_block_group(struct btrfs_trans_handle *trans,
        return 0;
 }
 
+static int try_remove_page(struct address_space *mapping, unsigned long index)
+{
+       int ret;
+       ret = invalidate_mapping_pages(mapping, index, index);
+       return ret;
+}
+
 int btrfs_finish_extent_commit(struct btrfs_trans_handle *trans, struct
                               btrfs_root *root)
 {
        unsigned long gang[8];
+       struct inode *btree_inode = root->fs_info->btree_inode;
        u64 first = 0;
        int ret;
        int i;
@@ -309,6 +317,9 @@ int btrfs_finish_extent_commit(struct btrfs_trans_handle *trans, struct
                        first = gang[0];
                for (i = 0; i < ret; i++) {
                        clear_radix_bit(pinned_radix, gang[i]);
+                       try_remove_page(btree_inode->i_mapping,
+                                       gang[i] << (PAGE_CACHE_SHIFT -
+                                                   btree_inode->i_blkbits));
                }
        }
        if (root->fs_info->block_group_cache) {
@@ -600,6 +611,12 @@ check_pending:
         */
        btrfs_release_path(root, path);
        BUG_ON(ins->objectid < search_start);
+       if (ins->objectid >= btrfs_super_total_blocks(info->disk_super)) {
+               if (search_start == 0)
+                       return -ENOSPC;
+               search_start = 0;
+               goto check_failed;
+       }
        for (test_block = ins->objectid;
             test_block < ins->objectid + num_blocks; test_block++) {
                if (test_radix_bit(&info->pinned_radix, test_block)) {