| Chris Mason | fa9c0d7 | 2009-04-03 09:47:43 -0400 | [diff] [blame] | 1 | /* | 
|  | 2 | * Copyright (C) 2009 Oracle.  All rights reserved. | 
|  | 3 | * | 
|  | 4 | * This program is free software; you can redistribute it and/or | 
|  | 5 | * modify it under the terms of the GNU General Public | 
|  | 6 | * License v2 as published by the Free Software Foundation. | 
|  | 7 | * | 
|  | 8 | * This program is distributed in the hope that it will be useful, | 
|  | 9 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
|  | 10 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | 
|  | 11 | * General Public License for more details. | 
|  | 12 | * | 
|  | 13 | * You should have received a copy of the GNU General Public | 
|  | 14 | * License along with this program; if not, write to the | 
|  | 15 | * Free Software Foundation, Inc., 59 Temple Place - Suite 330, | 
|  | 16 | * Boston, MA 021110-1307, USA. | 
|  | 17 | */ | 
|  | 18 |  | 
|  | 19 | #ifndef __BTRFS_FREE_SPACE_CACHE | 
|  | 20 | #define __BTRFS_FREE_SPACE_CACHE | 
|  | 21 |  | 
| Josef Bacik | 9630308 | 2009-07-13 21:29:25 -0400 | [diff] [blame] | 22 | struct btrfs_free_space { | 
|  | 23 | struct rb_node offset_index; | 
|  | 24 | u64 offset; | 
|  | 25 | u64 bytes; | 
|  | 26 | unsigned long *bitmap; | 
|  | 27 | struct list_head list; | 
|  | 28 | }; | 
|  | 29 |  | 
| Li Zefan | 34d52cb | 2011-03-29 13:46:06 +0800 | [diff] [blame] | 30 | struct btrfs_free_space_ctl { | 
|  | 31 | spinlock_t tree_lock; | 
|  | 32 | struct rb_root free_space_offset; | 
|  | 33 | u64 free_space; | 
|  | 34 | int extents_thresh; | 
|  | 35 | int free_extents; | 
|  | 36 | int total_bitmaps; | 
|  | 37 | int unit; | 
|  | 38 | u64 start; | 
|  | 39 | struct btrfs_free_space_op *op; | 
|  | 40 | void *private; | 
|  | 41 | }; | 
|  | 42 |  | 
|  | 43 | struct btrfs_free_space_op { | 
|  | 44 | void (*recalc_thresholds)(struct btrfs_free_space_ctl *ctl); | 
|  | 45 | bool (*use_bitmap)(struct btrfs_free_space_ctl *ctl, | 
|  | 46 | struct btrfs_free_space *info); | 
|  | 47 | }; | 
|  | 48 |  | 
| Josef Bacik | 0af3d00 | 2010-06-21 14:48:16 -0400 | [diff] [blame] | 49 | struct inode *lookup_free_space_inode(struct btrfs_root *root, | 
|  | 50 | struct btrfs_block_group_cache | 
|  | 51 | *block_group, struct btrfs_path *path); | 
|  | 52 | int create_free_space_inode(struct btrfs_root *root, | 
|  | 53 | struct btrfs_trans_handle *trans, | 
|  | 54 | struct btrfs_block_group_cache *block_group, | 
|  | 55 | struct btrfs_path *path); | 
| Josef Bacik | 0cb59c9 | 2010-07-02 12:14:14 -0400 | [diff] [blame] | 56 |  | 
| Josef Bacik | 0af3d00 | 2010-06-21 14:48:16 -0400 | [diff] [blame] | 57 | int btrfs_truncate_free_space_cache(struct btrfs_root *root, | 
|  | 58 | struct btrfs_trans_handle *trans, | 
|  | 59 | struct btrfs_path *path, | 
|  | 60 | struct inode *inode); | 
| Josef Bacik | 9d66e23 | 2010-08-25 16:54:15 -0400 | [diff] [blame] | 61 | int load_free_space_cache(struct btrfs_fs_info *fs_info, | 
|  | 62 | struct btrfs_block_group_cache *block_group); | 
| Josef Bacik | 0cb59c9 | 2010-07-02 12:14:14 -0400 | [diff] [blame] | 63 | int btrfs_write_out_cache(struct btrfs_root *root, | 
|  | 64 | struct btrfs_trans_handle *trans, | 
|  | 65 | struct btrfs_block_group_cache *block_group, | 
|  | 66 | struct btrfs_path *path); | 
| Li Zefan | 581bb05 | 2011-04-20 10:06:11 +0800 | [diff] [blame] | 67 |  | 
| Li Zefan | 82d5902 | 2011-04-20 10:33:24 +0800 | [diff] [blame] | 68 | struct inode *lookup_free_ino_inode(struct btrfs_root *root, | 
|  | 69 | struct btrfs_path *path); | 
|  | 70 | int create_free_ino_inode(struct btrfs_root *root, | 
|  | 71 | struct btrfs_trans_handle *trans, | 
|  | 72 | struct btrfs_path *path); | 
|  | 73 | int load_free_ino_cache(struct btrfs_fs_info *fs_info, | 
|  | 74 | struct btrfs_root *root); | 
|  | 75 | int btrfs_write_out_ino_cache(struct btrfs_root *root, | 
|  | 76 | struct btrfs_trans_handle *trans, | 
|  | 77 | struct btrfs_path *path); | 
|  | 78 |  | 
| Li Zefan | 34d52cb | 2011-03-29 13:46:06 +0800 | [diff] [blame] | 79 | void btrfs_init_free_space_ctl(struct btrfs_block_group_cache *block_group); | 
| Li Zefan | 581bb05 | 2011-04-20 10:06:11 +0800 | [diff] [blame] | 80 | int __btrfs_add_free_space(struct btrfs_free_space_ctl *ctl, | 
|  | 81 | u64 bytenr, u64 size); | 
|  | 82 | static inline int | 
|  | 83 | btrfs_add_free_space(struct btrfs_block_group_cache *block_group, | 
|  | 84 | u64 bytenr, u64 size) | 
|  | 85 | { | 
|  | 86 | return __btrfs_add_free_space(block_group->free_space_ctl, | 
|  | 87 | bytenr, size); | 
|  | 88 | } | 
| Chris Mason | fa9c0d7 | 2009-04-03 09:47:43 -0400 | [diff] [blame] | 89 | int btrfs_remove_free_space(struct btrfs_block_group_cache *block_group, | 
|  | 90 | u64 bytenr, u64 size); | 
| Li Zefan | 581bb05 | 2011-04-20 10:06:11 +0800 | [diff] [blame] | 91 | void __btrfs_remove_free_space_cache(struct btrfs_free_space_ctl *ctl); | 
| Chris Mason | fa9c0d7 | 2009-04-03 09:47:43 -0400 | [diff] [blame] | 92 | void btrfs_remove_free_space_cache(struct btrfs_block_group_cache | 
| Li Zefan | 581bb05 | 2011-04-20 10:06:11 +0800 | [diff] [blame] | 93 | *block_group); | 
| Chris Mason | fa9c0d7 | 2009-04-03 09:47:43 -0400 | [diff] [blame] | 94 | u64 btrfs_find_space_for_alloc(struct btrfs_block_group_cache *block_group, | 
|  | 95 | u64 offset, u64 bytes, u64 empty_size); | 
| Li Zefan | 581bb05 | 2011-04-20 10:06:11 +0800 | [diff] [blame] | 96 | u64 btrfs_find_ino_for_alloc(struct btrfs_root *fs_root); | 
| Chris Mason | fa9c0d7 | 2009-04-03 09:47:43 -0400 | [diff] [blame] | 97 | void btrfs_dump_free_space(struct btrfs_block_group_cache *block_group, | 
|  | 98 | u64 bytes); | 
| Chris Mason | fa9c0d7 | 2009-04-03 09:47:43 -0400 | [diff] [blame] | 99 | int btrfs_find_space_cluster(struct btrfs_trans_handle *trans, | 
| Chris Mason | 451d758 | 2009-06-09 20:28:34 -0400 | [diff] [blame] | 100 | struct btrfs_root *root, | 
| Chris Mason | fa9c0d7 | 2009-04-03 09:47:43 -0400 | [diff] [blame] | 101 | struct btrfs_block_group_cache *block_group, | 
|  | 102 | struct btrfs_free_cluster *cluster, | 
|  | 103 | u64 offset, u64 bytes, u64 empty_size); | 
|  | 104 | void btrfs_init_free_cluster(struct btrfs_free_cluster *cluster); | 
|  | 105 | u64 btrfs_alloc_from_cluster(struct btrfs_block_group_cache *block_group, | 
|  | 106 | struct btrfs_free_cluster *cluster, u64 bytes, | 
|  | 107 | u64 min_start); | 
|  | 108 | int btrfs_return_cluster_to_free_space( | 
|  | 109 | struct btrfs_block_group_cache *block_group, | 
|  | 110 | struct btrfs_free_cluster *cluster); | 
| Li Dongyang | f7039b1 | 2011-03-24 10:24:28 +0000 | [diff] [blame] | 111 | int btrfs_trim_block_group(struct btrfs_block_group_cache *block_group, | 
|  | 112 | u64 *trimmed, u64 start, u64 end, u64 minlen); | 
| Chris Mason | fa9c0d7 | 2009-04-03 09:47:43 -0400 | [diff] [blame] | 113 | #endif |