Blame view

fs/btrfs/free-space-cache.c 70 KB
0f9dd46cd   Josef Bacik   Btrfs: free space...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
  /*
   * Copyright (C) 2008 Red Hat.  All rights reserved.
   *
   * This program is free software; you can redistribute it and/or
   * modify it under the terms of the GNU General Public
   * License v2 as published by the Free Software Foundation.
   *
   * This program is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   * General Public License for more details.
   *
   * You should have received a copy of the GNU General Public
   * License along with this program; if not, write to the
   * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
   * Boston, MA 021110-1307, USA.
   */
963030817   Josef Bacik   Btrfs: use hybrid...
18
  #include <linux/pagemap.h>
0f9dd46cd   Josef Bacik   Btrfs: free space...
19
  #include <linux/sched.h>
5a0e3ad6a   Tejun Heo   include cleanup: ...
20
  #include <linux/slab.h>
963030817   Josef Bacik   Btrfs: use hybrid...
21
  #include <linux/math64.h>
6ab60601d   Josef Bacik   Btrfs: ratelimit ...
22
  #include <linux/ratelimit.h>
0f9dd46cd   Josef Bacik   Btrfs: free space...
23
  #include "ctree.h"
fa9c0d795   Chris Mason   Btrfs: rework all...
24
25
  #include "free-space-cache.h"
  #include "transaction.h"
0af3d00ba   Josef Bacik   Btrfs: create spe...
26
  #include "disk-io.h"
43be21462   Josef Bacik   Btrfs: fix free s...
27
  #include "extent_io.h"
581bb0509   Li Zefan   Btrfs: Cache free...
28
  #include "inode-map.h"
fa9c0d795   Chris Mason   Btrfs: rework all...
29

963030817   Josef Bacik   Btrfs: use hybrid...
30
31
  #define BITS_PER_BITMAP		(PAGE_CACHE_SIZE * 8)
  #define MAX_CACHE_BYTES_PER_GIG	(32 * 1024)
0f9dd46cd   Josef Bacik   Btrfs: free space...
32

34d52cb6c   Li Zefan   Btrfs: Make free ...
33
  static int link_free_space(struct btrfs_free_space_ctl *ctl,
0cb59c995   Josef Bacik   Btrfs: write out ...
34
  			   struct btrfs_free_space *info);
0414efae7   Li Zefan   Btrfs: Make the c...
35
36
37
  static struct inode *__lookup_free_space_inode(struct btrfs_root *root,
  					       struct btrfs_path *path,
  					       u64 offset)
0af3d00ba   Josef Bacik   Btrfs: create spe...
38
39
40
41
42
43
44
45
  {
  	struct btrfs_key key;
  	struct btrfs_key location;
  	struct btrfs_disk_key disk_key;
  	struct btrfs_free_space_header *header;
  	struct extent_buffer *leaf;
  	struct inode *inode = NULL;
  	int ret;
0af3d00ba   Josef Bacik   Btrfs: create spe...
46
  	key.objectid = BTRFS_FREE_SPACE_OBJECTID;
0414efae7   Li Zefan   Btrfs: Make the c...
47
  	key.offset = offset;
0af3d00ba   Josef Bacik   Btrfs: create spe...
48
49
50
51
52
53
  	key.type = 0;
  
  	ret = btrfs_search_slot(NULL, root, &key, path, 0, 0);
  	if (ret < 0)
  		return ERR_PTR(ret);
  	if (ret > 0) {
b3b4aa74b   David Sterba   btrfs: drop unuse...
54
  		btrfs_release_path(path);
0af3d00ba   Josef Bacik   Btrfs: create spe...
55
56
57
58
59
60
61
62
  		return ERR_PTR(-ENOENT);
  	}
  
  	leaf = path->nodes[0];
  	header = btrfs_item_ptr(leaf, path->slots[0],
  				struct btrfs_free_space_header);
  	btrfs_free_space_key(leaf, header, &disk_key);
  	btrfs_disk_key_to_cpu(&location, &disk_key);
b3b4aa74b   David Sterba   btrfs: drop unuse...
63
  	btrfs_release_path(path);
0af3d00ba   Josef Bacik   Btrfs: create spe...
64
65
66
67
68
69
70
71
72
73
  
  	inode = btrfs_iget(root->fs_info->sb, &location, root, NULL);
  	if (!inode)
  		return ERR_PTR(-ENOENT);
  	if (IS_ERR(inode))
  		return inode;
  	if (is_bad_inode(inode)) {
  		iput(inode);
  		return ERR_PTR(-ENOENT);
  	}
adae52b94   Miao Xie   btrfs: clear __GF...
74
  	inode->i_mapping->flags &= ~__GFP_FS;
0414efae7   Li Zefan   Btrfs: Make the c...
75
76
77
78
79
80
81
82
  	return inode;
  }
  
  struct inode *lookup_free_space_inode(struct btrfs_root *root,
  				      struct btrfs_block_group_cache
  				      *block_group, struct btrfs_path *path)
  {
  	struct inode *inode = NULL;
5b0e95bf6   Josef Bacik   Btrfs: inline che...
83
  	u32 flags = BTRFS_INODE_NODATASUM | BTRFS_INODE_NODATACOW;
0414efae7   Li Zefan   Btrfs: Make the c...
84
85
86
87
88
89
90
91
92
93
94
95
  
  	spin_lock(&block_group->lock);
  	if (block_group->inode)
  		inode = igrab(block_group->inode);
  	spin_unlock(&block_group->lock);
  	if (inode)
  		return inode;
  
  	inode = __lookup_free_space_inode(root, path,
  					  block_group->key.objectid);
  	if (IS_ERR(inode))
  		return inode;
0af3d00ba   Josef Bacik   Btrfs: create spe...
96
  	spin_lock(&block_group->lock);
5b0e95bf6   Josef Bacik   Btrfs: inline che...
97
  	if (!((BTRFS_I(inode)->flags & flags) == flags)) {
2f356126c   Josef Bacik   Btrfs: use the no...
98
99
  		printk(KERN_INFO "Old style space inode found, converting.
  ");
5b0e95bf6   Josef Bacik   Btrfs: inline che...
100
101
  		BTRFS_I(inode)->flags |= BTRFS_INODE_NODATASUM |
  			BTRFS_INODE_NODATACOW;
2f356126c   Josef Bacik   Btrfs: use the no...
102
103
  		block_group->disk_cache_state = BTRFS_DC_CLEAR;
  	}
300e4f8a5   Josef Bacik   Btrfs: put the bl...
104
  	if (!block_group->iref) {
0af3d00ba   Josef Bacik   Btrfs: create spe...
105
106
107
108
109
110
111
  		block_group->inode = igrab(inode);
  		block_group->iref = 1;
  	}
  	spin_unlock(&block_group->lock);
  
  	return inode;
  }
0414efae7   Li Zefan   Btrfs: Make the c...
112
113
114
  int __create_free_space_inode(struct btrfs_root *root,
  			      struct btrfs_trans_handle *trans,
  			      struct btrfs_path *path, u64 ino, u64 offset)
0af3d00ba   Josef Bacik   Btrfs: create spe...
115
116
117
118
119
120
  {
  	struct btrfs_key key;
  	struct btrfs_disk_key disk_key;
  	struct btrfs_free_space_header *header;
  	struct btrfs_inode_item *inode_item;
  	struct extent_buffer *leaf;
5b0e95bf6   Josef Bacik   Btrfs: inline che...
121
  	u64 flags = BTRFS_INODE_NOCOMPRESS | BTRFS_INODE_PREALLOC;
0af3d00ba   Josef Bacik   Btrfs: create spe...
122
  	int ret;
0414efae7   Li Zefan   Btrfs: Make the c...
123
  	ret = btrfs_insert_empty_inode(trans, root, path, ino);
0af3d00ba   Josef Bacik   Btrfs: create spe...
124
125
  	if (ret)
  		return ret;
5b0e95bf6   Josef Bacik   Btrfs: inline che...
126
127
128
  	/* We inline crc's for the free disk space cache */
  	if (ino != BTRFS_FREE_INO_OBJECTID)
  		flags |= BTRFS_INODE_NODATASUM | BTRFS_INODE_NODATACOW;
0af3d00ba   Josef Bacik   Btrfs: create spe...
129
130
131
132
133
134
135
136
137
138
139
140
  	leaf = path->nodes[0];
  	inode_item = btrfs_item_ptr(leaf, path->slots[0],
  				    struct btrfs_inode_item);
  	btrfs_item_key(leaf, &disk_key, path->slots[0]);
  	memset_extent_buffer(leaf, 0, (unsigned long)inode_item,
  			     sizeof(*inode_item));
  	btrfs_set_inode_generation(leaf, inode_item, trans->transid);
  	btrfs_set_inode_size(leaf, inode_item, 0);
  	btrfs_set_inode_nbytes(leaf, inode_item, 0);
  	btrfs_set_inode_uid(leaf, inode_item, 0);
  	btrfs_set_inode_gid(leaf, inode_item, 0);
  	btrfs_set_inode_mode(leaf, inode_item, S_IFREG | 0600);
5b0e95bf6   Josef Bacik   Btrfs: inline che...
141
  	btrfs_set_inode_flags(leaf, inode_item, flags);
0af3d00ba   Josef Bacik   Btrfs: create spe...
142
143
  	btrfs_set_inode_nlink(leaf, inode_item, 1);
  	btrfs_set_inode_transid(leaf, inode_item, trans->transid);
0414efae7   Li Zefan   Btrfs: Make the c...
144
  	btrfs_set_inode_block_group(leaf, inode_item, offset);
0af3d00ba   Josef Bacik   Btrfs: create spe...
145
  	btrfs_mark_buffer_dirty(leaf);
b3b4aa74b   David Sterba   btrfs: drop unuse...
146
  	btrfs_release_path(path);
0af3d00ba   Josef Bacik   Btrfs: create spe...
147
148
  
  	key.objectid = BTRFS_FREE_SPACE_OBJECTID;
0414efae7   Li Zefan   Btrfs: Make the c...
149
  	key.offset = offset;
0af3d00ba   Josef Bacik   Btrfs: create spe...
150
151
152
153
154
  	key.type = 0;
  
  	ret = btrfs_insert_empty_item(trans, root, path, &key,
  				      sizeof(struct btrfs_free_space_header));
  	if (ret < 0) {
b3b4aa74b   David Sterba   btrfs: drop unuse...
155
  		btrfs_release_path(path);
0af3d00ba   Josef Bacik   Btrfs: create spe...
156
157
158
159
160
161
162
163
  		return ret;
  	}
  	leaf = path->nodes[0];
  	header = btrfs_item_ptr(leaf, path->slots[0],
  				struct btrfs_free_space_header);
  	memset_extent_buffer(leaf, 0, (unsigned long)header, sizeof(*header));
  	btrfs_set_free_space_key(leaf, header, &disk_key);
  	btrfs_mark_buffer_dirty(leaf);
b3b4aa74b   David Sterba   btrfs: drop unuse...
164
  	btrfs_release_path(path);
0af3d00ba   Josef Bacik   Btrfs: create spe...
165
166
167
  
  	return 0;
  }
0414efae7   Li Zefan   Btrfs: Make the c...
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
  int create_free_space_inode(struct btrfs_root *root,
  			    struct btrfs_trans_handle *trans,
  			    struct btrfs_block_group_cache *block_group,
  			    struct btrfs_path *path)
  {
  	int ret;
  	u64 ino;
  
  	ret = btrfs_find_free_objectid(root, &ino);
  	if (ret < 0)
  		return ret;
  
  	return __create_free_space_inode(root, trans, path, ino,
  					 block_group->key.objectid);
  }
0af3d00ba   Josef Bacik   Btrfs: create spe...
183
184
185
186
187
  int btrfs_truncate_free_space_cache(struct btrfs_root *root,
  				    struct btrfs_trans_handle *trans,
  				    struct btrfs_path *path,
  				    struct inode *inode)
  {
65450aa64   Liu Bo   Btrfs: reset to a...
188
  	struct btrfs_block_rsv *rsv;
c8174313a   Josef Bacik   Btrfs: use the gl...
189
  	u64 needed_bytes;
0af3d00ba   Josef Bacik   Btrfs: create spe...
190
191
  	loff_t oldsize;
  	int ret = 0;
65450aa64   Liu Bo   Btrfs: reset to a...
192
  	rsv = trans->block_rsv;
c8174313a   Josef Bacik   Btrfs: use the gl...
193
194
195
196
197
198
199
200
201
202
203
204
205
  	trans->block_rsv = &root->fs_info->global_block_rsv;
  
  	/* 1 for slack space, 1 for updating the inode */
  	needed_bytes = btrfs_calc_trunc_metadata_size(root, 1) +
  		btrfs_calc_trans_metadata_size(root, 1);
  
  	spin_lock(&trans->block_rsv->lock);
  	if (trans->block_rsv->reserved < needed_bytes) {
  		spin_unlock(&trans->block_rsv->lock);
  		trans->block_rsv = rsv;
  		return -ENOSPC;
  	}
  	spin_unlock(&trans->block_rsv->lock);
0af3d00ba   Josef Bacik   Btrfs: create spe...
206
207
208
209
210
211
212
213
214
215
216
  
  	oldsize = i_size_read(inode);
  	btrfs_i_size_write(inode, 0);
  	truncate_pagecache(inode, oldsize, 0);
  
  	/*
  	 * We don't need an orphan item because truncating the free space cache
  	 * will never be split across transactions.
  	 */
  	ret = btrfs_truncate_inode_items(trans, root, inode,
  					 0, BTRFS_EXTENT_DATA_KEY);
65450aa64   Liu Bo   Btrfs: reset to a...
217

0af3d00ba   Josef Bacik   Btrfs: create spe...
218
  	if (ret) {
c8174313a   Josef Bacik   Btrfs: use the gl...
219
  		trans->block_rsv = rsv;
0af3d00ba   Josef Bacik   Btrfs: create spe...
220
221
222
  		WARN_ON(1);
  		return ret;
  	}
82d5902d9   Li Zefan   Btrfs: Support re...
223
  	ret = btrfs_update_inode(trans, root, inode);
c8174313a   Josef Bacik   Btrfs: use the gl...
224
  	trans->block_rsv = rsv;
82d5902d9   Li Zefan   Btrfs: Support re...
225
  	return ret;
0af3d00ba   Josef Bacik   Btrfs: create spe...
226
  }
9d66e233c   Josef Bacik   Btrfs: load free ...
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
  static int readahead_cache(struct inode *inode)
  {
  	struct file_ra_state *ra;
  	unsigned long last_index;
  
  	ra = kzalloc(sizeof(*ra), GFP_NOFS);
  	if (!ra)
  		return -ENOMEM;
  
  	file_ra_state_init(ra, inode->i_mapping);
  	last_index = (i_size_read(inode) - 1) >> PAGE_CACHE_SHIFT;
  
  	page_cache_sync_readahead(inode->i_mapping, ra, NULL, 0, last_index);
  
  	kfree(ra);
  
  	return 0;
  }
a67509c30   Josef Bacik   Btrfs: add a io_c...
245
246
247
248
249
250
251
252
  struct io_ctl {
  	void *cur, *orig;
  	struct page *page;
  	struct page **pages;
  	struct btrfs_root *root;
  	unsigned long size;
  	int index;
  	int num_pages;
5b0e95bf6   Josef Bacik   Btrfs: inline che...
253
  	unsigned check_crcs:1;
a67509c30   Josef Bacik   Btrfs: add a io_c...
254
255
256
257
258
259
260
261
262
263
264
265
266
  };
  
  static int io_ctl_init(struct io_ctl *io_ctl, struct inode *inode,
  		       struct btrfs_root *root)
  {
  	memset(io_ctl, 0, sizeof(struct io_ctl));
  	io_ctl->num_pages = (i_size_read(inode) + PAGE_CACHE_SIZE - 1) >>
  		PAGE_CACHE_SHIFT;
  	io_ctl->pages = kzalloc(sizeof(struct page *) * io_ctl->num_pages,
  				GFP_NOFS);
  	if (!io_ctl->pages)
  		return -ENOMEM;
  	io_ctl->root = root;
5b0e95bf6   Josef Bacik   Btrfs: inline che...
267
268
  	if (btrfs_ino(inode) != BTRFS_FREE_INO_OBJECTID)
  		io_ctl->check_crcs = 1;
a67509c30   Josef Bacik   Btrfs: add a io_c...
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
  	return 0;
  }
  
  static void io_ctl_free(struct io_ctl *io_ctl)
  {
  	kfree(io_ctl->pages);
  }
  
  static void io_ctl_unmap_page(struct io_ctl *io_ctl)
  {
  	if (io_ctl->cur) {
  		kunmap(io_ctl->page);
  		io_ctl->cur = NULL;
  		io_ctl->orig = NULL;
  	}
  }
  
  static void io_ctl_map_page(struct io_ctl *io_ctl, int clear)
  {
  	WARN_ON(io_ctl->cur);
  	BUG_ON(io_ctl->index >= io_ctl->num_pages);
  	io_ctl->page = io_ctl->pages[io_ctl->index++];
  	io_ctl->cur = kmap(io_ctl->page);
  	io_ctl->orig = io_ctl->cur;
  	io_ctl->size = PAGE_CACHE_SIZE;
  	if (clear)
  		memset(io_ctl->cur, 0, PAGE_CACHE_SIZE);
  }
  
  static void io_ctl_drop_pages(struct io_ctl *io_ctl)
  {
  	int i;
  
  	io_ctl_unmap_page(io_ctl);
  
  	for (i = 0; i < io_ctl->num_pages; i++) {
  		ClearPageChecked(io_ctl->pages[i]);
  		unlock_page(io_ctl->pages[i]);
  		page_cache_release(io_ctl->pages[i]);
  	}
  }
  
  static int io_ctl_prepare_pages(struct io_ctl *io_ctl, struct inode *inode,
  				int uptodate)
  {
  	struct page *page;
  	gfp_t mask = btrfs_alloc_write_mask(inode->i_mapping);
  	int i;
  
  	for (i = 0; i < io_ctl->num_pages; i++) {
  		page = find_or_create_page(inode->i_mapping, i, mask);
  		if (!page) {
  			io_ctl_drop_pages(io_ctl);
  			return -ENOMEM;
  		}
  		io_ctl->pages[i] = page;
  		if (uptodate && !PageUptodate(page)) {
  			btrfs_readpage(NULL, page);
  			lock_page(page);
  			if (!PageUptodate(page)) {
  				printk(KERN_ERR "btrfs: error reading free "
  				       "space cache
  ");
  				io_ctl_drop_pages(io_ctl);
  				return -EIO;
  			}
  		}
  	}
f7d61dcd6   Josef Bacik   Btrfs: clear page...
337
338
339
340
  	for (i = 0; i < io_ctl->num_pages; i++) {
  		clear_page_dirty_for_io(io_ctl->pages[i]);
  		set_page_extent_mapped(io_ctl->pages[i]);
  	}
a67509c30   Josef Bacik   Btrfs: add a io_c...
341
342
343
344
345
346
347
348
349
350
  	return 0;
  }
  
  static void io_ctl_set_generation(struct io_ctl *io_ctl, u64 generation)
  {
  	u64 *val;
  
  	io_ctl_map_page(io_ctl, 1);
  
  	/*
5b0e95bf6   Josef Bacik   Btrfs: inline che...
351
352
  	 * Skip the csum areas.  If we don't check crcs then we just have a
  	 * 64bit chunk at the front of the first page.
a67509c30   Josef Bacik   Btrfs: add a io_c...
353
  	 */
5b0e95bf6   Josef Bacik   Btrfs: inline che...
354
355
356
357
358
359
360
  	if (io_ctl->check_crcs) {
  		io_ctl->cur += (sizeof(u32) * io_ctl->num_pages);
  		io_ctl->size -= sizeof(u64) + (sizeof(u32) * io_ctl->num_pages);
  	} else {
  		io_ctl->cur += sizeof(u64);
  		io_ctl->size -= sizeof(u64) * 2;
  	}
a67509c30   Josef Bacik   Btrfs: add a io_c...
361
362
363
364
  
  	val = io_ctl->cur;
  	*val = cpu_to_le64(generation);
  	io_ctl->cur += sizeof(u64);
a67509c30   Josef Bacik   Btrfs: add a io_c...
365
366
367
368
369
  }
  
  static int io_ctl_check_generation(struct io_ctl *io_ctl, u64 generation)
  {
  	u64 *gen;
5b0e95bf6   Josef Bacik   Btrfs: inline che...
370
371
372
373
374
375
376
377
378
379
380
381
  	/*
  	 * Skip the crc area.  If we don't check crcs then we just have a 64bit
  	 * chunk at the front of the first page.
  	 */
  	if (io_ctl->check_crcs) {
  		io_ctl->cur += sizeof(u32) * io_ctl->num_pages;
  		io_ctl->size -= sizeof(u64) +
  			(sizeof(u32) * io_ctl->num_pages);
  	} else {
  		io_ctl->cur += sizeof(u64);
  		io_ctl->size -= sizeof(u64) * 2;
  	}
a67509c30   Josef Bacik   Btrfs: add a io_c...
382

a67509c30   Josef Bacik   Btrfs: add a io_c...
383
384
385
386
387
388
389
390
391
392
  	gen = io_ctl->cur;
  	if (le64_to_cpu(*gen) != generation) {
  		printk_ratelimited(KERN_ERR "btrfs: space cache generation "
  				   "(%Lu) does not match inode (%Lu)
  ", *gen,
  				   generation);
  		io_ctl_unmap_page(io_ctl);
  		return -EIO;
  	}
  	io_ctl->cur += sizeof(u64);
5b0e95bf6   Josef Bacik   Btrfs: inline che...
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
  	return 0;
  }
  
  static void io_ctl_set_crc(struct io_ctl *io_ctl, int index)
  {
  	u32 *tmp;
  	u32 crc = ~(u32)0;
  	unsigned offset = 0;
  
  	if (!io_ctl->check_crcs) {
  		io_ctl_unmap_page(io_ctl);
  		return;
  	}
  
  	if (index == 0)
cb54f2571   Justin P. Mattock   btrfs: free-space...
408
  		offset = sizeof(u32) * io_ctl->num_pages;
5b0e95bf6   Josef Bacik   Btrfs: inline che...
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
  
  	crc = btrfs_csum_data(io_ctl->root, io_ctl->orig + offset, crc,
  			      PAGE_CACHE_SIZE - offset);
  	btrfs_csum_final(crc, (char *)&crc);
  	io_ctl_unmap_page(io_ctl);
  	tmp = kmap(io_ctl->pages[0]);
  	tmp += index;
  	*tmp = crc;
  	kunmap(io_ctl->pages[0]);
  }
  
  static int io_ctl_check_crc(struct io_ctl *io_ctl, int index)
  {
  	u32 *tmp, val;
  	u32 crc = ~(u32)0;
  	unsigned offset = 0;
  
  	if (!io_ctl->check_crcs) {
  		io_ctl_map_page(io_ctl, 0);
  		return 0;
  	}
  
  	if (index == 0)
  		offset = sizeof(u32) * io_ctl->num_pages;
  
  	tmp = kmap(io_ctl->pages[0]);
  	tmp += index;
  	val = *tmp;
  	kunmap(io_ctl->pages[0]);
  
  	io_ctl_map_page(io_ctl, 0);
  	crc = btrfs_csum_data(io_ctl->root, io_ctl->orig + offset, crc,
  			      PAGE_CACHE_SIZE - offset);
  	btrfs_csum_final(crc, (char *)&crc);
  	if (val != crc) {
  		printk_ratelimited(KERN_ERR "btrfs: csum mismatch on free "
  				   "space cache
  ");
  		io_ctl_unmap_page(io_ctl);
  		return -EIO;
  	}
a67509c30   Josef Bacik   Btrfs: add a io_c...
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
  	return 0;
  }
  
  static int io_ctl_add_entry(struct io_ctl *io_ctl, u64 offset, u64 bytes,
  			    void *bitmap)
  {
  	struct btrfs_free_space_entry *entry;
  
  	if (!io_ctl->cur)
  		return -ENOSPC;
  
  	entry = io_ctl->cur;
  	entry->offset = cpu_to_le64(offset);
  	entry->bytes = cpu_to_le64(bytes);
  	entry->type = (bitmap) ? BTRFS_FREE_SPACE_BITMAP :
  		BTRFS_FREE_SPACE_EXTENT;
  	io_ctl->cur += sizeof(struct btrfs_free_space_entry);
  	io_ctl->size -= sizeof(struct btrfs_free_space_entry);
  
  	if (io_ctl->size >= sizeof(struct btrfs_free_space_entry))
  		return 0;
5b0e95bf6   Josef Bacik   Btrfs: inline che...
471
  	io_ctl_set_crc(io_ctl, io_ctl->index - 1);
a67509c30   Josef Bacik   Btrfs: add a io_c...
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
  
  	/* No more pages to map */
  	if (io_ctl->index >= io_ctl->num_pages)
  		return 0;
  
  	/* map the next page */
  	io_ctl_map_page(io_ctl, 1);
  	return 0;
  }
  
  static int io_ctl_add_bitmap(struct io_ctl *io_ctl, void *bitmap)
  {
  	if (!io_ctl->cur)
  		return -ENOSPC;
  
  	/*
  	 * If we aren't at the start of the current page, unmap this one and
  	 * map the next one if there is any left.
  	 */
  	if (io_ctl->cur != io_ctl->orig) {
5b0e95bf6   Josef Bacik   Btrfs: inline che...
492
  		io_ctl_set_crc(io_ctl, io_ctl->index - 1);
a67509c30   Josef Bacik   Btrfs: add a io_c...
493
494
495
496
497
498
  		if (io_ctl->index >= io_ctl->num_pages)
  			return -ENOSPC;
  		io_ctl_map_page(io_ctl, 0);
  	}
  
  	memcpy(io_ctl->cur, bitmap, PAGE_CACHE_SIZE);
5b0e95bf6   Josef Bacik   Btrfs: inline che...
499
  	io_ctl_set_crc(io_ctl, io_ctl->index - 1);
a67509c30   Josef Bacik   Btrfs: add a io_c...
500
501
502
503
504
505
506
  	if (io_ctl->index < io_ctl->num_pages)
  		io_ctl_map_page(io_ctl, 0);
  	return 0;
  }
  
  static void io_ctl_zero_remaining_pages(struct io_ctl *io_ctl)
  {
5b0e95bf6   Josef Bacik   Btrfs: inline che...
507
508
509
510
511
512
513
514
  	/*
  	 * If we're not on the boundary we know we've modified the page and we
  	 * need to crc the page.
  	 */
  	if (io_ctl->cur != io_ctl->orig)
  		io_ctl_set_crc(io_ctl, io_ctl->index - 1);
  	else
  		io_ctl_unmap_page(io_ctl);
a67509c30   Josef Bacik   Btrfs: add a io_c...
515
516
517
  
  	while (io_ctl->index < io_ctl->num_pages) {
  		io_ctl_map_page(io_ctl, 1);
5b0e95bf6   Josef Bacik   Btrfs: inline che...
518
  		io_ctl_set_crc(io_ctl, io_ctl->index - 1);
a67509c30   Josef Bacik   Btrfs: add a io_c...
519
520
  	}
  }
5b0e95bf6   Josef Bacik   Btrfs: inline che...
521
522
  static int io_ctl_read_entry(struct io_ctl *io_ctl,
  			    struct btrfs_free_space *entry, u8 *type)
a67509c30   Josef Bacik   Btrfs: add a io_c...
523
524
  {
  	struct btrfs_free_space_entry *e;
2f120c05e   Josef Bacik   Btrfs: only map p...
525
526
527
528
529
530
531
  	int ret;
  
  	if (!io_ctl->cur) {
  		ret = io_ctl_check_crc(io_ctl, io_ctl->index);
  		if (ret)
  			return ret;
  	}
a67509c30   Josef Bacik   Btrfs: add a io_c...
532
533
534
535
  
  	e = io_ctl->cur;
  	entry->offset = le64_to_cpu(e->offset);
  	entry->bytes = le64_to_cpu(e->bytes);
5b0e95bf6   Josef Bacik   Btrfs: inline che...
536
  	*type = e->type;
a67509c30   Josef Bacik   Btrfs: add a io_c...
537
538
539
540
  	io_ctl->cur += sizeof(struct btrfs_free_space_entry);
  	io_ctl->size -= sizeof(struct btrfs_free_space_entry);
  
  	if (io_ctl->size >= sizeof(struct btrfs_free_space_entry))
5b0e95bf6   Josef Bacik   Btrfs: inline che...
541
  		return 0;
a67509c30   Josef Bacik   Btrfs: add a io_c...
542
543
  
  	io_ctl_unmap_page(io_ctl);
2f120c05e   Josef Bacik   Btrfs: only map p...
544
  	return 0;
a67509c30   Josef Bacik   Btrfs: add a io_c...
545
  }
5b0e95bf6   Josef Bacik   Btrfs: inline che...
546
547
  static int io_ctl_read_bitmap(struct io_ctl *io_ctl,
  			      struct btrfs_free_space *entry)
a67509c30   Josef Bacik   Btrfs: add a io_c...
548
  {
5b0e95bf6   Josef Bacik   Btrfs: inline che...
549
  	int ret;
5b0e95bf6   Josef Bacik   Btrfs: inline che...
550
551
552
  	ret = io_ctl_check_crc(io_ctl, io_ctl->index);
  	if (ret)
  		return ret;
a67509c30   Josef Bacik   Btrfs: add a io_c...
553
554
  	memcpy(entry->bitmap, io_ctl->cur, PAGE_CACHE_SIZE);
  	io_ctl_unmap_page(io_ctl);
5b0e95bf6   Josef Bacik   Btrfs: inline che...
555
556
  
  	return 0;
a67509c30   Josef Bacik   Btrfs: add a io_c...
557
  }
0414efae7   Li Zefan   Btrfs: Make the c...
558
559
560
  int __load_free_space_cache(struct btrfs_root *root, struct inode *inode,
  			    struct btrfs_free_space_ctl *ctl,
  			    struct btrfs_path *path, u64 offset)
9d66e233c   Josef Bacik   Btrfs: load free ...
561
  {
9d66e233c   Josef Bacik   Btrfs: load free ...
562
563
  	struct btrfs_free_space_header *header;
  	struct extent_buffer *leaf;
a67509c30   Josef Bacik   Btrfs: add a io_c...
564
  	struct io_ctl io_ctl;
9d66e233c   Josef Bacik   Btrfs: load free ...
565
  	struct btrfs_key key;
a67509c30   Josef Bacik   Btrfs: add a io_c...
566
  	struct btrfs_free_space *e, *n;
9d66e233c   Josef Bacik   Btrfs: load free ...
567
568
569
570
  	struct list_head bitmaps;
  	u64 num_entries;
  	u64 num_bitmaps;
  	u64 generation;
a67509c30   Josef Bacik   Btrfs: add a io_c...
571
  	u8 type;
f6a398298   Josef Bacik   Btrfs: fix duplic...
572
  	int ret = 0;
9d66e233c   Josef Bacik   Btrfs: load free ...
573
574
  
  	INIT_LIST_HEAD(&bitmaps);
9d66e233c   Josef Bacik   Btrfs: load free ...
575
  	/* Nothing in the space cache, goodbye */
0414efae7   Li Zefan   Btrfs: Make the c...
576
  	if (!i_size_read(inode))
a67509c30   Josef Bacik   Btrfs: add a io_c...
577
  		return 0;
9d66e233c   Josef Bacik   Btrfs: load free ...
578
579
  
  	key.objectid = BTRFS_FREE_SPACE_OBJECTID;
0414efae7   Li Zefan   Btrfs: Make the c...
580
  	key.offset = offset;
9d66e233c   Josef Bacik   Btrfs: load free ...
581
582
583
  	key.type = 0;
  
  	ret = btrfs_search_slot(NULL, root, &key, path, 0, 0);
0414efae7   Li Zefan   Btrfs: Make the c...
584
  	if (ret < 0)
a67509c30   Josef Bacik   Btrfs: add a io_c...
585
  		return 0;
0414efae7   Li Zefan   Btrfs: Make the c...
586
  	else if (ret > 0) {
945d8962c   Chris Mason   Merge branch 'cle...
587
  		btrfs_release_path(path);
a67509c30   Josef Bacik   Btrfs: add a io_c...
588
  		return 0;
9d66e233c   Josef Bacik   Btrfs: load free ...
589
  	}
0414efae7   Li Zefan   Btrfs: Make the c...
590
  	ret = -1;
9d66e233c   Josef Bacik   Btrfs: load free ...
591
592
593
594
595
596
  	leaf = path->nodes[0];
  	header = btrfs_item_ptr(leaf, path->slots[0],
  				struct btrfs_free_space_header);
  	num_entries = btrfs_free_space_entries(leaf, header);
  	num_bitmaps = btrfs_free_space_bitmaps(leaf, header);
  	generation = btrfs_free_space_generation(leaf, header);
945d8962c   Chris Mason   Merge branch 'cle...
597
  	btrfs_release_path(path);
9d66e233c   Josef Bacik   Btrfs: load free ...
598
599
600
  
  	if (BTRFS_I(inode)->generation != generation) {
  		printk(KERN_ERR "btrfs: free space inode generation (%llu) did"
0414efae7   Li Zefan   Btrfs: Make the c...
601
602
  		       " not match free space cache generation (%llu)
  ",
9d66e233c   Josef Bacik   Btrfs: load free ...
603
  		       (unsigned long long)BTRFS_I(inode)->generation,
0414efae7   Li Zefan   Btrfs: Make the c...
604
  		       (unsigned long long)generation);
a67509c30   Josef Bacik   Btrfs: add a io_c...
605
  		return 0;
9d66e233c   Josef Bacik   Btrfs: load free ...
606
607
608
  	}
  
  	if (!num_entries)
a67509c30   Josef Bacik   Btrfs: add a io_c...
609
  		return 0;
9d66e233c   Josef Bacik   Btrfs: load free ...
610

a67509c30   Josef Bacik   Btrfs: add a io_c...
611
  	io_ctl_init(&io_ctl, inode, root);
9d66e233c   Josef Bacik   Btrfs: load free ...
612
  	ret = readahead_cache(inode);
0414efae7   Li Zefan   Btrfs: Make the c...
613
  	if (ret)
9d66e233c   Josef Bacik   Btrfs: load free ...
614
  		goto out;
9d66e233c   Josef Bacik   Btrfs: load free ...
615

a67509c30   Josef Bacik   Btrfs: add a io_c...
616
617
618
  	ret = io_ctl_prepare_pages(&io_ctl, inode, 1);
  	if (ret)
  		goto out;
9d66e233c   Josef Bacik   Btrfs: load free ...
619

5b0e95bf6   Josef Bacik   Btrfs: inline che...
620
621
622
  	ret = io_ctl_check_crc(&io_ctl, 0);
  	if (ret)
  		goto free_cache;
a67509c30   Josef Bacik   Btrfs: add a io_c...
623
624
625
  	ret = io_ctl_check_generation(&io_ctl, generation);
  	if (ret)
  		goto free_cache;
9d66e233c   Josef Bacik   Btrfs: load free ...
626

a67509c30   Josef Bacik   Btrfs: add a io_c...
627
628
629
630
  	while (num_entries) {
  		e = kmem_cache_zalloc(btrfs_free_space_cachep,
  				      GFP_NOFS);
  		if (!e)
9d66e233c   Josef Bacik   Btrfs: load free ...
631
  			goto free_cache;
9d66e233c   Josef Bacik   Btrfs: load free ...
632

5b0e95bf6   Josef Bacik   Btrfs: inline che...
633
634
635
636
637
  		ret = io_ctl_read_entry(&io_ctl, e, &type);
  		if (ret) {
  			kmem_cache_free(btrfs_free_space_cachep, e);
  			goto free_cache;
  		}
a67509c30   Josef Bacik   Btrfs: add a io_c...
638
639
640
  		if (!e->bytes) {
  			kmem_cache_free(btrfs_free_space_cachep, e);
  			goto free_cache;
9d66e233c   Josef Bacik   Btrfs: load free ...
641
  		}
a67509c30   Josef Bacik   Btrfs: add a io_c...
642
643
644
645
646
647
648
649
650
651
  
  		if (type == BTRFS_FREE_SPACE_EXTENT) {
  			spin_lock(&ctl->tree_lock);
  			ret = link_free_space(ctl, e);
  			spin_unlock(&ctl->tree_lock);
  			if (ret) {
  				printk(KERN_ERR "Duplicate entries in "
  				       "free space cache, dumping
  ");
  				kmem_cache_free(btrfs_free_space_cachep, e);
9d66e233c   Josef Bacik   Btrfs: load free ...
652
653
  				goto free_cache;
  			}
a67509c30   Josef Bacik   Btrfs: add a io_c...
654
655
656
657
658
659
660
  		} else {
  			BUG_ON(!num_bitmaps);
  			num_bitmaps--;
  			e->bitmap = kzalloc(PAGE_CACHE_SIZE, GFP_NOFS);
  			if (!e->bitmap) {
  				kmem_cache_free(
  					btrfs_free_space_cachep, e);
9d66e233c   Josef Bacik   Btrfs: load free ...
661
662
  				goto free_cache;
  			}
a67509c30   Josef Bacik   Btrfs: add a io_c...
663
664
665
666
667
668
669
670
671
  			spin_lock(&ctl->tree_lock);
  			ret = link_free_space(ctl, e);
  			ctl->total_bitmaps++;
  			ctl->op->recalc_thresholds(ctl);
  			spin_unlock(&ctl->tree_lock);
  			if (ret) {
  				printk(KERN_ERR "Duplicate entries in "
  				       "free space cache, dumping
  ");
dc89e9824   Josef Bacik   Btrfs: use a slab...
672
  				kmem_cache_free(btrfs_free_space_cachep, e);
9d66e233c   Josef Bacik   Btrfs: load free ...
673
674
  				goto free_cache;
  			}
a67509c30   Josef Bacik   Btrfs: add a io_c...
675
  			list_add_tail(&e->list, &bitmaps);
9d66e233c   Josef Bacik   Btrfs: load free ...
676
  		}
a67509c30   Josef Bacik   Btrfs: add a io_c...
677
678
  		num_entries--;
  	}
9d66e233c   Josef Bacik   Btrfs: load free ...
679

2f120c05e   Josef Bacik   Btrfs: only map p...
680
  	io_ctl_unmap_page(&io_ctl);
a67509c30   Josef Bacik   Btrfs: add a io_c...
681
682
683
684
685
  	/*
  	 * We add the bitmaps at the end of the entries in order that
  	 * the bitmap entries are added to the cache.
  	 */
  	list_for_each_entry_safe(e, n, &bitmaps, list) {
9d66e233c   Josef Bacik   Btrfs: load free ...
686
  		list_del_init(&e->list);
5b0e95bf6   Josef Bacik   Btrfs: inline che...
687
688
689
  		ret = io_ctl_read_bitmap(&io_ctl, e);
  		if (ret)
  			goto free_cache;
9d66e233c   Josef Bacik   Btrfs: load free ...
690
  	}
a67509c30   Josef Bacik   Btrfs: add a io_c...
691
  	io_ctl_drop_pages(&io_ctl);
9d66e233c   Josef Bacik   Btrfs: load free ...
692
693
  	ret = 1;
  out:
a67509c30   Josef Bacik   Btrfs: add a io_c...
694
  	io_ctl_free(&io_ctl);
9d66e233c   Josef Bacik   Btrfs: load free ...
695
  	return ret;
9d66e233c   Josef Bacik   Btrfs: load free ...
696
  free_cache:
a67509c30   Josef Bacik   Btrfs: add a io_c...
697
  	io_ctl_drop_pages(&io_ctl);
0414efae7   Li Zefan   Btrfs: Make the c...
698
  	__btrfs_remove_free_space_cache(ctl);
9d66e233c   Josef Bacik   Btrfs: load free ...
699
700
  	goto out;
  }
0414efae7   Li Zefan   Btrfs: Make the c...
701
702
  int load_free_space_cache(struct btrfs_fs_info *fs_info,
  			  struct btrfs_block_group_cache *block_group)
0cb59c995   Josef Bacik   Btrfs: write out ...
703
  {
34d52cb6c   Li Zefan   Btrfs: Make free ...
704
  	struct btrfs_free_space_ctl *ctl = block_group->free_space_ctl;
0414efae7   Li Zefan   Btrfs: Make the c...
705
706
707
  	struct btrfs_root *root = fs_info->tree_root;
  	struct inode *inode;
  	struct btrfs_path *path;
5b0e95bf6   Josef Bacik   Btrfs: inline che...
708
  	int ret = 0;
0414efae7   Li Zefan   Btrfs: Make the c...
709
710
711
712
713
714
715
  	bool matched;
  	u64 used = btrfs_block_group_used(&block_group->item);
  
  	/*
  	 * If we're unmounting then just return, since this does a search on the
  	 * normal root and not the commit root and we could deadlock.
  	 */
7841cb289   David Sterba   btrfs: add helper...
716
  	if (btrfs_fs_closing(fs_info))
0414efae7   Li Zefan   Btrfs: Make the c...
717
718
719
720
721
722
  		return 0;
  
  	/*
  	 * If this block group has been marked to be cleared for one reason or
  	 * another then we can't trust the on disk cache, so just return.
  	 */
9d66e233c   Josef Bacik   Btrfs: load free ...
723
  	spin_lock(&block_group->lock);
0414efae7   Li Zefan   Btrfs: Make the c...
724
725
726
727
  	if (block_group->disk_cache_state != BTRFS_DC_WRITTEN) {
  		spin_unlock(&block_group->lock);
  		return 0;
  	}
9d66e233c   Josef Bacik   Btrfs: load free ...
728
  	spin_unlock(&block_group->lock);
0414efae7   Li Zefan   Btrfs: Make the c...
729
730
731
732
733
734
735
736
737
738
  
  	path = btrfs_alloc_path();
  	if (!path)
  		return 0;
  
  	inode = lookup_free_space_inode(root, block_group, path);
  	if (IS_ERR(inode)) {
  		btrfs_free_path(path);
  		return 0;
  	}
5b0e95bf6   Josef Bacik   Btrfs: inline che...
739
740
741
742
743
744
745
  	/* We may have converted the inode and made the cache invalid. */
  	spin_lock(&block_group->lock);
  	if (block_group->disk_cache_state != BTRFS_DC_WRITTEN) {
  		spin_unlock(&block_group->lock);
  		goto out;
  	}
  	spin_unlock(&block_group->lock);
0414efae7   Li Zefan   Btrfs: Make the c...
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
  	ret = __load_free_space_cache(fs_info->tree_root, inode, ctl,
  				      path, block_group->key.objectid);
  	btrfs_free_path(path);
  	if (ret <= 0)
  		goto out;
  
  	spin_lock(&ctl->tree_lock);
  	matched = (ctl->free_space == (block_group->key.offset - used -
  				       block_group->bytes_super));
  	spin_unlock(&ctl->tree_lock);
  
  	if (!matched) {
  		__btrfs_remove_free_space_cache(ctl);
  		printk(KERN_ERR "block group %llu has an wrong amount of free "
  		       "space
  ", block_group->key.objectid);
  		ret = -1;
  	}
  out:
  	if (ret < 0) {
  		/* This cache is bogus, make sure it gets cleared */
  		spin_lock(&block_group->lock);
  		block_group->disk_cache_state = BTRFS_DC_CLEAR;
  		spin_unlock(&block_group->lock);
82d5902d9   Li Zefan   Btrfs: Support re...
770
  		ret = 0;
0414efae7   Li Zefan   Btrfs: Make the c...
771
772
773
774
775
776
777
778
  
  		printk(KERN_ERR "btrfs: failed to load free space cache "
  		       "for block group %llu
  ", block_group->key.objectid);
  	}
  
  	iput(inode);
  	return ret;
9d66e233c   Josef Bacik   Btrfs: load free ...
779
  }
c09544e07   Josef Bacik   Btrfs: handle eno...
780
781
782
783
784
785
786
787
788
789
790
791
792
  /**
   * __btrfs_write_out_cache - write out cached info to an inode
   * @root - the root the inode belongs to
   * @ctl - the free space cache we are going to write out
   * @block_group - the block_group for this cache if it belongs to a block_group
   * @trans - the trans handle
   * @path - the path to use
   * @offset - the offset for the key we'll insert
   *
   * This function writes out a free space cache struct to disk for quick recovery
   * on mount.  This will return 0 if it was successfull in writing the cache out,
   * and -1 if it was not.
   */
0414efae7   Li Zefan   Btrfs: Make the c...
793
794
795
796
797
  int __btrfs_write_out_cache(struct btrfs_root *root, struct inode *inode,
  			    struct btrfs_free_space_ctl *ctl,
  			    struct btrfs_block_group_cache *block_group,
  			    struct btrfs_trans_handle *trans,
  			    struct btrfs_path *path, u64 offset)
0cb59c995   Josef Bacik   Btrfs: write out ...
798
799
800
  {
  	struct btrfs_free_space_header *header;
  	struct extent_buffer *leaf;
0cb59c995   Josef Bacik   Btrfs: write out ...
801
802
  	struct rb_node *node;
  	struct list_head *pos, *n;
0cb59c995   Josef Bacik   Btrfs: write out ...
803
  	struct extent_state *cached_state = NULL;
43be21462   Josef Bacik   Btrfs: fix free s...
804
805
  	struct btrfs_free_cluster *cluster = NULL;
  	struct extent_io_tree *unpin = NULL;
a67509c30   Josef Bacik   Btrfs: add a io_c...
806
  	struct io_ctl io_ctl;
0cb59c995   Josef Bacik   Btrfs: write out ...
807
808
  	struct list_head bitmap_list;
  	struct btrfs_key key;
43be21462   Josef Bacik   Btrfs: fix free s...
809
  	u64 start, end, len;
0cb59c995   Josef Bacik   Btrfs: write out ...
810
811
  	int entries = 0;
  	int bitmaps = 0;
c09544e07   Josef Bacik   Btrfs: handle eno...
812
813
  	int ret;
  	int err = -1;
0cb59c995   Josef Bacik   Btrfs: write out ...
814

0cb59c995   Josef Bacik   Btrfs: write out ...
815
  	INIT_LIST_HEAD(&bitmap_list);
0414efae7   Li Zefan   Btrfs: Make the c...
816
817
  	if (!i_size_read(inode))
  		return -1;
2b20982e3   Josef Bacik   Btrfs: deal with ...
818

a67509c30   Josef Bacik   Btrfs: add a io_c...
819
  	io_ctl_init(&io_ctl, inode, root);
be1a12a0d   Josef Bacik   Btrfs: deal with ...
820

43be21462   Josef Bacik   Btrfs: fix free s...
821
  	/* Get the cluster for this block_group if it exists */
0414efae7   Li Zefan   Btrfs: Make the c...
822
  	if (block_group && !list_empty(&block_group->cluster_list))
43be21462   Josef Bacik   Btrfs: fix free s...
823
824
825
826
827
828
829
830
831
  		cluster = list_entry(block_group->cluster_list.next,
  				     struct btrfs_free_cluster,
  				     block_group_list);
  
  	/*
  	 * We shouldn't have switched the pinned extents yet so this is the
  	 * right one
  	 */
  	unpin = root->fs_info->pinned_extents;
a67509c30   Josef Bacik   Btrfs: add a io_c...
832
833
  	/* Lock all pages first so we can lock the extent safely. */
  	io_ctl_prepare_pages(&io_ctl, inode, 0);
0cb59c995   Josef Bacik   Btrfs: write out ...
834

0cb59c995   Josef Bacik   Btrfs: write out ...
835
836
  	lock_extent_bits(&BTRFS_I(inode)->io_tree, 0, i_size_read(inode) - 1,
  			 0, &cached_state, GFP_NOFS);
43be21462   Josef Bacik   Btrfs: fix free s...
837
838
839
840
  	/*
  	 * When searching for pinned extents, we need to start at our start
  	 * offset.
  	 */
0414efae7   Li Zefan   Btrfs: Make the c...
841
842
  	if (block_group)
  		start = block_group->key.objectid;
43be21462   Josef Bacik   Btrfs: fix free s...
843

f75b130e9   Josef Bacik   Btrfs: don't skip...
844
845
846
847
848
  	node = rb_first(&ctl->free_space_offset);
  	if (!node && cluster) {
  		node = rb_first(&cluster->root);
  		cluster = NULL;
  	}
5b0e95bf6   Josef Bacik   Btrfs: inline che...
849
850
851
852
853
854
  	/* Make sure we can fit our crcs into the first page */
  	if (io_ctl.check_crcs &&
  	    (io_ctl.num_pages * sizeof(u32)) >= PAGE_CACHE_SIZE) {
  		WARN_ON(1);
  		goto out_nospc;
  	}
a67509c30   Josef Bacik   Btrfs: add a io_c...
855
  	io_ctl_set_generation(&io_ctl, trans->transid);
43be21462   Josef Bacik   Btrfs: fix free s...
856

a67509c30   Josef Bacik   Btrfs: add a io_c...
857
858
859
  	/* Write out the extent entries */
  	while (node) {
  		struct btrfs_free_space *e;
0cb59c995   Josef Bacik   Btrfs: write out ...
860

a67509c30   Josef Bacik   Btrfs: add a io_c...
861
862
  		e = rb_entry(node, struct btrfs_free_space, offset_index);
  		entries++;
0cb59c995   Josef Bacik   Btrfs: write out ...
863

a67509c30   Josef Bacik   Btrfs: add a io_c...
864
865
866
867
  		ret = io_ctl_add_entry(&io_ctl, e->offset, e->bytes,
  				       e->bitmap);
  		if (ret)
  			goto out_nospc;
2f356126c   Josef Bacik   Btrfs: use the no...
868

a67509c30   Josef Bacik   Btrfs: add a io_c...
869
870
871
  		if (e->bitmap) {
  			list_add_tail(&e->list, &bitmap_list);
  			bitmaps++;
2f356126c   Josef Bacik   Btrfs: use the no...
872
  		}
a67509c30   Josef Bacik   Btrfs: add a io_c...
873
874
875
876
  		node = rb_next(node);
  		if (!node && cluster) {
  			node = rb_first(&cluster->root);
  			cluster = NULL;
43be21462   Josef Bacik   Btrfs: fix free s...
877
  		}
a67509c30   Josef Bacik   Btrfs: add a io_c...
878
  	}
43be21462   Josef Bacik   Btrfs: fix free s...
879

a67509c30   Josef Bacik   Btrfs: add a io_c...
880
881
882
883
884
885
886
887
888
889
890
  	/*
  	 * We want to add any pinned extents to our free space cache
  	 * so we don't leak the space
  	 */
  	while (block_group && (start < block_group->key.objectid +
  			       block_group->key.offset)) {
  		ret = find_first_extent_bit(unpin, start, &start, &end,
  					    EXTENT_DIRTY);
  		if (ret) {
  			ret = 0;
  			break;
0cb59c995   Josef Bacik   Btrfs: write out ...
891
  		}
0cb59c995   Josef Bacik   Btrfs: write out ...
892

a67509c30   Josef Bacik   Btrfs: add a io_c...
893
894
895
896
  		/* This pinned extent is out of our range */
  		if (start >= block_group->key.objectid +
  		    block_group->key.offset)
  			break;
2f356126c   Josef Bacik   Btrfs: use the no...
897

a67509c30   Josef Bacik   Btrfs: add a io_c...
898
899
900
  		len = block_group->key.objectid +
  			block_group->key.offset - start;
  		len = min(len, end + 1 - start);
0cb59c995   Josef Bacik   Btrfs: write out ...
901

a67509c30   Josef Bacik   Btrfs: add a io_c...
902
903
904
905
  		entries++;
  		ret = io_ctl_add_entry(&io_ctl, start, len, NULL);
  		if (ret)
  			goto out_nospc;
0cb59c995   Josef Bacik   Btrfs: write out ...
906

a67509c30   Josef Bacik   Btrfs: add a io_c...
907
908
  		start = end + 1;
  	}
0cb59c995   Josef Bacik   Btrfs: write out ...
909
910
911
  
  	/* Write out the bitmaps */
  	list_for_each_safe(pos, n, &bitmap_list) {
0cb59c995   Josef Bacik   Btrfs: write out ...
912
913
  		struct btrfs_free_space *entry =
  			list_entry(pos, struct btrfs_free_space, list);
a67509c30   Josef Bacik   Btrfs: add a io_c...
914
915
916
  		ret = io_ctl_add_bitmap(&io_ctl, entry->bitmap);
  		if (ret)
  			goto out_nospc;
0cb59c995   Josef Bacik   Btrfs: write out ...
917
  		list_del_init(&entry->list);
be1a12a0d   Josef Bacik   Btrfs: deal with ...
918
  	}
0cb59c995   Josef Bacik   Btrfs: write out ...
919
  	/* Zero out the rest of the pages just to make sure */
a67509c30   Josef Bacik   Btrfs: add a io_c...
920
  	io_ctl_zero_remaining_pages(&io_ctl);
0cb59c995   Josef Bacik   Btrfs: write out ...
921

a67509c30   Josef Bacik   Btrfs: add a io_c...
922
923
924
  	ret = btrfs_dirty_pages(root, inode, io_ctl.pages, io_ctl.num_pages,
  				0, i_size_read(inode), &cached_state);
  	io_ctl_drop_pages(&io_ctl);
0cb59c995   Josef Bacik   Btrfs: write out ...
925
926
  	unlock_extent_cached(&BTRFS_I(inode)->io_tree, 0,
  			     i_size_read(inode) - 1, &cached_state, GFP_NOFS);
c09544e07   Josef Bacik   Btrfs: handle eno...
927
  	if (ret)
2f356126c   Josef Bacik   Btrfs: use the no...
928
  		goto out;
be1a12a0d   Josef Bacik   Btrfs: deal with ...
929

be1a12a0d   Josef Bacik   Btrfs: deal with ...
930

549b4fdb8   Josef Bacik   Btrfs: check the ...
931
932
933
  	ret = filemap_write_and_wait(inode->i_mapping);
  	if (ret)
  		goto out;
0cb59c995   Josef Bacik   Btrfs: write out ...
934
935
  
  	key.objectid = BTRFS_FREE_SPACE_OBJECTID;
0414efae7   Li Zefan   Btrfs: Make the c...
936
  	key.offset = offset;
0cb59c995   Josef Bacik   Btrfs: write out ...
937
  	key.type = 0;
a9b5fcddc   Josef Bacik   Btrfs: fix call t...
938
  	ret = btrfs_search_slot(trans, root, &key, path, 0, 1);
0cb59c995   Josef Bacik   Btrfs: write out ...
939
  	if (ret < 0) {
a67509c30   Josef Bacik   Btrfs: add a io_c...
940
  		clear_extent_bit(&BTRFS_I(inode)->io_tree, 0, inode->i_size - 1,
5b0e95bf6   Josef Bacik   Btrfs: inline che...
941
942
  				 EXTENT_DIRTY | EXTENT_DELALLOC, 0, 0, NULL,
  				 GFP_NOFS);
2f356126c   Josef Bacik   Btrfs: use the no...
943
  		goto out;
0cb59c995   Josef Bacik   Btrfs: write out ...
944
945
946
947
948
949
950
951
  	}
  	leaf = path->nodes[0];
  	if (ret > 0) {
  		struct btrfs_key found_key;
  		BUG_ON(!path->slots[0]);
  		path->slots[0]--;
  		btrfs_item_key_to_cpu(leaf, &found_key, path->slots[0]);
  		if (found_key.objectid != BTRFS_FREE_SPACE_OBJECTID ||
0414efae7   Li Zefan   Btrfs: Make the c...
952
  		    found_key.offset != offset) {
a67509c30   Josef Bacik   Btrfs: add a io_c...
953
954
  			clear_extent_bit(&BTRFS_I(inode)->io_tree, 0,
  					 inode->i_size - 1,
5b0e95bf6   Josef Bacik   Btrfs: inline che...
955
956
  					 EXTENT_DIRTY | EXTENT_DELALLOC, 0, 0,
  					 NULL, GFP_NOFS);
b3b4aa74b   David Sterba   btrfs: drop unuse...
957
  			btrfs_release_path(path);
2f356126c   Josef Bacik   Btrfs: use the no...
958
  			goto out;
0cb59c995   Josef Bacik   Btrfs: write out ...
959
960
  		}
  	}
549b4fdb8   Josef Bacik   Btrfs: check the ...
961
962
  
  	BTRFS_I(inode)->generation = trans->transid;
0cb59c995   Josef Bacik   Btrfs: write out ...
963
964
965
966
967
968
  	header = btrfs_item_ptr(leaf, path->slots[0],
  				struct btrfs_free_space_header);
  	btrfs_set_free_space_entries(leaf, header, entries);
  	btrfs_set_free_space_bitmaps(leaf, header, bitmaps);
  	btrfs_set_free_space_generation(leaf, header, trans->transid);
  	btrfs_mark_buffer_dirty(leaf);
b3b4aa74b   David Sterba   btrfs: drop unuse...
969
  	btrfs_release_path(path);
0cb59c995   Josef Bacik   Btrfs: write out ...
970

c09544e07   Josef Bacik   Btrfs: handle eno...
971
  	err = 0;
2f356126c   Josef Bacik   Btrfs: use the no...
972
  out:
a67509c30   Josef Bacik   Btrfs: add a io_c...
973
  	io_ctl_free(&io_ctl);
c09544e07   Josef Bacik   Btrfs: handle eno...
974
  	if (err) {
a67509c30   Josef Bacik   Btrfs: add a io_c...
975
  		invalidate_inode_pages2(inode->i_mapping);
0cb59c995   Josef Bacik   Btrfs: write out ...
976
977
  		BTRFS_I(inode)->generation = 0;
  	}
0cb59c995   Josef Bacik   Btrfs: write out ...
978
  	btrfs_update_inode(trans, root, inode);
c09544e07   Josef Bacik   Btrfs: handle eno...
979
  	return err;
a67509c30   Josef Bacik   Btrfs: add a io_c...
980
981
982
983
984
985
986
987
988
989
990
  
  out_nospc:
  	list_for_each_safe(pos, n, &bitmap_list) {
  		struct btrfs_free_space *entry =
  			list_entry(pos, struct btrfs_free_space, list);
  		list_del_init(&entry->list);
  	}
  	io_ctl_drop_pages(&io_ctl);
  	unlock_extent_cached(&BTRFS_I(inode)->io_tree, 0,
  			     i_size_read(inode) - 1, &cached_state, GFP_NOFS);
  	goto out;
0414efae7   Li Zefan   Btrfs: Make the c...
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
  }
  
  int btrfs_write_out_cache(struct btrfs_root *root,
  			  struct btrfs_trans_handle *trans,
  			  struct btrfs_block_group_cache *block_group,
  			  struct btrfs_path *path)
  {
  	struct btrfs_free_space_ctl *ctl = block_group->free_space_ctl;
  	struct inode *inode;
  	int ret = 0;
  
  	root = root->fs_info->tree_root;
  
  	spin_lock(&block_group->lock);
  	if (block_group->disk_cache_state < BTRFS_DC_SETUP) {
  		spin_unlock(&block_group->lock);
  		return 0;
  	}
  	spin_unlock(&block_group->lock);
  
  	inode = lookup_free_space_inode(root, block_group, path);
  	if (IS_ERR(inode))
  		return 0;
  
  	ret = __btrfs_write_out_cache(root, inode, ctl, block_group, trans,
  				      path, block_group->key.objectid);
c09544e07   Josef Bacik   Btrfs: handle eno...
1017
  	if (ret) {
0414efae7   Li Zefan   Btrfs: Make the c...
1018
1019
1020
  		spin_lock(&block_group->lock);
  		block_group->disk_cache_state = BTRFS_DC_ERROR;
  		spin_unlock(&block_group->lock);
82d5902d9   Li Zefan   Btrfs: Support re...
1021
  		ret = 0;
c09544e07   Josef Bacik   Btrfs: handle eno...
1022
  #ifdef DEBUG
0414efae7   Li Zefan   Btrfs: Make the c...
1023
1024
1025
  		printk(KERN_ERR "btrfs: failed to write free space cace "
  		       "for block group %llu
  ", block_group->key.objectid);
c09544e07   Josef Bacik   Btrfs: handle eno...
1026
  #endif
0414efae7   Li Zefan   Btrfs: Make the c...
1027
  	}
0cb59c995   Josef Bacik   Btrfs: write out ...
1028
1029
1030
  	iput(inode);
  	return ret;
  }
34d52cb6c   Li Zefan   Btrfs: Make free ...
1031
  static inline unsigned long offset_to_bit(u64 bitmap_start, u32 unit,
963030817   Josef Bacik   Btrfs: use hybrid...
1032
  					  u64 offset)
0f9dd46cd   Josef Bacik   Btrfs: free space...
1033
  {
963030817   Josef Bacik   Btrfs: use hybrid...
1034
1035
  	BUG_ON(offset < bitmap_start);
  	offset -= bitmap_start;
34d52cb6c   Li Zefan   Btrfs: Make free ...
1036
  	return (unsigned long)(div_u64(offset, unit));
963030817   Josef Bacik   Btrfs: use hybrid...
1037
  }
0f9dd46cd   Josef Bacik   Btrfs: free space...
1038

34d52cb6c   Li Zefan   Btrfs: Make free ...
1039
  static inline unsigned long bytes_to_bits(u64 bytes, u32 unit)
963030817   Josef Bacik   Btrfs: use hybrid...
1040
  {
34d52cb6c   Li Zefan   Btrfs: Make free ...
1041
  	return (unsigned long)(div_u64(bytes, unit));
963030817   Josef Bacik   Btrfs: use hybrid...
1042
  }
0f9dd46cd   Josef Bacik   Btrfs: free space...
1043

34d52cb6c   Li Zefan   Btrfs: Make free ...
1044
  static inline u64 offset_to_bitmap(struct btrfs_free_space_ctl *ctl,
963030817   Josef Bacik   Btrfs: use hybrid...
1045
1046
1047
1048
  				   u64 offset)
  {
  	u64 bitmap_start;
  	u64 bytes_per_bitmap;
0f9dd46cd   Josef Bacik   Btrfs: free space...
1049

34d52cb6c   Li Zefan   Btrfs: Make free ...
1050
1051
  	bytes_per_bitmap = BITS_PER_BITMAP * ctl->unit;
  	bitmap_start = offset - ctl->start;
963030817   Josef Bacik   Btrfs: use hybrid...
1052
1053
  	bitmap_start = div64_u64(bitmap_start, bytes_per_bitmap);
  	bitmap_start *= bytes_per_bitmap;
34d52cb6c   Li Zefan   Btrfs: Make free ...
1054
  	bitmap_start += ctl->start;
0f9dd46cd   Josef Bacik   Btrfs: free space...
1055

963030817   Josef Bacik   Btrfs: use hybrid...
1056
  	return bitmap_start;
0f9dd46cd   Josef Bacik   Btrfs: free space...
1057
  }
963030817   Josef Bacik   Btrfs: use hybrid...
1058
1059
  static int tree_insert_offset(struct rb_root *root, u64 offset,
  			      struct rb_node *node, int bitmap)
0f9dd46cd   Josef Bacik   Btrfs: free space...
1060
1061
1062
1063
1064
1065
1066
  {
  	struct rb_node **p = &root->rb_node;
  	struct rb_node *parent = NULL;
  	struct btrfs_free_space *info;
  
  	while (*p) {
  		parent = *p;
963030817   Josef Bacik   Btrfs: use hybrid...
1067
  		info = rb_entry(parent, struct btrfs_free_space, offset_index);
0f9dd46cd   Josef Bacik   Btrfs: free space...
1068

963030817   Josef Bacik   Btrfs: use hybrid...
1069
  		if (offset < info->offset) {
0f9dd46cd   Josef Bacik   Btrfs: free space...
1070
  			p = &(*p)->rb_left;
963030817   Josef Bacik   Btrfs: use hybrid...
1071
  		} else if (offset > info->offset) {
0f9dd46cd   Josef Bacik   Btrfs: free space...
1072
  			p = &(*p)->rb_right;
963030817   Josef Bacik   Btrfs: use hybrid...
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
  		} else {
  			/*
  			 * we could have a bitmap entry and an extent entry
  			 * share the same offset.  If this is the case, we want
  			 * the extent entry to always be found first if we do a
  			 * linear search through the tree, since we want to have
  			 * the quickest allocation time, and allocating from an
  			 * extent is faster than allocating from a bitmap.  So
  			 * if we're inserting a bitmap and we find an entry at
  			 * this offset, we want to go right, or after this entry
  			 * logically.  If we are inserting an extent and we've
  			 * found a bitmap, we want to go left, or before
  			 * logically.
  			 */
  			if (bitmap) {
207dde828   Josef Bacik   Btrfs: check for ...
1088
1089
1090
1091
  				if (info->bitmap) {
  					WARN_ON_ONCE(1);
  					return -EEXIST;
  				}
963030817   Josef Bacik   Btrfs: use hybrid...
1092
1093
  				p = &(*p)->rb_right;
  			} else {
207dde828   Josef Bacik   Btrfs: check for ...
1094
1095
1096
1097
  				if (!info->bitmap) {
  					WARN_ON_ONCE(1);
  					return -EEXIST;
  				}
963030817   Josef Bacik   Btrfs: use hybrid...
1098
1099
1100
  				p = &(*p)->rb_left;
  			}
  		}
0f9dd46cd   Josef Bacik   Btrfs: free space...
1101
1102
1103
1104
1105
1106
1107
1108
1109
  	}
  
  	rb_link_node(node, parent, p);
  	rb_insert_color(node, root);
  
  	return 0;
  }
  
  /*
70cb07434   Josef Bacik   Btrfs: free space...
1110
1111
   * searches the tree for the given offset.
   *
963030817   Josef Bacik   Btrfs: use hybrid...
1112
1113
1114
   * fuzzy - If this is set, then we are trying to make an allocation, and we just
   * want a section that has at least bytes size and comes at or after the given
   * offset.
0f9dd46cd   Josef Bacik   Btrfs: free space...
1115
   */
963030817   Josef Bacik   Btrfs: use hybrid...
1116
  static struct btrfs_free_space *
34d52cb6c   Li Zefan   Btrfs: Make free ...
1117
  tree_search_offset(struct btrfs_free_space_ctl *ctl,
963030817   Josef Bacik   Btrfs: use hybrid...
1118
  		   u64 offset, int bitmap_only, int fuzzy)
0f9dd46cd   Josef Bacik   Btrfs: free space...
1119
  {
34d52cb6c   Li Zefan   Btrfs: Make free ...
1120
  	struct rb_node *n = ctl->free_space_offset.rb_node;
963030817   Josef Bacik   Btrfs: use hybrid...
1121
1122
1123
1124
1125
1126
1127
1128
  	struct btrfs_free_space *entry, *prev = NULL;
  
  	/* find entry that is closest to the 'offset' */
  	while (1) {
  		if (!n) {
  			entry = NULL;
  			break;
  		}
0f9dd46cd   Josef Bacik   Btrfs: free space...
1129

0f9dd46cd   Josef Bacik   Btrfs: free space...
1130
  		entry = rb_entry(n, struct btrfs_free_space, offset_index);
963030817   Josef Bacik   Btrfs: use hybrid...
1131
  		prev = entry;
0f9dd46cd   Josef Bacik   Btrfs: free space...
1132

963030817   Josef Bacik   Btrfs: use hybrid...
1133
  		if (offset < entry->offset)
0f9dd46cd   Josef Bacik   Btrfs: free space...
1134
  			n = n->rb_left;
963030817   Josef Bacik   Btrfs: use hybrid...
1135
  		else if (offset > entry->offset)
0f9dd46cd   Josef Bacik   Btrfs: free space...
1136
  			n = n->rb_right;
963030817   Josef Bacik   Btrfs: use hybrid...
1137
  		else
0f9dd46cd   Josef Bacik   Btrfs: free space...
1138
  			break;
0f9dd46cd   Josef Bacik   Btrfs: free space...
1139
  	}
963030817   Josef Bacik   Btrfs: use hybrid...
1140
1141
1142
1143
1144
  	if (bitmap_only) {
  		if (!entry)
  			return NULL;
  		if (entry->bitmap)
  			return entry;
0f9dd46cd   Josef Bacik   Btrfs: free space...
1145

963030817   Josef Bacik   Btrfs: use hybrid...
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
  		/*
  		 * bitmap entry and extent entry may share same offset,
  		 * in that case, bitmap entry comes after extent entry.
  		 */
  		n = rb_next(n);
  		if (!n)
  			return NULL;
  		entry = rb_entry(n, struct btrfs_free_space, offset_index);
  		if (entry->offset != offset)
  			return NULL;
0f9dd46cd   Josef Bacik   Btrfs: free space...
1156

963030817   Josef Bacik   Btrfs: use hybrid...
1157
1158
1159
1160
  		WARN_ON(!entry->bitmap);
  		return entry;
  	} else if (entry) {
  		if (entry->bitmap) {
0f9dd46cd   Josef Bacik   Btrfs: free space...
1161
  			/*
963030817   Josef Bacik   Btrfs: use hybrid...
1162
1163
  			 * if previous extent entry covers the offset,
  			 * we should return it instead of the bitmap entry
0f9dd46cd   Josef Bacik   Btrfs: free space...
1164
  			 */
963030817   Josef Bacik   Btrfs: use hybrid...
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
  			n = &entry->offset_index;
  			while (1) {
  				n = rb_prev(n);
  				if (!n)
  					break;
  				prev = rb_entry(n, struct btrfs_free_space,
  						offset_index);
  				if (!prev->bitmap) {
  					if (prev->offset + prev->bytes > offset)
  						entry = prev;
  					break;
  				}
0f9dd46cd   Josef Bacik   Btrfs: free space...
1177
  			}
963030817   Josef Bacik   Btrfs: use hybrid...
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
  		}
  		return entry;
  	}
  
  	if (!prev)
  		return NULL;
  
  	/* find last entry before the 'offset' */
  	entry = prev;
  	if (entry->offset > offset) {
  		n = rb_prev(&entry->offset_index);
  		if (n) {
  			entry = rb_entry(n, struct btrfs_free_space,
  					offset_index);
  			BUG_ON(entry->offset > offset);
0f9dd46cd   Josef Bacik   Btrfs: free space...
1193
  		} else {
963030817   Josef Bacik   Btrfs: use hybrid...
1194
1195
1196
1197
  			if (fuzzy)
  				return entry;
  			else
  				return NULL;
0f9dd46cd   Josef Bacik   Btrfs: free space...
1198
1199
  		}
  	}
963030817   Josef Bacik   Btrfs: use hybrid...
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
  	if (entry->bitmap) {
  		n = &entry->offset_index;
  		while (1) {
  			n = rb_prev(n);
  			if (!n)
  				break;
  			prev = rb_entry(n, struct btrfs_free_space,
  					offset_index);
  			if (!prev->bitmap) {
  				if (prev->offset + prev->bytes > offset)
  					return prev;
  				break;
  			}
  		}
34d52cb6c   Li Zefan   Btrfs: Make free ...
1214
  		if (entry->offset + BITS_PER_BITMAP * ctl->unit > offset)
963030817   Josef Bacik   Btrfs: use hybrid...
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
  			return entry;
  	} else if (entry->offset + entry->bytes > offset)
  		return entry;
  
  	if (!fuzzy)
  		return NULL;
  
  	while (1) {
  		if (entry->bitmap) {
  			if (entry->offset + BITS_PER_BITMAP *
34d52cb6c   Li Zefan   Btrfs: Make free ...
1225
  			    ctl->unit > offset)
963030817   Josef Bacik   Btrfs: use hybrid...
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
  				break;
  		} else {
  			if (entry->offset + entry->bytes > offset)
  				break;
  		}
  
  		n = rb_next(&entry->offset_index);
  		if (!n)
  			return NULL;
  		entry = rb_entry(n, struct btrfs_free_space, offset_index);
  	}
  	return entry;
0f9dd46cd   Josef Bacik   Btrfs: free space...
1238
  }
f333adb5d   Li Zefan   btrfs: Check merg...
1239
  static inline void
34d52cb6c   Li Zefan   Btrfs: Make free ...
1240
  __unlink_free_space(struct btrfs_free_space_ctl *ctl,
f333adb5d   Li Zefan   btrfs: Check merg...
1241
  		    struct btrfs_free_space *info)
0f9dd46cd   Josef Bacik   Btrfs: free space...
1242
  {
34d52cb6c   Li Zefan   Btrfs: Make free ...
1243
1244
  	rb_erase(&info->offset_index, &ctl->free_space_offset);
  	ctl->free_extents--;
f333adb5d   Li Zefan   btrfs: Check merg...
1245
  }
34d52cb6c   Li Zefan   Btrfs: Make free ...
1246
  static void unlink_free_space(struct btrfs_free_space_ctl *ctl,
f333adb5d   Li Zefan   btrfs: Check merg...
1247
1248
  			      struct btrfs_free_space *info)
  {
34d52cb6c   Li Zefan   Btrfs: Make free ...
1249
1250
  	__unlink_free_space(ctl, info);
  	ctl->free_space -= info->bytes;
0f9dd46cd   Josef Bacik   Btrfs: free space...
1251
  }
34d52cb6c   Li Zefan   Btrfs: Make free ...
1252
  static int link_free_space(struct btrfs_free_space_ctl *ctl,
0f9dd46cd   Josef Bacik   Btrfs: free space...
1253
1254
1255
  			   struct btrfs_free_space *info)
  {
  	int ret = 0;
963030817   Josef Bacik   Btrfs: use hybrid...
1256
  	BUG_ON(!info->bitmap && !info->bytes);
34d52cb6c   Li Zefan   Btrfs: Make free ...
1257
  	ret = tree_insert_offset(&ctl->free_space_offset, info->offset,
963030817   Josef Bacik   Btrfs: use hybrid...
1258
  				 &info->offset_index, (info->bitmap != NULL));
0f9dd46cd   Josef Bacik   Btrfs: free space...
1259
1260
  	if (ret)
  		return ret;
34d52cb6c   Li Zefan   Btrfs: Make free ...
1261
1262
  	ctl->free_space += info->bytes;
  	ctl->free_extents++;
963030817   Josef Bacik   Btrfs: use hybrid...
1263
1264
  	return ret;
  }
34d52cb6c   Li Zefan   Btrfs: Make free ...
1265
  static void recalculate_thresholds(struct btrfs_free_space_ctl *ctl)
963030817   Josef Bacik   Btrfs: use hybrid...
1266
  {
34d52cb6c   Li Zefan   Btrfs: Make free ...
1267
  	struct btrfs_block_group_cache *block_group = ctl->private;
25891f796   Josef Bacik   Btrfs: fix extent...
1268
1269
1270
  	u64 max_bytes;
  	u64 bitmap_bytes;
  	u64 extent_bytes;
8eb2d829f   Li Zefan   btrfs: Fix thresh...
1271
  	u64 size = block_group->key.offset;
34d52cb6c   Li Zefan   Btrfs: Make free ...
1272
1273
1274
1275
  	u64 bytes_per_bg = BITS_PER_BITMAP * block_group->sectorsize;
  	int max_bitmaps = div64_u64(size + bytes_per_bg - 1, bytes_per_bg);
  
  	BUG_ON(ctl->total_bitmaps > max_bitmaps);
963030817   Josef Bacik   Btrfs: use hybrid...
1276
1277
1278
1279
1280
1281
  
  	/*
  	 * The goal is to keep the total amount of memory used per 1gb of space
  	 * at or below 32k, so we need to adjust how much memory we allow to be
  	 * used by extent based free space tracking
  	 */
8eb2d829f   Li Zefan   btrfs: Fix thresh...
1282
1283
1284
1285
1286
  	if (size < 1024 * 1024 * 1024)
  		max_bytes = MAX_CACHE_BYTES_PER_GIG;
  	else
  		max_bytes = MAX_CACHE_BYTES_PER_GIG *
  			div64_u64(size, 1024 * 1024 * 1024);
963030817   Josef Bacik   Btrfs: use hybrid...
1287

25891f796   Josef Bacik   Btrfs: fix extent...
1288
1289
1290
1291
1292
  	/*
  	 * we want to account for 1 more bitmap than what we have so we can make
  	 * sure we don't go over our overall goal of MAX_CACHE_BYTES_PER_GIG as
  	 * we add more bitmaps.
  	 */
34d52cb6c   Li Zefan   Btrfs: Make free ...
1293
  	bitmap_bytes = (ctl->total_bitmaps + 1) * PAGE_CACHE_SIZE;
963030817   Josef Bacik   Btrfs: use hybrid...
1294

25891f796   Josef Bacik   Btrfs: fix extent...
1295
  	if (bitmap_bytes >= max_bytes) {
34d52cb6c   Li Zefan   Btrfs: Make free ...
1296
  		ctl->extents_thresh = 0;
25891f796   Josef Bacik   Btrfs: fix extent...
1297
1298
  		return;
  	}
963030817   Josef Bacik   Btrfs: use hybrid...
1299

25891f796   Josef Bacik   Btrfs: fix extent...
1300
1301
1302
1303
1304
1305
  	/*
  	 * we want the extent entry threshold to always be at most 1/2 the maxw
  	 * bytes we can have, or whatever is less than that.
  	 */
  	extent_bytes = max_bytes - bitmap_bytes;
  	extent_bytes = min_t(u64, extent_bytes, div64_u64(max_bytes, 2));
963030817   Josef Bacik   Btrfs: use hybrid...
1306

34d52cb6c   Li Zefan   Btrfs: Make free ...
1307
  	ctl->extents_thresh =
25891f796   Josef Bacik   Btrfs: fix extent...
1308
  		div64_u64(extent_bytes, (sizeof(struct btrfs_free_space)));
963030817   Josef Bacik   Btrfs: use hybrid...
1309
  }
bb3ac5a4d   Miao Xie   Btrfs: fix wrong ...
1310
1311
1312
  static inline void __bitmap_clear_bits(struct btrfs_free_space_ctl *ctl,
  				       struct btrfs_free_space *info,
  				       u64 offset, u64 bytes)
963030817   Josef Bacik   Btrfs: use hybrid...
1313
  {
f38b6e754   Li Zefan   Btrfs: Use bitmap...
1314
  	unsigned long start, count;
963030817   Josef Bacik   Btrfs: use hybrid...
1315

34d52cb6c   Li Zefan   Btrfs: Make free ...
1316
1317
  	start = offset_to_bit(info->offset, ctl->unit, offset);
  	count = bytes_to_bits(bytes, ctl->unit);
f38b6e754   Li Zefan   Btrfs: Use bitmap...
1318
  	BUG_ON(start + count > BITS_PER_BITMAP);
963030817   Josef Bacik   Btrfs: use hybrid...
1319

f38b6e754   Li Zefan   Btrfs: Use bitmap...
1320
  	bitmap_clear(info->bitmap, start, count);
963030817   Josef Bacik   Btrfs: use hybrid...
1321
1322
  
  	info->bytes -= bytes;
bb3ac5a4d   Miao Xie   Btrfs: fix wrong ...
1323
1324
1325
1326
1327
1328
1329
  }
  
  static void bitmap_clear_bits(struct btrfs_free_space_ctl *ctl,
  			      struct btrfs_free_space *info, u64 offset,
  			      u64 bytes)
  {
  	__bitmap_clear_bits(ctl, info, offset, bytes);
34d52cb6c   Li Zefan   Btrfs: Make free ...
1330
  	ctl->free_space -= bytes;
963030817   Josef Bacik   Btrfs: use hybrid...
1331
  }
34d52cb6c   Li Zefan   Btrfs: Make free ...
1332
  static void bitmap_set_bits(struct btrfs_free_space_ctl *ctl,
817d52f8d   Josef Bacik   Btrfs: async bloc...
1333
1334
  			    struct btrfs_free_space *info, u64 offset,
  			    u64 bytes)
963030817   Josef Bacik   Btrfs: use hybrid...
1335
  {
f38b6e754   Li Zefan   Btrfs: Use bitmap...
1336
  	unsigned long start, count;
963030817   Josef Bacik   Btrfs: use hybrid...
1337

34d52cb6c   Li Zefan   Btrfs: Make free ...
1338
1339
  	start = offset_to_bit(info->offset, ctl->unit, offset);
  	count = bytes_to_bits(bytes, ctl->unit);
f38b6e754   Li Zefan   Btrfs: Use bitmap...
1340
  	BUG_ON(start + count > BITS_PER_BITMAP);
963030817   Josef Bacik   Btrfs: use hybrid...
1341

f38b6e754   Li Zefan   Btrfs: Use bitmap...
1342
  	bitmap_set(info->bitmap, start, count);
963030817   Josef Bacik   Btrfs: use hybrid...
1343
1344
  
  	info->bytes += bytes;
34d52cb6c   Li Zefan   Btrfs: Make free ...
1345
  	ctl->free_space += bytes;
963030817   Josef Bacik   Btrfs: use hybrid...
1346
  }
34d52cb6c   Li Zefan   Btrfs: Make free ...
1347
  static int search_bitmap(struct btrfs_free_space_ctl *ctl,
963030817   Josef Bacik   Btrfs: use hybrid...
1348
1349
1350
1351
1352
1353
  			 struct btrfs_free_space *bitmap_info, u64 *offset,
  			 u64 *bytes)
  {
  	unsigned long found_bits = 0;
  	unsigned long bits, i;
  	unsigned long next_zero;
34d52cb6c   Li Zefan   Btrfs: Make free ...
1354
  	i = offset_to_bit(bitmap_info->offset, ctl->unit,
963030817   Josef Bacik   Btrfs: use hybrid...
1355
  			  max_t(u64, *offset, bitmap_info->offset));
34d52cb6c   Li Zefan   Btrfs: Make free ...
1356
  	bits = bytes_to_bits(*bytes, ctl->unit);
963030817   Josef Bacik   Btrfs: use hybrid...
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
  
  	for (i = find_next_bit(bitmap_info->bitmap, BITS_PER_BITMAP, i);
  	     i < BITS_PER_BITMAP;
  	     i = find_next_bit(bitmap_info->bitmap, BITS_PER_BITMAP, i + 1)) {
  		next_zero = find_next_zero_bit(bitmap_info->bitmap,
  					       BITS_PER_BITMAP, i);
  		if ((next_zero - i) >= bits) {
  			found_bits = next_zero - i;
  			break;
  		}
  		i = next_zero;
  	}
  
  	if (found_bits) {
34d52cb6c   Li Zefan   Btrfs: Make free ...
1371
1372
  		*offset = (u64)(i * ctl->unit) + bitmap_info->offset;
  		*bytes = (u64)(found_bits) * ctl->unit;
963030817   Josef Bacik   Btrfs: use hybrid...
1373
1374
1375
1376
1377
  		return 0;
  	}
  
  	return -1;
  }
34d52cb6c   Li Zefan   Btrfs: Make free ...
1378
1379
  static struct btrfs_free_space *
  find_free_space(struct btrfs_free_space_ctl *ctl, u64 *offset, u64 *bytes)
963030817   Josef Bacik   Btrfs: use hybrid...
1380
1381
1382
1383
  {
  	struct btrfs_free_space *entry;
  	struct rb_node *node;
  	int ret;
34d52cb6c   Li Zefan   Btrfs: Make free ...
1384
  	if (!ctl->free_space_offset.rb_node)
963030817   Josef Bacik   Btrfs: use hybrid...
1385
  		return NULL;
34d52cb6c   Li Zefan   Btrfs: Make free ...
1386
  	entry = tree_search_offset(ctl, offset_to_bitmap(ctl, *offset), 0, 1);
963030817   Josef Bacik   Btrfs: use hybrid...
1387
1388
1389
1390
1391
1392
1393
1394
1395
  	if (!entry)
  		return NULL;
  
  	for (node = &entry->offset_index; node; node = rb_next(node)) {
  		entry = rb_entry(node, struct btrfs_free_space, offset_index);
  		if (entry->bytes < *bytes)
  			continue;
  
  		if (entry->bitmap) {
34d52cb6c   Li Zefan   Btrfs: Make free ...
1396
  			ret = search_bitmap(ctl, entry, offset, bytes);
963030817   Josef Bacik   Btrfs: use hybrid...
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
  			if (!ret)
  				return entry;
  			continue;
  		}
  
  		*offset = entry->offset;
  		*bytes = entry->bytes;
  		return entry;
  	}
  
  	return NULL;
  }
34d52cb6c   Li Zefan   Btrfs: Make free ...
1409
  static void add_new_bitmap(struct btrfs_free_space_ctl *ctl,
963030817   Josef Bacik   Btrfs: use hybrid...
1410
1411
  			   struct btrfs_free_space *info, u64 offset)
  {
34d52cb6c   Li Zefan   Btrfs: Make free ...
1412
  	info->offset = offset_to_bitmap(ctl, offset);
f019f4264   Josef Bacik   Btrfs: fix bitmap...
1413
  	info->bytes = 0;
f2d0f6765   Alexandre Oliva   Btrfs: initialize...
1414
  	INIT_LIST_HEAD(&info->list);
34d52cb6c   Li Zefan   Btrfs: Make free ...
1415
1416
  	link_free_space(ctl, info);
  	ctl->total_bitmaps++;
963030817   Josef Bacik   Btrfs: use hybrid...
1417

34d52cb6c   Li Zefan   Btrfs: Make free ...
1418
  	ctl->op->recalc_thresholds(ctl);
963030817   Josef Bacik   Btrfs: use hybrid...
1419
  }
34d52cb6c   Li Zefan   Btrfs: Make free ...
1420
  static void free_bitmap(struct btrfs_free_space_ctl *ctl,
edf6e2d1d   Li Zefan   btrfs: Add helper...
1421
1422
  			struct btrfs_free_space *bitmap_info)
  {
34d52cb6c   Li Zefan   Btrfs: Make free ...
1423
  	unlink_free_space(ctl, bitmap_info);
edf6e2d1d   Li Zefan   btrfs: Add helper...
1424
  	kfree(bitmap_info->bitmap);
dc89e9824   Josef Bacik   Btrfs: use a slab...
1425
  	kmem_cache_free(btrfs_free_space_cachep, bitmap_info);
34d52cb6c   Li Zefan   Btrfs: Make free ...
1426
1427
  	ctl->total_bitmaps--;
  	ctl->op->recalc_thresholds(ctl);
edf6e2d1d   Li Zefan   btrfs: Add helper...
1428
  }
34d52cb6c   Li Zefan   Btrfs: Make free ...
1429
  static noinline int remove_from_bitmap(struct btrfs_free_space_ctl *ctl,
963030817   Josef Bacik   Btrfs: use hybrid...
1430
1431
1432
1433
  			      struct btrfs_free_space *bitmap_info,
  			      u64 *offset, u64 *bytes)
  {
  	u64 end;
6606bb97e   Josef Bacik   Btrfs: fix btrfs_...
1434
1435
  	u64 search_start, search_bytes;
  	int ret;
963030817   Josef Bacik   Btrfs: use hybrid...
1436
1437
  
  again:
34d52cb6c   Li Zefan   Btrfs: Make free ...
1438
  	end = bitmap_info->offset + (u64)(BITS_PER_BITMAP * ctl->unit) - 1;
963030817   Josef Bacik   Btrfs: use hybrid...
1439

6606bb97e   Josef Bacik   Btrfs: fix btrfs_...
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
  	/*
  	 * XXX - this can go away after a few releases.
  	 *
  	 * since the only user of btrfs_remove_free_space is the tree logging
  	 * stuff, and the only way to test that is under crash conditions, we
  	 * want to have this debug stuff here just in case somethings not
  	 * working.  Search the bitmap for the space we are trying to use to
  	 * make sure its actually there.  If its not there then we need to stop
  	 * because something has gone wrong.
  	 */
  	search_start = *offset;
  	search_bytes = *bytes;
13dbc0898   Josef Bacik   Btrfs: make sure ...
1452
  	search_bytes = min(search_bytes, end - search_start + 1);
34d52cb6c   Li Zefan   Btrfs: Make free ...
1453
  	ret = search_bitmap(ctl, bitmap_info, &search_start, &search_bytes);
6606bb97e   Josef Bacik   Btrfs: fix btrfs_...
1454
  	BUG_ON(ret < 0 || search_start != *offset);
963030817   Josef Bacik   Btrfs: use hybrid...
1455
  	if (*offset > bitmap_info->offset && *offset + *bytes > end) {
34d52cb6c   Li Zefan   Btrfs: Make free ...
1456
  		bitmap_clear_bits(ctl, bitmap_info, *offset, end - *offset + 1);
963030817   Josef Bacik   Btrfs: use hybrid...
1457
1458
1459
  		*bytes -= end - *offset + 1;
  		*offset = end + 1;
  	} else if (*offset >= bitmap_info->offset && *offset + *bytes <= end) {
34d52cb6c   Li Zefan   Btrfs: Make free ...
1460
  		bitmap_clear_bits(ctl, bitmap_info, *offset, *bytes);
963030817   Josef Bacik   Btrfs: use hybrid...
1461
1462
1463
1464
  		*bytes = 0;
  	}
  
  	if (*bytes) {
6606bb97e   Josef Bacik   Btrfs: fix btrfs_...
1465
  		struct rb_node *next = rb_next(&bitmap_info->offset_index);
edf6e2d1d   Li Zefan   btrfs: Add helper...
1466
  		if (!bitmap_info->bytes)
34d52cb6c   Li Zefan   Btrfs: Make free ...
1467
  			free_bitmap(ctl, bitmap_info);
963030817   Josef Bacik   Btrfs: use hybrid...
1468

6606bb97e   Josef Bacik   Btrfs: fix btrfs_...
1469
1470
1471
1472
1473
  		/*
  		 * no entry after this bitmap, but we still have bytes to
  		 * remove, so something has gone wrong.
  		 */
  		if (!next)
963030817   Josef Bacik   Btrfs: use hybrid...
1474
  			return -EINVAL;
6606bb97e   Josef Bacik   Btrfs: fix btrfs_...
1475
1476
1477
1478
1479
1480
1481
  		bitmap_info = rb_entry(next, struct btrfs_free_space,
  				       offset_index);
  
  		/*
  		 * if the next entry isn't a bitmap we need to return to let the
  		 * extent stuff do its work.
  		 */
963030817   Josef Bacik   Btrfs: use hybrid...
1482
1483
  		if (!bitmap_info->bitmap)
  			return -EAGAIN;
6606bb97e   Josef Bacik   Btrfs: fix btrfs_...
1484
1485
1486
1487
1488
1489
1490
1491
  		/*
  		 * Ok the next item is a bitmap, but it may not actually hold
  		 * the information for the rest of this free space stuff, so
  		 * look for it, and if we don't find it return so we can try
  		 * everything over again.
  		 */
  		search_start = *offset;
  		search_bytes = *bytes;
34d52cb6c   Li Zefan   Btrfs: Make free ...
1492
  		ret = search_bitmap(ctl, bitmap_info, &search_start,
6606bb97e   Josef Bacik   Btrfs: fix btrfs_...
1493
1494
1495
  				    &search_bytes);
  		if (ret < 0 || search_start != *offset)
  			return -EAGAIN;
963030817   Josef Bacik   Btrfs: use hybrid...
1496
  		goto again;
edf6e2d1d   Li Zefan   btrfs: Add helper...
1497
  	} else if (!bitmap_info->bytes)
34d52cb6c   Li Zefan   Btrfs: Make free ...
1498
  		free_bitmap(ctl, bitmap_info);
963030817   Josef Bacik   Btrfs: use hybrid...
1499
1500
1501
  
  	return 0;
  }
2cdc342c2   Josef Bacik   Btrfs: fix bitmap...
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
  static u64 add_bytes_to_bitmap(struct btrfs_free_space_ctl *ctl,
  			       struct btrfs_free_space *info, u64 offset,
  			       u64 bytes)
  {
  	u64 bytes_to_set = 0;
  	u64 end;
  
  	end = info->offset + (u64)(BITS_PER_BITMAP * ctl->unit);
  
  	bytes_to_set = min(end - offset, bytes);
  
  	bitmap_set_bits(ctl, info, offset, bytes_to_set);
  
  	return bytes_to_set;
  
  }
34d52cb6c   Li Zefan   Btrfs: Make free ...
1518
1519
  static bool use_bitmap(struct btrfs_free_space_ctl *ctl,
  		      struct btrfs_free_space *info)
963030817   Josef Bacik   Btrfs: use hybrid...
1520
  {
34d52cb6c   Li Zefan   Btrfs: Make free ...
1521
  	struct btrfs_block_group_cache *block_group = ctl->private;
963030817   Josef Bacik   Btrfs: use hybrid...
1522
1523
1524
1525
1526
  
  	/*
  	 * If we are below the extents threshold then we can add this as an
  	 * extent, and don't have to deal with the bitmap
  	 */
34d52cb6c   Li Zefan   Btrfs: Make free ...
1527
  	if (ctl->free_extents < ctl->extents_thresh) {
32cb0840c   Josef Bacik   Btrfs: don't be a...
1528
1529
1530
1531
1532
1533
1534
1535
  		/*
  		 * If this block group has some small extents we don't want to
  		 * use up all of our free slots in the cache with them, we want
  		 * to reserve them to larger extents, however if we have plent
  		 * of cache left then go ahead an dadd them, no sense in adding
  		 * the overhead of a bitmap if we don't have to.
  		 */
  		if (info->bytes <= block_group->sectorsize * 4) {
34d52cb6c   Li Zefan   Btrfs: Make free ...
1536
1537
  			if (ctl->free_extents * 2 <= ctl->extents_thresh)
  				return false;
32cb0840c   Josef Bacik   Btrfs: don't be a...
1538
  		} else {
34d52cb6c   Li Zefan   Btrfs: Make free ...
1539
  			return false;
32cb0840c   Josef Bacik   Btrfs: don't be a...
1540
1541
  		}
  	}
963030817   Josef Bacik   Btrfs: use hybrid...
1542
1543
1544
1545
1546
1547
1548
  
  	/*
  	 * some block groups are so tiny they can't be enveloped by a bitmap, so
  	 * don't even bother to create a bitmap for this
  	 */
  	if (BITS_PER_BITMAP * block_group->sectorsize >
  	    block_group->key.offset)
34d52cb6c   Li Zefan   Btrfs: Make free ...
1549
1550
1551
1552
  		return false;
  
  	return true;
  }
2cdc342c2   Josef Bacik   Btrfs: fix bitmap...
1553
1554
1555
1556
  static struct btrfs_free_space_op free_space_op = {
  	.recalc_thresholds	= recalculate_thresholds,
  	.use_bitmap		= use_bitmap,
  };
34d52cb6c   Li Zefan   Btrfs: Make free ...
1557
1558
1559
1560
  static int insert_into_bitmap(struct btrfs_free_space_ctl *ctl,
  			      struct btrfs_free_space *info)
  {
  	struct btrfs_free_space *bitmap_info;
2cdc342c2   Josef Bacik   Btrfs: fix bitmap...
1561
  	struct btrfs_block_group_cache *block_group = NULL;
34d52cb6c   Li Zefan   Btrfs: Make free ...
1562
  	int added = 0;
2cdc342c2   Josef Bacik   Btrfs: fix bitmap...
1563
  	u64 bytes, offset, bytes_added;
34d52cb6c   Li Zefan   Btrfs: Make free ...
1564
  	int ret;
963030817   Josef Bacik   Btrfs: use hybrid...
1565
1566
1567
  
  	bytes = info->bytes;
  	offset = info->offset;
34d52cb6c   Li Zefan   Btrfs: Make free ...
1568
1569
  	if (!ctl->op->use_bitmap(ctl, info))
  		return 0;
2cdc342c2   Josef Bacik   Btrfs: fix bitmap...
1570
1571
  	if (ctl->op == &free_space_op)
  		block_group = ctl->private;
38e878806   Chris Mason   Btrfs: make sure ...
1572
  again:
2cdc342c2   Josef Bacik   Btrfs: fix bitmap...
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
  	/*
  	 * Since we link bitmaps right into the cluster we need to see if we
  	 * have a cluster here, and if so and it has our bitmap we need to add
  	 * the free space to that bitmap.
  	 */
  	if (block_group && !list_empty(&block_group->cluster_list)) {
  		struct btrfs_free_cluster *cluster;
  		struct rb_node *node;
  		struct btrfs_free_space *entry;
  
  		cluster = list_entry(block_group->cluster_list.next,
  				     struct btrfs_free_cluster,
  				     block_group_list);
  		spin_lock(&cluster->lock);
  		node = rb_first(&cluster->root);
  		if (!node) {
  			spin_unlock(&cluster->lock);
38e878806   Chris Mason   Btrfs: make sure ...
1590
  			goto no_cluster_bitmap;
2cdc342c2   Josef Bacik   Btrfs: fix bitmap...
1591
1592
1593
1594
1595
  		}
  
  		entry = rb_entry(node, struct btrfs_free_space, offset_index);
  		if (!entry->bitmap) {
  			spin_unlock(&cluster->lock);
38e878806   Chris Mason   Btrfs: make sure ...
1596
  			goto no_cluster_bitmap;
2cdc342c2   Josef Bacik   Btrfs: fix bitmap...
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
  		}
  
  		if (entry->offset == offset_to_bitmap(ctl, offset)) {
  			bytes_added = add_bytes_to_bitmap(ctl, entry,
  							  offset, bytes);
  			bytes -= bytes_added;
  			offset += bytes_added;
  		}
  		spin_unlock(&cluster->lock);
  		if (!bytes) {
  			ret = 1;
  			goto out;
  		}
  	}
38e878806   Chris Mason   Btrfs: make sure ...
1611
1612
  
  no_cluster_bitmap:
34d52cb6c   Li Zefan   Btrfs: Make free ...
1613
  	bitmap_info = tree_search_offset(ctl, offset_to_bitmap(ctl, offset),
963030817   Josef Bacik   Btrfs: use hybrid...
1614
1615
1616
1617
1618
  					 1, 0);
  	if (!bitmap_info) {
  		BUG_ON(added);
  		goto new_bitmap;
  	}
2cdc342c2   Josef Bacik   Btrfs: fix bitmap...
1619
1620
1621
1622
  	bytes_added = add_bytes_to_bitmap(ctl, bitmap_info, offset, bytes);
  	bytes -= bytes_added;
  	offset += bytes_added;
  	added = 0;
963030817   Josef Bacik   Btrfs: use hybrid...
1623
1624
1625
1626
1627
1628
1629
1630
1631
  
  	if (!bytes) {
  		ret = 1;
  		goto out;
  	} else
  		goto again;
  
  new_bitmap:
  	if (info && info->bitmap) {
34d52cb6c   Li Zefan   Btrfs: Make free ...
1632
  		add_new_bitmap(ctl, info, offset);
963030817   Josef Bacik   Btrfs: use hybrid...
1633
1634
1635
1636
  		added = 1;
  		info = NULL;
  		goto again;
  	} else {
34d52cb6c   Li Zefan   Btrfs: Make free ...
1637
  		spin_unlock(&ctl->tree_lock);
963030817   Josef Bacik   Btrfs: use hybrid...
1638
1639
1640
  
  		/* no pre-allocated info, allocate a new one */
  		if (!info) {
dc89e9824   Josef Bacik   Btrfs: use a slab...
1641
1642
  			info = kmem_cache_zalloc(btrfs_free_space_cachep,
  						 GFP_NOFS);
963030817   Josef Bacik   Btrfs: use hybrid...
1643
  			if (!info) {
34d52cb6c   Li Zefan   Btrfs: Make free ...
1644
  				spin_lock(&ctl->tree_lock);
963030817   Josef Bacik   Btrfs: use hybrid...
1645
1646
1647
1648
1649
1650
1651
  				ret = -ENOMEM;
  				goto out;
  			}
  		}
  
  		/* allocate the bitmap */
  		info->bitmap = kzalloc(PAGE_CACHE_SIZE, GFP_NOFS);
34d52cb6c   Li Zefan   Btrfs: Make free ...
1652
  		spin_lock(&ctl->tree_lock);
963030817   Josef Bacik   Btrfs: use hybrid...
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
  		if (!info->bitmap) {
  			ret = -ENOMEM;
  			goto out;
  		}
  		goto again;
  	}
  
  out:
  	if (info) {
  		if (info->bitmap)
  			kfree(info->bitmap);
dc89e9824   Josef Bacik   Btrfs: use a slab...
1664
  		kmem_cache_free(btrfs_free_space_cachep, info);
963030817   Josef Bacik   Btrfs: use hybrid...
1665
  	}
0f9dd46cd   Josef Bacik   Btrfs: free space...
1666
1667
1668
  
  	return ret;
  }
945d8962c   Chris Mason   Merge branch 'cle...
1669
  static bool try_merge_free_space(struct btrfs_free_space_ctl *ctl,
f333adb5d   Li Zefan   btrfs: Check merg...
1670
  			  struct btrfs_free_space *info, bool update_stat)
0f9dd46cd   Josef Bacik   Btrfs: free space...
1671
  {
120d66eec   Li Zefan   btrfs: Add a help...
1672
1673
1674
1675
1676
  	struct btrfs_free_space *left_info;
  	struct btrfs_free_space *right_info;
  	bool merged = false;
  	u64 offset = info->offset;
  	u64 bytes = info->bytes;
6226cb0a5   Josef Bacik   Btrfs: kill the b...
1677

0f9dd46cd   Josef Bacik   Btrfs: free space...
1678
1679
1680
1681
1682
  	/*
  	 * first we want to see if there is free space adjacent to the range we
  	 * are adding, if there is remove that struct and add a new one to
  	 * cover the entire range
  	 */
34d52cb6c   Li Zefan   Btrfs: Make free ...
1683
  	right_info = tree_search_offset(ctl, offset + bytes, 0, 0);
963030817   Josef Bacik   Btrfs: use hybrid...
1684
1685
1686
1687
  	if (right_info && rb_prev(&right_info->offset_index))
  		left_info = rb_entry(rb_prev(&right_info->offset_index),
  				     struct btrfs_free_space, offset_index);
  	else
34d52cb6c   Li Zefan   Btrfs: Make free ...
1688
  		left_info = tree_search_offset(ctl, offset - 1, 0, 0);
0f9dd46cd   Josef Bacik   Btrfs: free space...
1689

963030817   Josef Bacik   Btrfs: use hybrid...
1690
  	if (right_info && !right_info->bitmap) {
f333adb5d   Li Zefan   btrfs: Check merg...
1691
  		if (update_stat)
34d52cb6c   Li Zefan   Btrfs: Make free ...
1692
  			unlink_free_space(ctl, right_info);
f333adb5d   Li Zefan   btrfs: Check merg...
1693
  		else
34d52cb6c   Li Zefan   Btrfs: Make free ...
1694
  			__unlink_free_space(ctl, right_info);
6226cb0a5   Josef Bacik   Btrfs: kill the b...
1695
  		info->bytes += right_info->bytes;
dc89e9824   Josef Bacik   Btrfs: use a slab...
1696
  		kmem_cache_free(btrfs_free_space_cachep, right_info);
120d66eec   Li Zefan   btrfs: Add a help...
1697
  		merged = true;
0f9dd46cd   Josef Bacik   Btrfs: free space...
1698
  	}
963030817   Josef Bacik   Btrfs: use hybrid...
1699
1700
  	if (left_info && !left_info->bitmap &&
  	    left_info->offset + left_info->bytes == offset) {
f333adb5d   Li Zefan   btrfs: Check merg...
1701
  		if (update_stat)
34d52cb6c   Li Zefan   Btrfs: Make free ...
1702
  			unlink_free_space(ctl, left_info);
f333adb5d   Li Zefan   btrfs: Check merg...
1703
  		else
34d52cb6c   Li Zefan   Btrfs: Make free ...
1704
  			__unlink_free_space(ctl, left_info);
6226cb0a5   Josef Bacik   Btrfs: kill the b...
1705
1706
  		info->offset = left_info->offset;
  		info->bytes += left_info->bytes;
dc89e9824   Josef Bacik   Btrfs: use a slab...
1707
  		kmem_cache_free(btrfs_free_space_cachep, left_info);
120d66eec   Li Zefan   btrfs: Add a help...
1708
  		merged = true;
0f9dd46cd   Josef Bacik   Btrfs: free space...
1709
  	}
120d66eec   Li Zefan   btrfs: Add a help...
1710
1711
  	return merged;
  }
581bb0509   Li Zefan   Btrfs: Cache free...
1712
1713
  int __btrfs_add_free_space(struct btrfs_free_space_ctl *ctl,
  			   u64 offset, u64 bytes)
120d66eec   Li Zefan   btrfs: Add a help...
1714
1715
1716
  {
  	struct btrfs_free_space *info;
  	int ret = 0;
dc89e9824   Josef Bacik   Btrfs: use a slab...
1717
  	info = kmem_cache_zalloc(btrfs_free_space_cachep, GFP_NOFS);
120d66eec   Li Zefan   btrfs: Add a help...
1718
1719
1720
1721
1722
  	if (!info)
  		return -ENOMEM;
  
  	info->offset = offset;
  	info->bytes = bytes;
34d52cb6c   Li Zefan   Btrfs: Make free ...
1723
  	spin_lock(&ctl->tree_lock);
120d66eec   Li Zefan   btrfs: Add a help...
1724

34d52cb6c   Li Zefan   Btrfs: Make free ...
1725
  	if (try_merge_free_space(ctl, info, true))
120d66eec   Li Zefan   btrfs: Add a help...
1726
1727
1728
1729
1730
1731
1732
  		goto link;
  
  	/*
  	 * There was no extent directly to the left or right of this new
  	 * extent then we know we're going to have to allocate a new extent, so
  	 * before we do that see if we need to drop this into a bitmap
  	 */
34d52cb6c   Li Zefan   Btrfs: Make free ...
1733
  	ret = insert_into_bitmap(ctl, info);
120d66eec   Li Zefan   btrfs: Add a help...
1734
1735
1736
1737
1738
1739
1740
  	if (ret < 0) {
  		goto out;
  	} else if (ret) {
  		ret = 0;
  		goto out;
  	}
  link:
34d52cb6c   Li Zefan   Btrfs: Make free ...
1741
  	ret = link_free_space(ctl, info);
0f9dd46cd   Josef Bacik   Btrfs: free space...
1742
  	if (ret)
dc89e9824   Josef Bacik   Btrfs: use a slab...
1743
  		kmem_cache_free(btrfs_free_space_cachep, info);
963030817   Josef Bacik   Btrfs: use hybrid...
1744
  out:
34d52cb6c   Li Zefan   Btrfs: Make free ...
1745
  	spin_unlock(&ctl->tree_lock);
6226cb0a5   Josef Bacik   Btrfs: kill the b...
1746

0f9dd46cd   Josef Bacik   Btrfs: free space...
1747
  	if (ret) {
963030817   Josef Bacik   Btrfs: use hybrid...
1748
1749
  		printk(KERN_CRIT "btrfs: unable to add free space :%d
  ", ret);
c293498be   Stoyan Gaydarov   Btrfs: BUG to BUG...
1750
  		BUG_ON(ret == -EEXIST);
0f9dd46cd   Josef Bacik   Btrfs: free space...
1751
  	}
0f9dd46cd   Josef Bacik   Btrfs: free space...
1752
1753
  	return ret;
  }
6226cb0a5   Josef Bacik   Btrfs: kill the b...
1754
1755
  int btrfs_remove_free_space(struct btrfs_block_group_cache *block_group,
  			    u64 offset, u64 bytes)
0f9dd46cd   Josef Bacik   Btrfs: free space...
1756
  {
34d52cb6c   Li Zefan   Btrfs: Make free ...
1757
  	struct btrfs_free_space_ctl *ctl = block_group->free_space_ctl;
0f9dd46cd   Josef Bacik   Btrfs: free space...
1758
  	struct btrfs_free_space *info;
963030817   Josef Bacik   Btrfs: use hybrid...
1759
  	struct btrfs_free_space *next_info = NULL;
0f9dd46cd   Josef Bacik   Btrfs: free space...
1760
  	int ret = 0;
34d52cb6c   Li Zefan   Btrfs: Make free ...
1761
  	spin_lock(&ctl->tree_lock);
6226cb0a5   Josef Bacik   Btrfs: kill the b...
1762

963030817   Josef Bacik   Btrfs: use hybrid...
1763
  again:
34d52cb6c   Li Zefan   Btrfs: Make free ...
1764
  	info = tree_search_offset(ctl, offset, 0, 0);
963030817   Josef Bacik   Btrfs: use hybrid...
1765
  	if (!info) {
6606bb97e   Josef Bacik   Btrfs: fix btrfs_...
1766
1767
1768
1769
  		/*
  		 * oops didn't find an extent that matched the space we wanted
  		 * to remove, look for a bitmap instead
  		 */
34d52cb6c   Li Zefan   Btrfs: Make free ...
1770
  		info = tree_search_offset(ctl, offset_to_bitmap(ctl, offset),
6606bb97e   Josef Bacik   Btrfs: fix btrfs_...
1771
1772
  					  1, 0);
  		if (!info) {
24a703139   Chris Mason   Btrfs: remove fre...
1773
1774
1775
1776
1777
1778
1779
  			/* the tree logging code might be calling us before we
  			 * have fully loaded the free space rbtree for this
  			 * block group.  So it is possible the entry won't
  			 * be in the rbtree yet at all.  The caching code
  			 * will make sure not to put it in the rbtree if
  			 * the logging code has pinned it.
  			 */
6606bb97e   Josef Bacik   Btrfs: fix btrfs_...
1780
1781
  			goto out_lock;
  		}
963030817   Josef Bacik   Btrfs: use hybrid...
1782
1783
1784
1785
1786
1787
1788
1789
1790
  	}
  
  	if (info->bytes < bytes && rb_next(&info->offset_index)) {
  		u64 end;
  		next_info = rb_entry(rb_next(&info->offset_index),
  					     struct btrfs_free_space,
  					     offset_index);
  
  		if (next_info->bitmap)
34d52cb6c   Li Zefan   Btrfs: Make free ...
1791
1792
  			end = next_info->offset +
  			      BITS_PER_BITMAP * ctl->unit - 1;
963030817   Josef Bacik   Btrfs: use hybrid...
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
  		else
  			end = next_info->offset + next_info->bytes;
  
  		if (next_info->bytes < bytes ||
  		    next_info->offset > offset || offset > end) {
  			printk(KERN_CRIT "Found free space at %llu, size %llu,"
  			      " trying to use %llu
  ",
  			      (unsigned long long)info->offset,
  			      (unsigned long long)info->bytes,
  			      (unsigned long long)bytes);
0f9dd46cd   Josef Bacik   Btrfs: free space...
1804
1805
  			WARN_ON(1);
  			ret = -EINVAL;
963030817   Josef Bacik   Btrfs: use hybrid...
1806
  			goto out_lock;
0f9dd46cd   Josef Bacik   Btrfs: free space...
1807
  		}
0f9dd46cd   Josef Bacik   Btrfs: free space...
1808

963030817   Josef Bacik   Btrfs: use hybrid...
1809
1810
1811
1812
  		info = next_info;
  	}
  
  	if (info->bytes == bytes) {
34d52cb6c   Li Zefan   Btrfs: Make free ...
1813
  		unlink_free_space(ctl, info);
963030817   Josef Bacik   Btrfs: use hybrid...
1814
1815
  		if (info->bitmap) {
  			kfree(info->bitmap);
34d52cb6c   Li Zefan   Btrfs: Make free ...
1816
  			ctl->total_bitmaps--;
0f9dd46cd   Josef Bacik   Btrfs: free space...
1817
  		}
dc89e9824   Josef Bacik   Btrfs: use a slab...
1818
  		kmem_cache_free(btrfs_free_space_cachep, info);
1eae31e91   Chris Mason   Btrfs: make sure ...
1819
  		ret = 0;
963030817   Josef Bacik   Btrfs: use hybrid...
1820
1821
  		goto out_lock;
  	}
0f9dd46cd   Josef Bacik   Btrfs: free space...
1822

963030817   Josef Bacik   Btrfs: use hybrid...
1823
  	if (!info->bitmap && info->offset == offset) {
34d52cb6c   Li Zefan   Btrfs: Make free ...
1824
  		unlink_free_space(ctl, info);
0f9dd46cd   Josef Bacik   Btrfs: free space...
1825
1826
  		info->offset += bytes;
  		info->bytes -= bytes;
1eae31e91   Chris Mason   Btrfs: make sure ...
1827
1828
  		ret = link_free_space(ctl, info);
  		WARN_ON(ret);
963030817   Josef Bacik   Btrfs: use hybrid...
1829
1830
  		goto out_lock;
  	}
0f9dd46cd   Josef Bacik   Btrfs: free space...
1831

963030817   Josef Bacik   Btrfs: use hybrid...
1832
1833
  	if (!info->bitmap && info->offset <= offset &&
  	    info->offset + info->bytes >= offset + bytes) {
9b49c9b9f   Chris Mason   Btrfs: Fix alloca...
1834
1835
1836
1837
1838
1839
1840
1841
  		u64 old_start = info->offset;
  		/*
  		 * we're freeing space in the middle of the info,
  		 * this can happen during tree log replay
  		 *
  		 * first unlink the old info and then
  		 * insert it again after the hole we're creating
  		 */
34d52cb6c   Li Zefan   Btrfs: Make free ...
1842
  		unlink_free_space(ctl, info);
9b49c9b9f   Chris Mason   Btrfs: Fix alloca...
1843
1844
1845
1846
1847
  		if (offset + bytes < info->offset + info->bytes) {
  			u64 old_end = info->offset + info->bytes;
  
  			info->offset = offset + bytes;
  			info->bytes = old_end - info->offset;
34d52cb6c   Li Zefan   Btrfs: Make free ...
1848
  			ret = link_free_space(ctl, info);
963030817   Josef Bacik   Btrfs: use hybrid...
1849
1850
1851
  			WARN_ON(ret);
  			if (ret)
  				goto out_lock;
9b49c9b9f   Chris Mason   Btrfs: Fix alloca...
1852
1853
1854
1855
  		} else {
  			/* the hole we're creating ends at the end
  			 * of the info struct, just free the info
  			 */
dc89e9824   Josef Bacik   Btrfs: use a slab...
1856
  			kmem_cache_free(btrfs_free_space_cachep, info);
9b49c9b9f   Chris Mason   Btrfs: Fix alloca...
1857
  		}
34d52cb6c   Li Zefan   Btrfs: Make free ...
1858
  		spin_unlock(&ctl->tree_lock);
963030817   Josef Bacik   Btrfs: use hybrid...
1859
1860
1861
  
  		/* step two, insert a new info struct to cover
  		 * anything before the hole
9b49c9b9f   Chris Mason   Btrfs: Fix alloca...
1862
  		 */
6226cb0a5   Josef Bacik   Btrfs: kill the b...
1863
1864
  		ret = btrfs_add_free_space(block_group, old_start,
  					   offset - old_start);
963030817   Josef Bacik   Btrfs: use hybrid...
1865
1866
  		WARN_ON(ret);
  		goto out;
0f9dd46cd   Josef Bacik   Btrfs: free space...
1867
  	}
963030817   Josef Bacik   Btrfs: use hybrid...
1868

34d52cb6c   Li Zefan   Btrfs: Make free ...
1869
  	ret = remove_from_bitmap(ctl, info, &offset, &bytes);
963030817   Josef Bacik   Btrfs: use hybrid...
1870
1871
1872
1873
  	if (ret == -EAGAIN)
  		goto again;
  	BUG_ON(ret);
  out_lock:
34d52cb6c   Li Zefan   Btrfs: Make free ...
1874
  	spin_unlock(&ctl->tree_lock);
0f9dd46cd   Josef Bacik   Btrfs: free space...
1875
  out:
251792013   Josef Bacik   Btrfs: nuke fs wi...
1876
1877
  	return ret;
  }
0f9dd46cd   Josef Bacik   Btrfs: free space...
1878
1879
1880
  void btrfs_dump_free_space(struct btrfs_block_group_cache *block_group,
  			   u64 bytes)
  {
34d52cb6c   Li Zefan   Btrfs: Make free ...
1881
  	struct btrfs_free_space_ctl *ctl = block_group->free_space_ctl;
0f9dd46cd   Josef Bacik   Btrfs: free space...
1882
1883
1884
  	struct btrfs_free_space *info;
  	struct rb_node *n;
  	int count = 0;
34d52cb6c   Li Zefan   Btrfs: Make free ...
1885
  	for (n = rb_first(&ctl->free_space_offset); n; n = rb_next(n)) {
0f9dd46cd   Josef Bacik   Btrfs: free space...
1886
1887
1888
  		info = rb_entry(n, struct btrfs_free_space, offset_index);
  		if (info->bytes >= bytes)
  			count++;
963030817   Josef Bacik   Btrfs: use hybrid...
1889
1890
  		printk(KERN_CRIT "entry offset %llu, bytes %llu, bitmap %s
  ",
21380931e   Joel Becker   Btrfs: Fix a bunc...
1891
  		       (unsigned long long)info->offset,
963030817   Josef Bacik   Btrfs: use hybrid...
1892
1893
  		       (unsigned long long)info->bytes,
  		       (info->bitmap) ? "yes" : "no");
0f9dd46cd   Josef Bacik   Btrfs: free space...
1894
  	}
963030817   Josef Bacik   Btrfs: use hybrid...
1895
1896
1897
  	printk(KERN_INFO "block group has cluster?: %s
  ",
  	       list_empty(&block_group->cluster_list) ? "no" : "yes");
0f9dd46cd   Josef Bacik   Btrfs: free space...
1898
1899
1900
1901
  	printk(KERN_INFO "%d blocks of free space at or bigger than bytes is"
  	       "
  ", count);
  }
34d52cb6c   Li Zefan   Btrfs: Make free ...
1902
  void btrfs_init_free_space_ctl(struct btrfs_block_group_cache *block_group)
0f9dd46cd   Josef Bacik   Btrfs: free space...
1903
  {
34d52cb6c   Li Zefan   Btrfs: Make free ...
1904
  	struct btrfs_free_space_ctl *ctl = block_group->free_space_ctl;
0f9dd46cd   Josef Bacik   Btrfs: free space...
1905

34d52cb6c   Li Zefan   Btrfs: Make free ...
1906
1907
1908
1909
1910
  	spin_lock_init(&ctl->tree_lock);
  	ctl->unit = block_group->sectorsize;
  	ctl->start = block_group->key.objectid;
  	ctl->private = block_group;
  	ctl->op = &free_space_op;
0f9dd46cd   Josef Bacik   Btrfs: free space...
1911

34d52cb6c   Li Zefan   Btrfs: Make free ...
1912
1913
1914
1915
1916
1917
1918
  	/*
  	 * we only want to have 32k of ram per block group for keeping
  	 * track of free space, and if we pass 1/2 of that we want to
  	 * start converting things over to using bitmaps
  	 */
  	ctl->extents_thresh = ((1024 * 32) / 2) /
  				sizeof(struct btrfs_free_space);
0f9dd46cd   Josef Bacik   Btrfs: free space...
1919
  }
fa9c0d795   Chris Mason   Btrfs: rework all...
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
  /*
   * for a given cluster, put all of its extents back into the free
   * space cache.  If the block group passed doesn't match the block group
   * pointed to by the cluster, someone else raced in and freed the
   * cluster already.  In that case, we just return without changing anything
   */
  static int
  __btrfs_return_cluster_to_free_space(
  			     struct btrfs_block_group_cache *block_group,
  			     struct btrfs_free_cluster *cluster)
  {
34d52cb6c   Li Zefan   Btrfs: Make free ...
1931
  	struct btrfs_free_space_ctl *ctl = block_group->free_space_ctl;
fa9c0d795   Chris Mason   Btrfs: rework all...
1932
1933
1934
1935
1936
1937
  	struct btrfs_free_space *entry;
  	struct rb_node *node;
  
  	spin_lock(&cluster->lock);
  	if (cluster->block_group != block_group)
  		goto out;
963030817   Josef Bacik   Btrfs: use hybrid...
1938
  	cluster->block_group = NULL;
fa9c0d795   Chris Mason   Btrfs: rework all...
1939
  	cluster->window_start = 0;
963030817   Josef Bacik   Btrfs: use hybrid...
1940
  	list_del_init(&cluster->block_group_list);
963030817   Josef Bacik   Btrfs: use hybrid...
1941

fa9c0d795   Chris Mason   Btrfs: rework all...
1942
  	node = rb_first(&cluster->root);
963030817   Josef Bacik   Btrfs: use hybrid...
1943
  	while (node) {
4e69b598f   Josef Bacik   Btrfs: cleanup ho...
1944
  		bool bitmap;
fa9c0d795   Chris Mason   Btrfs: rework all...
1945
1946
1947
  		entry = rb_entry(node, struct btrfs_free_space, offset_index);
  		node = rb_next(&entry->offset_index);
  		rb_erase(&entry->offset_index, &cluster->root);
4e69b598f   Josef Bacik   Btrfs: cleanup ho...
1948
1949
1950
  
  		bitmap = (entry->bitmap != NULL);
  		if (!bitmap)
34d52cb6c   Li Zefan   Btrfs: Make free ...
1951
1952
  			try_merge_free_space(ctl, entry, false);
  		tree_insert_offset(&ctl->free_space_offset,
4e69b598f   Josef Bacik   Btrfs: cleanup ho...
1953
  				   entry->offset, &entry->offset_index, bitmap);
fa9c0d795   Chris Mason   Btrfs: rework all...
1954
  	}
6bef4d317   Eric Paris   Btrfs: use RB_ROO...
1955
  	cluster->root = RB_ROOT;
963030817   Josef Bacik   Btrfs: use hybrid...
1956

fa9c0d795   Chris Mason   Btrfs: rework all...
1957
1958
  out:
  	spin_unlock(&cluster->lock);
963030817   Josef Bacik   Btrfs: use hybrid...
1959
  	btrfs_put_block_group(block_group);
fa9c0d795   Chris Mason   Btrfs: rework all...
1960
1961
  	return 0;
  }
096553730   Chris Mason   Merge branch 'ino...
1962
  void __btrfs_remove_free_space_cache_locked(struct btrfs_free_space_ctl *ctl)
0f9dd46cd   Josef Bacik   Btrfs: free space...
1963
1964
1965
  {
  	struct btrfs_free_space *info;
  	struct rb_node *node;
581bb0509   Li Zefan   Btrfs: Cache free...
1966

581bb0509   Li Zefan   Btrfs: Cache free...
1967
1968
  	while ((node = rb_last(&ctl->free_space_offset)) != NULL) {
  		info = rb_entry(node, struct btrfs_free_space, offset_index);
9b90f5135   Josef Bacik   Btrfs: make sure ...
1969
1970
1971
1972
1973
1974
  		if (!info->bitmap) {
  			unlink_free_space(ctl, info);
  			kmem_cache_free(btrfs_free_space_cachep, info);
  		} else {
  			free_bitmap(ctl, info);
  		}
581bb0509   Li Zefan   Btrfs: Cache free...
1975
1976
1977
1978
1979
1980
  		if (need_resched()) {
  			spin_unlock(&ctl->tree_lock);
  			cond_resched();
  			spin_lock(&ctl->tree_lock);
  		}
  	}
096553730   Chris Mason   Merge branch 'ino...
1981
1982
1983
1984
1985
1986
  }
  
  void __btrfs_remove_free_space_cache(struct btrfs_free_space_ctl *ctl)
  {
  	spin_lock(&ctl->tree_lock);
  	__btrfs_remove_free_space_cache_locked(ctl);
581bb0509   Li Zefan   Btrfs: Cache free...
1987
1988
1989
1990
1991
1992
  	spin_unlock(&ctl->tree_lock);
  }
  
  void btrfs_remove_free_space_cache(struct btrfs_block_group_cache *block_group)
  {
  	struct btrfs_free_space_ctl *ctl = block_group->free_space_ctl;
fa9c0d795   Chris Mason   Btrfs: rework all...
1993
  	struct btrfs_free_cluster *cluster;
963030817   Josef Bacik   Btrfs: use hybrid...
1994
  	struct list_head *head;
0f9dd46cd   Josef Bacik   Btrfs: free space...
1995

34d52cb6c   Li Zefan   Btrfs: Make free ...
1996
  	spin_lock(&ctl->tree_lock);
963030817   Josef Bacik   Btrfs: use hybrid...
1997
1998
1999
2000
  	while ((head = block_group->cluster_list.next) !=
  	       &block_group->cluster_list) {
  		cluster = list_entry(head, struct btrfs_free_cluster,
  				     block_group_list);
fa9c0d795   Chris Mason   Btrfs: rework all...
2001
2002
2003
  
  		WARN_ON(cluster->block_group != block_group);
  		__btrfs_return_cluster_to_free_space(block_group, cluster);
963030817   Josef Bacik   Btrfs: use hybrid...
2004
  		if (need_resched()) {
34d52cb6c   Li Zefan   Btrfs: Make free ...
2005
  			spin_unlock(&ctl->tree_lock);
963030817   Josef Bacik   Btrfs: use hybrid...
2006
  			cond_resched();
34d52cb6c   Li Zefan   Btrfs: Make free ...
2007
  			spin_lock(&ctl->tree_lock);
963030817   Josef Bacik   Btrfs: use hybrid...
2008
  		}
fa9c0d795   Chris Mason   Btrfs: rework all...
2009
  	}
096553730   Chris Mason   Merge branch 'ino...
2010
  	__btrfs_remove_free_space_cache_locked(ctl);
34d52cb6c   Li Zefan   Btrfs: Make free ...
2011
  	spin_unlock(&ctl->tree_lock);
fa9c0d795   Chris Mason   Btrfs: rework all...
2012

0f9dd46cd   Josef Bacik   Btrfs: free space...
2013
  }
6226cb0a5   Josef Bacik   Btrfs: kill the b...
2014
2015
  u64 btrfs_find_space_for_alloc(struct btrfs_block_group_cache *block_group,
  			       u64 offset, u64 bytes, u64 empty_size)
0f9dd46cd   Josef Bacik   Btrfs: free space...
2016
  {
34d52cb6c   Li Zefan   Btrfs: Make free ...
2017
  	struct btrfs_free_space_ctl *ctl = block_group->free_space_ctl;
6226cb0a5   Josef Bacik   Btrfs: kill the b...
2018
  	struct btrfs_free_space *entry = NULL;
963030817   Josef Bacik   Btrfs: use hybrid...
2019
  	u64 bytes_search = bytes + empty_size;
6226cb0a5   Josef Bacik   Btrfs: kill the b...
2020
  	u64 ret = 0;
0f9dd46cd   Josef Bacik   Btrfs: free space...
2021

34d52cb6c   Li Zefan   Btrfs: Make free ...
2022
2023
  	spin_lock(&ctl->tree_lock);
  	entry = find_free_space(ctl, &offset, &bytes_search);
6226cb0a5   Josef Bacik   Btrfs: kill the b...
2024
  	if (!entry)
963030817   Josef Bacik   Btrfs: use hybrid...
2025
2026
2027
2028
  		goto out;
  
  	ret = offset;
  	if (entry->bitmap) {
34d52cb6c   Li Zefan   Btrfs: Make free ...
2029
  		bitmap_clear_bits(ctl, entry, offset, bytes);
edf6e2d1d   Li Zefan   btrfs: Add helper...
2030
  		if (!entry->bytes)
34d52cb6c   Li Zefan   Btrfs: Make free ...
2031
  			free_bitmap(ctl, entry);
963030817   Josef Bacik   Btrfs: use hybrid...
2032
  	} else {
34d52cb6c   Li Zefan   Btrfs: Make free ...
2033
  		unlink_free_space(ctl, entry);
6226cb0a5   Josef Bacik   Btrfs: kill the b...
2034
2035
  		entry->offset += bytes;
  		entry->bytes -= bytes;
6226cb0a5   Josef Bacik   Btrfs: kill the b...
2036
  		if (!entry->bytes)
dc89e9824   Josef Bacik   Btrfs: use a slab...
2037
  			kmem_cache_free(btrfs_free_space_cachep, entry);
6226cb0a5   Josef Bacik   Btrfs: kill the b...
2038
  		else
34d52cb6c   Li Zefan   Btrfs: Make free ...
2039
  			link_free_space(ctl, entry);
6226cb0a5   Josef Bacik   Btrfs: kill the b...
2040
  	}
0f9dd46cd   Josef Bacik   Btrfs: free space...
2041

963030817   Josef Bacik   Btrfs: use hybrid...
2042
  out:
34d52cb6c   Li Zefan   Btrfs: Make free ...
2043
  	spin_unlock(&ctl->tree_lock);
817d52f8d   Josef Bacik   Btrfs: async bloc...
2044

0f9dd46cd   Josef Bacik   Btrfs: free space...
2045
2046
  	return ret;
  }
fa9c0d795   Chris Mason   Btrfs: rework all...
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
  
  /*
   * given a cluster, put all of its extents back into the free space
   * cache.  If a block group is passed, this function will only free
   * a cluster that belongs to the passed block group.
   *
   * Otherwise, it'll get a reference on the block group pointed to by the
   * cluster and remove the cluster from it.
   */
  int btrfs_return_cluster_to_free_space(
  			       struct btrfs_block_group_cache *block_group,
  			       struct btrfs_free_cluster *cluster)
  {
34d52cb6c   Li Zefan   Btrfs: Make free ...
2060
  	struct btrfs_free_space_ctl *ctl;
fa9c0d795   Chris Mason   Btrfs: rework all...
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
  	int ret;
  
  	/* first, get a safe pointer to the block group */
  	spin_lock(&cluster->lock);
  	if (!block_group) {
  		block_group = cluster->block_group;
  		if (!block_group) {
  			spin_unlock(&cluster->lock);
  			return 0;
  		}
  	} else if (cluster->block_group != block_group) {
  		/* someone else has already freed it don't redo their work */
  		spin_unlock(&cluster->lock);
  		return 0;
  	}
  	atomic_inc(&block_group->count);
  	spin_unlock(&cluster->lock);
34d52cb6c   Li Zefan   Btrfs: Make free ...
2078
  	ctl = block_group->free_space_ctl;
fa9c0d795   Chris Mason   Btrfs: rework all...
2079
  	/* now return any extents the cluster had on it */
34d52cb6c   Li Zefan   Btrfs: Make free ...
2080
  	spin_lock(&ctl->tree_lock);
fa9c0d795   Chris Mason   Btrfs: rework all...
2081
  	ret = __btrfs_return_cluster_to_free_space(block_group, cluster);
34d52cb6c   Li Zefan   Btrfs: Make free ...
2082
  	spin_unlock(&ctl->tree_lock);
fa9c0d795   Chris Mason   Btrfs: rework all...
2083
2084
2085
2086
2087
  
  	/* finally drop our ref */
  	btrfs_put_block_group(block_group);
  	return ret;
  }
963030817   Josef Bacik   Btrfs: use hybrid...
2088
2089
  static u64 btrfs_alloc_from_bitmap(struct btrfs_block_group_cache *block_group,
  				   struct btrfs_free_cluster *cluster,
4e69b598f   Josef Bacik   Btrfs: cleanup ho...
2090
  				   struct btrfs_free_space *entry,
963030817   Josef Bacik   Btrfs: use hybrid...
2091
2092
  				   u64 bytes, u64 min_start)
  {
34d52cb6c   Li Zefan   Btrfs: Make free ...
2093
  	struct btrfs_free_space_ctl *ctl = block_group->free_space_ctl;
963030817   Josef Bacik   Btrfs: use hybrid...
2094
2095
2096
2097
  	int err;
  	u64 search_start = cluster->window_start;
  	u64 search_bytes = bytes;
  	u64 ret = 0;
963030817   Josef Bacik   Btrfs: use hybrid...
2098
2099
  	search_start = min_start;
  	search_bytes = bytes;
34d52cb6c   Li Zefan   Btrfs: Make free ...
2100
  	err = search_bitmap(ctl, entry, &search_start, &search_bytes);
963030817   Josef Bacik   Btrfs: use hybrid...
2101
  	if (err)
4e69b598f   Josef Bacik   Btrfs: cleanup ho...
2102
  		return 0;
963030817   Josef Bacik   Btrfs: use hybrid...
2103
2104
  
  	ret = search_start;
bb3ac5a4d   Miao Xie   Btrfs: fix wrong ...
2105
  	__bitmap_clear_bits(ctl, entry, ret, bytes);
963030817   Josef Bacik   Btrfs: use hybrid...
2106
2107
2108
  
  	return ret;
  }
fa9c0d795   Chris Mason   Btrfs: rework all...
2109
2110
2111
2112
2113
2114
2115
2116
2117
  /*
   * given a cluster, try to allocate 'bytes' from it, returns 0
   * if it couldn't find anything suitably large, or a logical disk offset
   * if things worked out
   */
  u64 btrfs_alloc_from_cluster(struct btrfs_block_group_cache *block_group,
  			     struct btrfs_free_cluster *cluster, u64 bytes,
  			     u64 min_start)
  {
34d52cb6c   Li Zefan   Btrfs: Make free ...
2118
  	struct btrfs_free_space_ctl *ctl = block_group->free_space_ctl;
fa9c0d795   Chris Mason   Btrfs: rework all...
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
  	struct btrfs_free_space *entry = NULL;
  	struct rb_node *node;
  	u64 ret = 0;
  
  	spin_lock(&cluster->lock);
  	if (bytes > cluster->max_size)
  		goto out;
  
  	if (cluster->block_group != block_group)
  		goto out;
  
  	node = rb_first(&cluster->root);
  	if (!node)
  		goto out;
  
  	entry = rb_entry(node, struct btrfs_free_space, offset_index);
fa9c0d795   Chris Mason   Btrfs: rework all...
2135
  	while(1) {
4e69b598f   Josef Bacik   Btrfs: cleanup ho...
2136
2137
  		if (entry->bytes < bytes ||
  		    (!entry->bitmap && entry->offset < min_start)) {
fa9c0d795   Chris Mason   Btrfs: rework all...
2138
2139
2140
2141
2142
2143
2144
  			node = rb_next(&entry->offset_index);
  			if (!node)
  				break;
  			entry = rb_entry(node, struct btrfs_free_space,
  					 offset_index);
  			continue;
  		}
fa9c0d795   Chris Mason   Btrfs: rework all...
2145

4e69b598f   Josef Bacik   Btrfs: cleanup ho...
2146
2147
2148
2149
2150
  		if (entry->bitmap) {
  			ret = btrfs_alloc_from_bitmap(block_group,
  						      cluster, entry, bytes,
  						      min_start);
  			if (ret == 0) {
4e69b598f   Josef Bacik   Btrfs: cleanup ho...
2151
2152
2153
2154
2155
2156
2157
2158
  				node = rb_next(&entry->offset_index);
  				if (!node)
  					break;
  				entry = rb_entry(node, struct btrfs_free_space,
  						 offset_index);
  				continue;
  			}
  		} else {
4e69b598f   Josef Bacik   Btrfs: cleanup ho...
2159
2160
2161
2162
2163
  			ret = entry->offset;
  
  			entry->offset += bytes;
  			entry->bytes -= bytes;
  		}
fa9c0d795   Chris Mason   Btrfs: rework all...
2164

5e71b5d5e   Li Zefan   btrfs: Update sta...
2165
  		if (entry->bytes == 0)
fa9c0d795   Chris Mason   Btrfs: rework all...
2166
  			rb_erase(&entry->offset_index, &cluster->root);
fa9c0d795   Chris Mason   Btrfs: rework all...
2167
2168
2169
2170
  		break;
  	}
  out:
  	spin_unlock(&cluster->lock);
963030817   Josef Bacik   Btrfs: use hybrid...
2171

5e71b5d5e   Li Zefan   btrfs: Update sta...
2172
2173
  	if (!ret)
  		return 0;
34d52cb6c   Li Zefan   Btrfs: Make free ...
2174
  	spin_lock(&ctl->tree_lock);
5e71b5d5e   Li Zefan   btrfs: Update sta...
2175

34d52cb6c   Li Zefan   Btrfs: Make free ...
2176
  	ctl->free_space -= bytes;
5e71b5d5e   Li Zefan   btrfs: Update sta...
2177
  	if (entry->bytes == 0) {
34d52cb6c   Li Zefan   Btrfs: Make free ...
2178
  		ctl->free_extents--;
4e69b598f   Josef Bacik   Btrfs: cleanup ho...
2179
2180
  		if (entry->bitmap) {
  			kfree(entry->bitmap);
34d52cb6c   Li Zefan   Btrfs: Make free ...
2181
2182
  			ctl->total_bitmaps--;
  			ctl->op->recalc_thresholds(ctl);
4e69b598f   Josef Bacik   Btrfs: cleanup ho...
2183
  		}
dc89e9824   Josef Bacik   Btrfs: use a slab...
2184
  		kmem_cache_free(btrfs_free_space_cachep, entry);
5e71b5d5e   Li Zefan   btrfs: Update sta...
2185
  	}
34d52cb6c   Li Zefan   Btrfs: Make free ...
2186
  	spin_unlock(&ctl->tree_lock);
5e71b5d5e   Li Zefan   btrfs: Update sta...
2187

fa9c0d795   Chris Mason   Btrfs: rework all...
2188
2189
  	return ret;
  }
963030817   Josef Bacik   Btrfs: use hybrid...
2190
2191
2192
2193
2194
  static int btrfs_bitmap_cluster(struct btrfs_block_group_cache *block_group,
  				struct btrfs_free_space *entry,
  				struct btrfs_free_cluster *cluster,
  				u64 offset, u64 bytes, u64 min_bytes)
  {
34d52cb6c   Li Zefan   Btrfs: Make free ...
2195
  	struct btrfs_free_space_ctl *ctl = block_group->free_space_ctl;
963030817   Josef Bacik   Btrfs: use hybrid...
2196
2197
2198
2199
2200
2201
2202
  	unsigned long next_zero;
  	unsigned long i;
  	unsigned long search_bits;
  	unsigned long total_bits;
  	unsigned long found_bits;
  	unsigned long start = 0;
  	unsigned long total_found = 0;
4e69b598f   Josef Bacik   Btrfs: cleanup ho...
2203
  	int ret;
963030817   Josef Bacik   Btrfs: use hybrid...
2204
2205
2206
2207
  	bool found = false;
  
  	i = offset_to_bit(entry->offset, block_group->sectorsize,
  			  max_t(u64, offset, entry->offset));
d0a365e84   Josef Bacik   Btrfs: deal with ...
2208
2209
  	search_bits = bytes_to_bits(bytes, block_group->sectorsize);
  	total_bits = bytes_to_bits(min_bytes, block_group->sectorsize);
963030817   Josef Bacik   Btrfs: use hybrid...
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
  
  again:
  	found_bits = 0;
  	for (i = find_next_bit(entry->bitmap, BITS_PER_BITMAP, i);
  	     i < BITS_PER_BITMAP;
  	     i = find_next_bit(entry->bitmap, BITS_PER_BITMAP, i + 1)) {
  		next_zero = find_next_zero_bit(entry->bitmap,
  					       BITS_PER_BITMAP, i);
  		if (next_zero - i >= search_bits) {
  			found_bits = next_zero - i;
  			break;
  		}
  		i = next_zero;
  	}
  
  	if (!found_bits)
4e69b598f   Josef Bacik   Btrfs: cleanup ho...
2226
  		return -ENOSPC;
963030817   Josef Bacik   Btrfs: use hybrid...
2227
2228
2229
  
  	if (!found) {
  		start = i;
b78d09bce   Alexandre Oliva   Btrfs: reset clus...
2230
  		cluster->max_size = 0;
963030817   Josef Bacik   Btrfs: use hybrid...
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
  		found = true;
  	}
  
  	total_found += found_bits;
  
  	if (cluster->max_size < found_bits * block_group->sectorsize)
  		cluster->max_size = found_bits * block_group->sectorsize;
  
  	if (total_found < total_bits) {
  		i = find_next_bit(entry->bitmap, BITS_PER_BITMAP, next_zero);
  		if (i - start > total_bits * 2) {
  			total_found = 0;
  			cluster->max_size = 0;
  			found = false;
  		}
  		goto again;
  	}
  
  	cluster->window_start = start * block_group->sectorsize +
  		entry->offset;
34d52cb6c   Li Zefan   Btrfs: Make free ...
2251
  	rb_erase(&entry->offset_index, &ctl->free_space_offset);
4e69b598f   Josef Bacik   Btrfs: cleanup ho...
2252
2253
2254
  	ret = tree_insert_offset(&cluster->root, entry->offset,
  				 &entry->offset_index, 1);
  	BUG_ON(ret);
963030817   Josef Bacik   Btrfs: use hybrid...
2255
2256
2257
  
  	return 0;
  }
fa9c0d795   Chris Mason   Btrfs: rework all...
2258
  /*
4e69b598f   Josef Bacik   Btrfs: cleanup ho...
2259
2260
   * This searches the block group for just extents to fill the cluster with.
   */
3de85bb95   Josef Bacik   Btrfs: noinline t...
2261
2262
2263
2264
2265
  static noinline int
  setup_cluster_no_bitmap(struct btrfs_block_group_cache *block_group,
  			struct btrfs_free_cluster *cluster,
  			struct list_head *bitmaps, u64 offset, u64 bytes,
  			u64 min_bytes)
4e69b598f   Josef Bacik   Btrfs: cleanup ho...
2266
  {
34d52cb6c   Li Zefan   Btrfs: Make free ...
2267
  	struct btrfs_free_space_ctl *ctl = block_group->free_space_ctl;
4e69b598f   Josef Bacik   Btrfs: cleanup ho...
2268
2269
2270
2271
2272
2273
2274
2275
2276
  	struct btrfs_free_space *first = NULL;
  	struct btrfs_free_space *entry = NULL;
  	struct btrfs_free_space *prev = NULL;
  	struct btrfs_free_space *last;
  	struct rb_node *node;
  	u64 window_start;
  	u64 window_free;
  	u64 max_extent;
  	u64 max_gap = 128 * 1024;
34d52cb6c   Li Zefan   Btrfs: Make free ...
2277
  	entry = tree_search_offset(ctl, offset, 0, 1);
4e69b598f   Josef Bacik   Btrfs: cleanup ho...
2278
2279
2280
2281
2282
2283
2284
2285
  	if (!entry)
  		return -ENOSPC;
  
  	/*
  	 * We don't want bitmaps, so just move along until we find a normal
  	 * extent entry.
  	 */
  	while (entry->bitmap) {
86d4a77ba   Josef Bacik   Btrfs: cache bitm...
2286
2287
  		if (list_empty(&entry->list))
  			list_add_tail(&entry->list, bitmaps);
4e69b598f   Josef Bacik   Btrfs: cleanup ho...
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
  		node = rb_next(&entry->offset_index);
  		if (!node)
  			return -ENOSPC;
  		entry = rb_entry(node, struct btrfs_free_space, offset_index);
  	}
  
  	window_start = entry->offset;
  	window_free = entry->bytes;
  	max_extent = entry->bytes;
  	first = entry;
  	last = entry;
  	prev = entry;
  
  	while (window_free <= min_bytes) {
  		node = rb_next(&entry->offset_index);
  		if (!node)
  			return -ENOSPC;
  		entry = rb_entry(node, struct btrfs_free_space, offset_index);
86d4a77ba   Josef Bacik   Btrfs: cache bitm...
2306
2307
2308
  		if (entry->bitmap) {
  			if (list_empty(&entry->list))
  				list_add_tail(&entry->list, bitmaps);
4e69b598f   Josef Bacik   Btrfs: cleanup ho...
2309
  			continue;
86d4a77ba   Josef Bacik   Btrfs: cache bitm...
2310
  		}
4e69b598f   Josef Bacik   Btrfs: cleanup ho...
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
  		/*
  		 * we haven't filled the empty size and the window is
  		 * very large.  reset and try again
  		 */
  		if (entry->offset - (prev->offset + prev->bytes) > max_gap ||
  		    entry->offset - window_start > (min_bytes * 2)) {
  			first = entry;
  			window_start = entry->offset;
  			window_free = entry->bytes;
  			last = entry;
  			max_extent = entry->bytes;
  		} else {
  			last = entry;
  			window_free += entry->bytes;
  			if (entry->bytes > max_extent)
  				max_extent = entry->bytes;
  		}
  		prev = entry;
  	}
  
  	cluster->window_start = first->offset;
  
  	node = &first->offset_index;
  
  	/*
  	 * now we've found our entries, pull them out of the free space
  	 * cache and put them into the cluster rbtree
  	 */
  	do {
  		int ret;
  
  		entry = rb_entry(node, struct btrfs_free_space, offset_index);
  		node = rb_next(&entry->offset_index);
  		if (entry->bitmap)
  			continue;
34d52cb6c   Li Zefan   Btrfs: Make free ...
2346
  		rb_erase(&entry->offset_index, &ctl->free_space_offset);
4e69b598f   Josef Bacik   Btrfs: cleanup ho...
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
  		ret = tree_insert_offset(&cluster->root, entry->offset,
  					 &entry->offset_index, 0);
  		BUG_ON(ret);
  	} while (node && entry != last);
  
  	cluster->max_size = max_extent;
  
  	return 0;
  }
  
  /*
   * This specifically looks for bitmaps that may work in the cluster, we assume
   * that we have already failed to find extents that will work.
   */
3de85bb95   Josef Bacik   Btrfs: noinline t...
2361
2362
2363
2364
2365
  static noinline int
  setup_cluster_bitmap(struct btrfs_block_group_cache *block_group,
  		     struct btrfs_free_cluster *cluster,
  		     struct list_head *bitmaps, u64 offset, u64 bytes,
  		     u64 min_bytes)
4e69b598f   Josef Bacik   Btrfs: cleanup ho...
2366
  {
34d52cb6c   Li Zefan   Btrfs: Make free ...
2367
  	struct btrfs_free_space_ctl *ctl = block_group->free_space_ctl;
4e69b598f   Josef Bacik   Btrfs: cleanup ho...
2368
  	struct btrfs_free_space *entry;
4e69b598f   Josef Bacik   Btrfs: cleanup ho...
2369
  	int ret = -ENOSPC;
0f0fbf1d0   Li Zefan   Btrfs: fix to sea...
2370
  	u64 bitmap_offset = offset_to_bitmap(ctl, offset);
4e69b598f   Josef Bacik   Btrfs: cleanup ho...
2371

34d52cb6c   Li Zefan   Btrfs: Make free ...
2372
  	if (ctl->total_bitmaps == 0)
4e69b598f   Josef Bacik   Btrfs: cleanup ho...
2373
  		return -ENOSPC;
86d4a77ba   Josef Bacik   Btrfs: cache bitm...
2374
  	/*
0f0fbf1d0   Li Zefan   Btrfs: fix to sea...
2375
2376
2377
2378
2379
2380
2381
2382
2383
  	 * The bitmap that covers offset won't be in the list unless offset
  	 * is just its start offset.
  	 */
  	entry = list_first_entry(bitmaps, struct btrfs_free_space, list);
  	if (entry->offset != bitmap_offset) {
  		entry = tree_search_offset(ctl, bitmap_offset, 1, 0);
  		if (entry && list_empty(&entry->list))
  			list_add(&entry->list, bitmaps);
  	}
86d4a77ba   Josef Bacik   Btrfs: cache bitm...
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
  	list_for_each_entry(entry, bitmaps, list) {
  		if (entry->bytes < min_bytes)
  			continue;
  		ret = btrfs_bitmap_cluster(block_group, entry, cluster, offset,
  					   bytes, min_bytes);
  		if (!ret)
  			return 0;
  	}
  
  	/*
52621cb6e   Li Zefan   Btrfs: avoid unne...
2394
2395
  	 * The bitmaps list has all the bitmaps that record free space
  	 * starting after offset, so no more search is required.
86d4a77ba   Josef Bacik   Btrfs: cache bitm...
2396
  	 */
52621cb6e   Li Zefan   Btrfs: avoid unne...
2397
  	return -ENOSPC;
4e69b598f   Josef Bacik   Btrfs: cleanup ho...
2398
2399
2400
  }
  
  /*
fa9c0d795   Chris Mason   Btrfs: rework all...
2401
2402
2403
2404
2405
2406
2407
2408
   * here we try to find a cluster of blocks in a block group.  The goal
   * is to find at least bytes free and up to empty_size + bytes free.
   * We might not find them all in one contiguous area.
   *
   * returns zero and sets up cluster if things worked out, otherwise
   * it returns -enospc
   */
  int btrfs_find_space_cluster(struct btrfs_trans_handle *trans,
451d7585a   Chris Mason   Btrfs: add mount ...
2409
  			     struct btrfs_root *root,
fa9c0d795   Chris Mason   Btrfs: rework all...
2410
2411
2412
2413
  			     struct btrfs_block_group_cache *block_group,
  			     struct btrfs_free_cluster *cluster,
  			     u64 offset, u64 bytes, u64 empty_size)
  {
34d52cb6c   Li Zefan   Btrfs: Make free ...
2414
  	struct btrfs_free_space_ctl *ctl = block_group->free_space_ctl;
86d4a77ba   Josef Bacik   Btrfs: cache bitm...
2415
  	struct btrfs_free_space *entry, *tmp;
52621cb6e   Li Zefan   Btrfs: avoid unne...
2416
  	LIST_HEAD(bitmaps);
fa9c0d795   Chris Mason   Btrfs: rework all...
2417
  	u64 min_bytes;
fa9c0d795   Chris Mason   Btrfs: rework all...
2418
2419
2420
  	int ret;
  
  	/* for metadata, allow allocates with more holes */
451d7585a   Chris Mason   Btrfs: add mount ...
2421
2422
2423
  	if (btrfs_test_opt(root, SSD_SPREAD)) {
  		min_bytes = bytes + empty_size;
  	} else if (block_group->flags & BTRFS_BLOCK_GROUP_METADATA) {
fa9c0d795   Chris Mason   Btrfs: rework all...
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
  		/*
  		 * we want to do larger allocations when we are
  		 * flushing out the delayed refs, it helps prevent
  		 * making more work as we go along.
  		 */
  		if (trans->transaction->delayed_refs.flushing)
  			min_bytes = max(bytes, (bytes + empty_size) >> 1);
  		else
  			min_bytes = max(bytes, (bytes + empty_size) >> 4);
  	} else
  		min_bytes = max(bytes, (bytes + empty_size) >> 2);
34d52cb6c   Li Zefan   Btrfs: Make free ...
2435
  	spin_lock(&ctl->tree_lock);
7d0d2e8e6   Josef Bacik   Btrfs: check free...
2436
2437
2438
2439
2440
  
  	/*
  	 * If we know we don't have enough space to make a cluster don't even
  	 * bother doing all the work to try and find one.
  	 */
34d52cb6c   Li Zefan   Btrfs: Make free ...
2441
2442
  	if (ctl->free_space < min_bytes) {
  		spin_unlock(&ctl->tree_lock);
7d0d2e8e6   Josef Bacik   Btrfs: check free...
2443
2444
  		return -ENOSPC;
  	}
fa9c0d795   Chris Mason   Btrfs: rework all...
2445
2446
2447
2448
2449
2450
2451
  	spin_lock(&cluster->lock);
  
  	/* someone already found a cluster, hooray */
  	if (cluster->block_group) {
  		ret = 0;
  		goto out;
  	}
fa9c0d795   Chris Mason   Btrfs: rework all...
2452

86d4a77ba   Josef Bacik   Btrfs: cache bitm...
2453
2454
  	ret = setup_cluster_no_bitmap(block_group, cluster, &bitmaps, offset,
  				      bytes, min_bytes);
4e69b598f   Josef Bacik   Btrfs: cleanup ho...
2455
  	if (ret)
86d4a77ba   Josef Bacik   Btrfs: cache bitm...
2456
2457
2458
2459
2460
2461
  		ret = setup_cluster_bitmap(block_group, cluster, &bitmaps,
  					   offset, bytes, min_bytes);
  
  	/* Clear our temporary list */
  	list_for_each_entry_safe(entry, tmp, &bitmaps, list)
  		list_del_init(&entry->list);
fa9c0d795   Chris Mason   Btrfs: rework all...
2462

4e69b598f   Josef Bacik   Btrfs: cleanup ho...
2463
2464
2465
2466
2467
  	if (!ret) {
  		atomic_inc(&block_group->count);
  		list_add_tail(&cluster->block_group_list,
  			      &block_group->cluster_list);
  		cluster->block_group = block_group;
fa9c0d795   Chris Mason   Btrfs: rework all...
2468
  	}
fa9c0d795   Chris Mason   Btrfs: rework all...
2469
2470
  out:
  	spin_unlock(&cluster->lock);
34d52cb6c   Li Zefan   Btrfs: Make free ...
2471
  	spin_unlock(&ctl->tree_lock);
fa9c0d795   Chris Mason   Btrfs: rework all...
2472
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
  
  	return ret;
  }
  
  /*
   * simple code to zero out a cluster
   */
  void btrfs_init_free_cluster(struct btrfs_free_cluster *cluster)
  {
  	spin_lock_init(&cluster->lock);
  	spin_lock_init(&cluster->refill_lock);
6bef4d317   Eric Paris   Btrfs: use RB_ROO...
2483
  	cluster->root = RB_ROOT;
fa9c0d795   Chris Mason   Btrfs: rework all...
2484
2485
2486
2487
  	cluster->max_size = 0;
  	INIT_LIST_HEAD(&cluster->block_group_list);
  	cluster->block_group = NULL;
  }
f7039b1d5   Li Dongyang   Btrfs: add btrfs_...
2488
2489
2490
  int btrfs_trim_block_group(struct btrfs_block_group_cache *block_group,
  			   u64 *trimmed, u64 start, u64 end, u64 minlen)
  {
34d52cb6c   Li Zefan   Btrfs: Make free ...
2491
  	struct btrfs_free_space_ctl *ctl = block_group->free_space_ctl;
f7039b1d5   Li Dongyang   Btrfs: add btrfs_...
2492
2493
2494
2495
2496
2497
2498
2499
2500
  	struct btrfs_free_space *entry = NULL;
  	struct btrfs_fs_info *fs_info = block_group->fs_info;
  	u64 bytes = 0;
  	u64 actually_trimmed;
  	int ret = 0;
  
  	*trimmed = 0;
  
  	while (start < end) {
34d52cb6c   Li Zefan   Btrfs: Make free ...
2501
  		spin_lock(&ctl->tree_lock);
f7039b1d5   Li Dongyang   Btrfs: add btrfs_...
2502

34d52cb6c   Li Zefan   Btrfs: Make free ...
2503
2504
  		if (ctl->free_space < minlen) {
  			spin_unlock(&ctl->tree_lock);
f7039b1d5   Li Dongyang   Btrfs: add btrfs_...
2505
2506
  			break;
  		}
34d52cb6c   Li Zefan   Btrfs: Make free ...
2507
  		entry = tree_search_offset(ctl, start, 0, 1);
f7039b1d5   Li Dongyang   Btrfs: add btrfs_...
2508
  		if (!entry)
34d52cb6c   Li Zefan   Btrfs: Make free ...
2509
2510
  			entry = tree_search_offset(ctl,
  						   offset_to_bitmap(ctl, start),
f7039b1d5   Li Dongyang   Btrfs: add btrfs_...
2511
2512
2513
  						   1, 1);
  
  		if (!entry || entry->offset >= end) {
34d52cb6c   Li Zefan   Btrfs: Make free ...
2514
  			spin_unlock(&ctl->tree_lock);
f7039b1d5   Li Dongyang   Btrfs: add btrfs_...
2515
2516
2517
2518
  			break;
  		}
  
  		if (entry->bitmap) {
34d52cb6c   Li Zefan   Btrfs: Make free ...
2519
  			ret = search_bitmap(ctl, entry, &start, &bytes);
f7039b1d5   Li Dongyang   Btrfs: add btrfs_...
2520
2521
  			if (!ret) {
  				if (start >= end) {
34d52cb6c   Li Zefan   Btrfs: Make free ...
2522
  					spin_unlock(&ctl->tree_lock);
f7039b1d5   Li Dongyang   Btrfs: add btrfs_...
2523
2524
2525
  					break;
  				}
  				bytes = min(bytes, end - start);
34d52cb6c   Li Zefan   Btrfs: Make free ...
2526
  				bitmap_clear_bits(ctl, entry, start, bytes);
f7039b1d5   Li Dongyang   Btrfs: add btrfs_...
2527
  				if (entry->bytes == 0)
34d52cb6c   Li Zefan   Btrfs: Make free ...
2528
  					free_bitmap(ctl, entry);
f7039b1d5   Li Dongyang   Btrfs: add btrfs_...
2529
2530
2531
  			} else {
  				start = entry->offset + BITS_PER_BITMAP *
  					block_group->sectorsize;
34d52cb6c   Li Zefan   Btrfs: Make free ...
2532
  				spin_unlock(&ctl->tree_lock);
f7039b1d5   Li Dongyang   Btrfs: add btrfs_...
2533
2534
2535
2536
2537
2538
  				ret = 0;
  				continue;
  			}
  		} else {
  			start = entry->offset;
  			bytes = min(entry->bytes, end - start);
34d52cb6c   Li Zefan   Btrfs: Make free ...
2539
  			unlink_free_space(ctl, entry);
f789b684b   Li Zefan   Btrfs: Free free_...
2540
  			kmem_cache_free(btrfs_free_space_cachep, entry);
f7039b1d5   Li Dongyang   Btrfs: add btrfs_...
2541
  		}
34d52cb6c   Li Zefan   Btrfs: Make free ...
2542
  		spin_unlock(&ctl->tree_lock);
f7039b1d5   Li Dongyang   Btrfs: add btrfs_...
2543
2544
  
  		if (bytes >= minlen) {
fb25e9141   Josef Bacik   Btrfs: use bytes_...
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
  			struct btrfs_space_info *space_info;
  			int update = 0;
  
  			space_info = block_group->space_info;
  			spin_lock(&space_info->lock);
  			spin_lock(&block_group->lock);
  			if (!block_group->ro) {
  				block_group->reserved += bytes;
  				space_info->bytes_reserved += bytes;
  				update = 1;
  			}
  			spin_unlock(&block_group->lock);
  			spin_unlock(&space_info->lock);
f7039b1d5   Li Dongyang   Btrfs: add btrfs_...
2558
2559
2560
2561
2562
  
  			ret = btrfs_error_discard_extent(fs_info->extent_root,
  							 start,
  							 bytes,
  							 &actually_trimmed);
34d52cb6c   Li Zefan   Btrfs: Make free ...
2563
  			btrfs_add_free_space(block_group, start, bytes);
fb25e9141   Josef Bacik   Btrfs: use bytes_...
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
  			if (update) {
  				spin_lock(&space_info->lock);
  				spin_lock(&block_group->lock);
  				if (block_group->ro)
  					space_info->bytes_readonly += bytes;
  				block_group->reserved -= bytes;
  				space_info->bytes_reserved -= bytes;
  				spin_unlock(&space_info->lock);
  				spin_unlock(&block_group->lock);
  			}
f7039b1d5   Li Dongyang   Btrfs: add btrfs_...
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584
2585
2586
2587
2588
2589
2590
2591
  
  			if (ret)
  				break;
  			*trimmed += actually_trimmed;
  		}
  		start += bytes;
  		bytes = 0;
  
  		if (fatal_signal_pending(current)) {
  			ret = -ERESTARTSYS;
  			break;
  		}
  
  		cond_resched();
  	}
  
  	return ret;
  }
581bb0509   Li Zefan   Btrfs: Cache free...
2592
2593
2594
2595
2596
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
2640
2641
  
  /*
   * Find the left-most item in the cache tree, and then return the
   * smallest inode number in the item.
   *
   * Note: the returned inode number may not be the smallest one in
   * the tree, if the left-most item is a bitmap.
   */
  u64 btrfs_find_ino_for_alloc(struct btrfs_root *fs_root)
  {
  	struct btrfs_free_space_ctl *ctl = fs_root->free_ino_ctl;
  	struct btrfs_free_space *entry = NULL;
  	u64 ino = 0;
  
  	spin_lock(&ctl->tree_lock);
  
  	if (RB_EMPTY_ROOT(&ctl->free_space_offset))
  		goto out;
  
  	entry = rb_entry(rb_first(&ctl->free_space_offset),
  			 struct btrfs_free_space, offset_index);
  
  	if (!entry->bitmap) {
  		ino = entry->offset;
  
  		unlink_free_space(ctl, entry);
  		entry->offset++;
  		entry->bytes--;
  		if (!entry->bytes)
  			kmem_cache_free(btrfs_free_space_cachep, entry);
  		else
  			link_free_space(ctl, entry);
  	} else {
  		u64 offset = 0;
  		u64 count = 1;
  		int ret;
  
  		ret = search_bitmap(ctl, entry, &offset, &count);
  		BUG_ON(ret);
  
  		ino = offset;
  		bitmap_clear_bits(ctl, entry, offset, 1);
  		if (entry->bytes == 0)
  			free_bitmap(ctl, entry);
  	}
  out:
  	spin_unlock(&ctl->tree_lock);
  
  	return ino;
  }
82d5902d9   Li Zefan   Btrfs: Support re...
2642
2643
2644
2645
2646
2647
2648
2649
2650
2651
2652
2653
2654
2655
2656
2657
2658
2659
  
  struct inode *lookup_free_ino_inode(struct btrfs_root *root,
  				    struct btrfs_path *path)
  {
  	struct inode *inode = NULL;
  
  	spin_lock(&root->cache_lock);
  	if (root->cache_inode)
  		inode = igrab(root->cache_inode);
  	spin_unlock(&root->cache_lock);
  	if (inode)
  		return inode;
  
  	inode = __lookup_free_space_inode(root, path, 0);
  	if (IS_ERR(inode))
  		return inode;
  
  	spin_lock(&root->cache_lock);
7841cb289   David Sterba   btrfs: add helper...
2660
  	if (!btrfs_fs_closing(root->fs_info))
82d5902d9   Li Zefan   Btrfs: Support re...
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
2681
  		root->cache_inode = igrab(inode);
  	spin_unlock(&root->cache_lock);
  
  	return inode;
  }
  
  int create_free_ino_inode(struct btrfs_root *root,
  			  struct btrfs_trans_handle *trans,
  			  struct btrfs_path *path)
  {
  	return __create_free_space_inode(root, trans, path,
  					 BTRFS_FREE_INO_OBJECTID, 0);
  }
  
  int load_free_ino_cache(struct btrfs_fs_info *fs_info, struct btrfs_root *root)
  {
  	struct btrfs_free_space_ctl *ctl = root->free_ino_ctl;
  	struct btrfs_path *path;
  	struct inode *inode;
  	int ret = 0;
  	u64 root_gen = btrfs_root_generation(&root->root_item);
4b9465cb9   Chris Mason   Btrfs: add mount ...
2682
2683
  	if (!btrfs_test_opt(root, INODE_MAP_CACHE))
  		return 0;
82d5902d9   Li Zefan   Btrfs: Support re...
2684
2685
2686
2687
  	/*
  	 * If we're unmounting then just return, since this does a search on the
  	 * normal root and not the commit root and we could deadlock.
  	 */
7841cb289   David Sterba   btrfs: add helper...
2688
  	if (btrfs_fs_closing(fs_info))
82d5902d9   Li Zefan   Btrfs: Support re...
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
  		return 0;
  
  	path = btrfs_alloc_path();
  	if (!path)
  		return 0;
  
  	inode = lookup_free_ino_inode(root, path);
  	if (IS_ERR(inode))
  		goto out;
  
  	if (root_gen != BTRFS_I(inode)->generation)
  		goto out_put;
  
  	ret = __load_free_space_cache(root, inode, ctl, path, 0);
  
  	if (ret < 0)
  		printk(KERN_ERR "btrfs: failed to load free ino cache for "
  		       "root %llu
  ", root->root_key.objectid);
  out_put:
  	iput(inode);
  out:
  	btrfs_free_path(path);
  	return ret;
  }
  
  int btrfs_write_out_ino_cache(struct btrfs_root *root,
  			      struct btrfs_trans_handle *trans,
  			      struct btrfs_path *path)
  {
  	struct btrfs_free_space_ctl *ctl = root->free_ino_ctl;
  	struct inode *inode;
  	int ret;
4b9465cb9   Chris Mason   Btrfs: add mount ...
2722
2723
  	if (!btrfs_test_opt(root, INODE_MAP_CACHE))
  		return 0;
82d5902d9   Li Zefan   Btrfs: Support re...
2724
2725
2726
2727
2728
  	inode = lookup_free_ino_inode(root, path);
  	if (IS_ERR(inode))
  		return 0;
  
  	ret = __btrfs_write_out_cache(root, inode, ctl, NULL, trans, path, 0);
c09544e07   Josef Bacik   Btrfs: handle eno...
2729
2730
2731
  	if (ret) {
  		btrfs_delalloc_release_metadata(inode, inode->i_size);
  #ifdef DEBUG
82d5902d9   Li Zefan   Btrfs: Support re...
2732
2733
2734
  		printk(KERN_ERR "btrfs: failed to write free ino cache "
  		       "for root %llu
  ", root->root_key.objectid);
c09544e07   Josef Bacik   Btrfs: handle eno...
2735
2736
  #endif
  	}
82d5902d9   Li Zefan   Btrfs: Support re...
2737
2738
2739
2740
  
  	iput(inode);
  	return ret;
  }