Btrfs: Cleanup and comment ordered-data.c
[safe/jmp/linux-2.6] / fs / btrfs / ordered-data.c
1 /*
2  * Copyright (C) 2007 Oracle.  All rights reserved.
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public
6  * License v2 as published by the Free Software Foundation.
7  *
8  * This program is distributed in the hope that it will be useful,
9  * but WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
11  * General Public License for more details.
12  *
13  * You should have received a copy of the GNU General Public
14  * License along with this program; if not, write to the
15  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
16  * Boston, MA 021110-1307, USA.
17  */
18
19 #include <linux/gfp.h>
20 #include <linux/slab.h>
21 #include <linux/blkdev.h>
22 #include "ctree.h"
23 #include "transaction.h"
24 #include "btrfs_inode.h"
25 #include "extent_io.h"
26
27
28 static u64 entry_end(struct btrfs_ordered_extent *entry)
29 {
30         if (entry->file_offset + entry->len < entry->file_offset)
31                 return (u64)-1;
32         return entry->file_offset + entry->len;
33 }
34
35 static struct rb_node *tree_insert(struct rb_root *root, u64 file_offset,
36                                    struct rb_node *node)
37 {
38         struct rb_node ** p = &root->rb_node;
39         struct rb_node * parent = NULL;
40         struct btrfs_ordered_extent *entry;
41
42         while(*p) {
43                 parent = *p;
44                 entry = rb_entry(parent, struct btrfs_ordered_extent, rb_node);
45
46                 if (file_offset < entry->file_offset)
47                         p = &(*p)->rb_left;
48                 else if (file_offset >= entry_end(entry))
49                         p = &(*p)->rb_right;
50                 else
51                         return parent;
52         }
53
54         rb_link_node(node, parent, p);
55         rb_insert_color(node, root);
56         return NULL;
57 }
58
59 static struct rb_node *__tree_search(struct rb_root *root, u64 file_offset,
60                                      struct rb_node **prev_ret)
61 {
62         struct rb_node * n = root->rb_node;
63         struct rb_node *prev = NULL;
64         struct rb_node *test;
65         struct btrfs_ordered_extent *entry;
66         struct btrfs_ordered_extent *prev_entry = NULL;
67
68         while(n) {
69                 entry = rb_entry(n, struct btrfs_ordered_extent, rb_node);
70                 prev = n;
71                 prev_entry = entry;
72
73                 if (file_offset < entry->file_offset)
74                         n = n->rb_left;
75                 else if (file_offset >= entry_end(entry))
76                         n = n->rb_right;
77                 else
78                         return n;
79         }
80         if (!prev_ret)
81                 return NULL;
82
83         while(prev && file_offset >= entry_end(prev_entry)) {
84                 test = rb_next(prev);
85                 if (!test)
86                         break;
87                 prev_entry = rb_entry(test, struct btrfs_ordered_extent,
88                                       rb_node);
89                 if (file_offset < entry_end(prev_entry))
90                         break;
91
92                 prev = test;
93         }
94         if (prev)
95                 prev_entry = rb_entry(prev, struct btrfs_ordered_extent,
96                                       rb_node);
97         while(prev && file_offset < entry_end(prev_entry)) {
98                 test = rb_prev(prev);
99                 if (!test)
100                         break;
101                 prev_entry = rb_entry(test, struct btrfs_ordered_extent,
102                                       rb_node);
103                 prev = test;
104         }
105         *prev_ret = prev;
106         return NULL;
107 }
108
109 static int offset_in_entry(struct btrfs_ordered_extent *entry, u64 file_offset)
110 {
111         if (file_offset < entry->file_offset ||
112             entry->file_offset + entry->len <= file_offset)
113                 return 0;
114         return 1;
115 }
116
117 static inline struct rb_node *tree_search(struct btrfs_ordered_inode_tree *tree,
118                                           u64 file_offset)
119 {
120         struct rb_root *root = &tree->tree;
121         struct rb_node *prev;
122         struct rb_node *ret;
123         struct btrfs_ordered_extent *entry;
124
125         if (tree->last) {
126                 entry = rb_entry(tree->last, struct btrfs_ordered_extent,
127                                  rb_node);
128                 if (offset_in_entry(entry, file_offset))
129                         return tree->last;
130         }
131         ret = __tree_search(root, file_offset, &prev);
132         if (!ret)
133                 ret = prev;
134         if (ret)
135                 tree->last = ret;
136         return ret;
137 }
138
139 /* allocate and add a new ordered_extent into the per-inode tree.
140  * file_offset is the logical offset in the file
141  *
142  * start is the disk block number of an extent already reserved in the
143  * extent allocation tree
144  *
145  * len is the length of the extent
146  *
147  * This also sets the EXTENT_ORDERED bit on the range in the inode.
148  *
149  * The tree is given a single reference on the ordered extent that was
150  * inserted.
151  */
152 int btrfs_add_ordered_extent(struct inode *inode, u64 file_offset,
153                              u64 start, u64 len)
154 {
155         struct btrfs_ordered_inode_tree *tree;
156         struct rb_node *node;
157         struct btrfs_ordered_extent *entry;
158
159         tree = &BTRFS_I(inode)->ordered_tree;
160         entry = kzalloc(sizeof(*entry), GFP_NOFS);
161         if (!entry)
162                 return -ENOMEM;
163
164         mutex_lock(&tree->mutex);
165         entry->file_offset = file_offset;
166         entry->start = start;
167         entry->len = len;
168         /* one ref for the tree */
169         atomic_set(&entry->refs, 1);
170         init_waitqueue_head(&entry->wait);
171         INIT_LIST_HEAD(&entry->list);
172
173         node = tree_insert(&tree->tree, file_offset,
174                            &entry->rb_node);
175         if (node) {
176                 entry = rb_entry(node, struct btrfs_ordered_extent, rb_node);
177                 atomic_inc(&entry->refs);
178         }
179         set_extent_ordered(&BTRFS_I(inode)->io_tree, file_offset,
180                            entry_end(entry) - 1, GFP_NOFS);
181
182         mutex_unlock(&tree->mutex);
183         BUG_ON(node);
184         return 0;
185 }
186
187 /*
188  * Add a struct btrfs_ordered_sum into the list of checksums to be inserted
189  * when an ordered extent is finished.
190  */
191 int btrfs_add_ordered_sum(struct inode *inode, struct btrfs_ordered_sum *sum)
192 {
193         struct btrfs_ordered_inode_tree *tree;
194         struct rb_node *node;
195         struct btrfs_ordered_extent *entry;
196
197         tree = &BTRFS_I(inode)->ordered_tree;
198         mutex_lock(&tree->mutex);
199         node = tree_search(tree, sum->file_offset);
200         BUG_ON(!node);
201
202         entry = rb_entry(node, struct btrfs_ordered_extent, rb_node);
203         BUG_ON(!offset_in_entry(entry, sum->file_offset));
204
205         list_add_tail(&sum->list, &entry->list);
206         mutex_unlock(&tree->mutex);
207         return 0;
208 }
209
210 /*
211  * this is used to account for finished IO across a given range
212  * of the file.  The IO should not span ordered extents.  If
213  * a given ordered_extent is completely done, 1 is returned, otherwise
214  * 0.
215  *
216  * test_and_set_bit on a flag in the struct btrfs_ordered_extent is used
217  * to make sure this function only returns 1 once for a given ordered extent.
218  */
219 int btrfs_dec_test_ordered_pending(struct inode *inode,
220                                    u64 file_offset, u64 io_size)
221 {
222         struct btrfs_ordered_inode_tree *tree;
223         struct rb_node *node;
224         struct btrfs_ordered_extent *entry;
225         struct extent_io_tree *io_tree = &BTRFS_I(inode)->io_tree;
226         int ret;
227
228         tree = &BTRFS_I(inode)->ordered_tree;
229         mutex_lock(&tree->mutex);
230         clear_extent_ordered(io_tree, file_offset, file_offset + io_size - 1,
231                              GFP_NOFS);
232         node = tree_search(tree, file_offset);
233         if (!node) {
234                 ret = 1;
235                 goto out;
236         }
237
238         entry = rb_entry(node, struct btrfs_ordered_extent, rb_node);
239         if (!offset_in_entry(entry, file_offset)) {
240                 ret = 1;
241                 goto out;
242         }
243
244         ret = test_range_bit(io_tree, entry->file_offset,
245                              entry->file_offset + entry->len - 1,
246                              EXTENT_ORDERED, 0);
247         if (ret == 0)
248                 ret = test_and_set_bit(BTRFS_ORDERED_IO_DONE, &entry->flags);
249 out:
250         mutex_unlock(&tree->mutex);
251         return ret == 0;
252 }
253
254 /*
255  * used to drop a reference on an ordered extent.  This will free
256  * the extent if the last reference is dropped
257  */
258 int btrfs_put_ordered_extent(struct btrfs_ordered_extent *entry)
259 {
260         struct list_head *cur;
261         struct btrfs_ordered_sum *sum;
262
263         if (atomic_dec_and_test(&entry->refs)) {
264                 while(!list_empty(&entry->list)) {
265                         cur = entry->list.next;
266                         sum = list_entry(cur, struct btrfs_ordered_sum, list);
267                         list_del(&sum->list);
268                         kfree(sum);
269                 }
270                 kfree(entry);
271         }
272         return 0;
273 }
274
275 /*
276  * remove an ordered extent from the tree.  No references are dropped
277  * but, anyone waiting on this extent is woken up.
278  */
279 int btrfs_remove_ordered_extent(struct inode *inode,
280                                 struct btrfs_ordered_extent *entry)
281 {
282         struct btrfs_ordered_inode_tree *tree;
283         struct rb_node *node;
284
285         tree = &BTRFS_I(inode)->ordered_tree;
286         mutex_lock(&tree->mutex);
287         node = &entry->rb_node;
288         rb_erase(node, &tree->tree);
289         tree->last = NULL;
290         set_bit(BTRFS_ORDERED_COMPLETE, &entry->flags);
291         mutex_unlock(&tree->mutex);
292         wake_up(&entry->wait);
293         return 0;
294 }
295
296 /*
297  * Used to start IO or wait for a given ordered extent to finish.
298  *
299  * If wait is one, this effectively waits on page writeback for all the pages
300  * in the extent, and it waits on the io completion code to insert
301  * metadata into the btree corresponding to the extent
302  */
303 void btrfs_start_ordered_extent(struct inode *inode,
304                                        struct btrfs_ordered_extent *entry,
305                                        int wait)
306 {
307         u64 start = entry->file_offset;
308         u64 end = start + entry->len - 1;
309
310         /*
311          * pages in the range can be dirty, clean or writeback.  We
312          * start IO on any dirty ones so the wait doesn't stall waiting
313          * for pdflush to find them
314          */
315 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,22)
316         do_sync_file_range(file, start, end, SYNC_FILE_RANGE_WRITE);
317 #else
318         do_sync_mapping_range(inode->i_mapping, start, end,
319                               SYNC_FILE_RANGE_WRITE);
320 #endif
321         if (wait)
322                 wait_event(entry->wait, test_bit(BTRFS_ORDERED_COMPLETE,
323                                                  &entry->flags));
324 }
325
326 /*
327  * Used to wait on ordered extents across a large range of bytes.
328  */
329 void btrfs_wait_ordered_range(struct inode *inode, u64 start, u64 len)
330 {
331         u64 end;
332         struct btrfs_ordered_extent *ordered;
333         int found;
334         int should_wait = 0;
335
336 again:
337         if (start + len < start)
338                 end = (u64)-1;
339         else
340                 end = start + len - 1;
341         found = 0;
342         while(1) {
343                 ordered = btrfs_lookup_first_ordered_extent(inode, end);
344                 if (!ordered) {
345                         break;
346                 }
347                 if (ordered->file_offset >= start + len) {
348                         btrfs_put_ordered_extent(ordered);
349                         break;
350                 }
351                 if (ordered->file_offset + ordered->len < start) {
352                         btrfs_put_ordered_extent(ordered);
353                         break;
354                 }
355                 btrfs_start_ordered_extent(inode, ordered, should_wait);
356                 found++;
357                 end = ordered->file_offset;
358                 btrfs_put_ordered_extent(ordered);
359                 if (end == 0)
360                         break;
361                 end--;
362         }
363         if (should_wait && found) {
364                 should_wait = 0;
365                 goto again;
366         }
367 }
368
369
370 /*
371  * find an ordered extent corresponding to file_offset.  return NULL if
372  * nothing is found, otherwise take a reference on the extent and return it
373  */
374 struct btrfs_ordered_extent *btrfs_lookup_ordered_extent(struct inode *inode,
375                                                          u64 file_offset)
376 {
377         struct btrfs_ordered_inode_tree *tree;
378         struct rb_node *node;
379         struct btrfs_ordered_extent *entry = NULL;
380
381         tree = &BTRFS_I(inode)->ordered_tree;
382         mutex_lock(&tree->mutex);
383         node = tree_search(tree, file_offset);
384         if (!node)
385                 goto out;
386
387         entry = rb_entry(node, struct btrfs_ordered_extent, rb_node);
388         if (!offset_in_entry(entry, file_offset))
389                 entry = NULL;
390         if (entry)
391                 atomic_inc(&entry->refs);
392 out:
393         mutex_unlock(&tree->mutex);
394         return entry;
395 }
396
397 /*
398  * lookup and return any extent before 'file_offset'.  NULL is returned
399  * if none is found
400  */
401 struct btrfs_ordered_extent *
402 btrfs_lookup_first_ordered_extent(struct inode * inode, u64 file_offset)
403 {
404         struct btrfs_ordered_inode_tree *tree;
405         struct rb_node *node;
406         struct btrfs_ordered_extent *entry = NULL;
407
408         tree = &BTRFS_I(inode)->ordered_tree;
409         mutex_lock(&tree->mutex);
410         node = tree_search(tree, file_offset);
411         if (!node)
412                 goto out;
413
414         entry = rb_entry(node, struct btrfs_ordered_extent, rb_node);
415         atomic_inc(&entry->refs);
416 out:
417         mutex_unlock(&tree->mutex);
418         return entry;
419 }
420
421 /*
422  * After an extent is done, call this to conditionally update the on disk
423  * i_size.  i_size is updated to cover any fully written part of the file.
424  */
425 int btrfs_ordered_update_i_size(struct inode *inode,
426                                 struct btrfs_ordered_extent *ordered)
427 {
428         struct btrfs_ordered_inode_tree *tree = &BTRFS_I(inode)->ordered_tree;
429         struct extent_io_tree *io_tree = &BTRFS_I(inode)->io_tree;
430         u64 disk_i_size;
431         u64 new_i_size;
432         u64 i_size_test;
433         struct rb_node *node;
434         struct btrfs_ordered_extent *test;
435
436         mutex_lock(&tree->mutex);
437         disk_i_size = BTRFS_I(inode)->disk_i_size;
438
439         /*
440          * if the disk i_size is already at the inode->i_size, or
441          * this ordered extent is inside the disk i_size, we're done
442          */
443         if (disk_i_size >= inode->i_size ||
444             ordered->file_offset + ordered->len <= disk_i_size) {
445                 goto out;
446         }
447
448         /*
449          * we can't update the disk_isize if there are delalloc bytes
450          * between disk_i_size and  this ordered extent
451          */
452         if (test_range_bit(io_tree, disk_i_size,
453                            ordered->file_offset + ordered->len - 1,
454                            EXTENT_DELALLOC, 0)) {
455                 goto out;
456         }
457         /*
458          * walk backward from this ordered extent to disk_i_size.
459          * if we find an ordered extent then we can't update disk i_size
460          * yet
461          */
462         node = &ordered->rb_node;
463         while(1) {
464                 node = rb_prev(node);
465                 if (!node)
466                         break;
467                 test = rb_entry(node, struct btrfs_ordered_extent, rb_node);
468                 if (test->file_offset + test->len <= disk_i_size)
469                         break;
470                 if (test->file_offset >= inode->i_size)
471                         break;
472                 if (test->file_offset >= disk_i_size)
473                         goto out;
474         }
475         new_i_size = min_t(u64, entry_end(ordered), i_size_read(inode));
476
477         /*
478          * at this point, we know we can safely update i_size to at least
479          * the offset from this ordered extent.  But, we need to
480          * walk forward and see if ios from higher up in the file have
481          * finished.
482          */
483         node = rb_next(&ordered->rb_node);
484         i_size_test = 0;
485         if (node) {
486                 /*
487                  * do we have an area where IO might have finished
488                  * between our ordered extent and the next one.
489                  */
490                 test = rb_entry(node, struct btrfs_ordered_extent, rb_node);
491                 if (test->file_offset > entry_end(ordered)) {
492                         i_size_test = test->file_offset - 1;
493                 }
494         } else {
495                 i_size_test = i_size_read(inode);
496         }
497
498         /*
499          * i_size_test is the end of a region after this ordered
500          * extent where there are no ordered extents.  As long as there
501          * are no delalloc bytes in this area, it is safe to update
502          * disk_i_size to the end of the region.
503          */
504         if (i_size_test > entry_end(ordered) &&
505             !test_range_bit(io_tree, entry_end(ordered), i_size_test,
506                            EXTENT_DELALLOC, 0)) {
507                 new_i_size = min_t(u64, i_size_test, i_size_read(inode));
508         }
509         BTRFS_I(inode)->disk_i_size = new_i_size;
510 out:
511         mutex_unlock(&tree->mutex);
512         return 0;
513 }
514
515 /*
516  * search the ordered extents for one corresponding to 'offset' and
517  * try to find a checksum.  This is used because we allow pages to
518  * be reclaimed before their checksum is actually put into the btree
519  */
520 int btrfs_find_ordered_sum(struct inode *inode, u64 offset, u32 *sum)
521 {
522         struct btrfs_ordered_sum *ordered_sum;
523         struct btrfs_sector_sum *sector_sums;
524         struct btrfs_ordered_extent *ordered;
525         struct btrfs_ordered_inode_tree *tree = &BTRFS_I(inode)->ordered_tree;
526         struct list_head *cur;
527         int ret = 1;
528         int index;
529
530         ordered = btrfs_lookup_ordered_extent(inode, offset);
531         if (!ordered)
532                 return 1;
533
534         mutex_lock(&tree->mutex);
535         list_for_each_prev(cur, &ordered->list) {
536                 ordered_sum = list_entry(cur, struct btrfs_ordered_sum, list);
537                 if (offset >= ordered_sum->file_offset &&
538                     offset < ordered_sum->file_offset + ordered_sum->len) {
539                         index = (offset - ordered_sum->file_offset) /
540                                 BTRFS_I(inode)->root->sectorsize;;
541                         sector_sums = &ordered_sum->sums;
542                         *sum = sector_sums[index].sum;
543                         ret = 0;
544                         goto out;
545                 }
546         }
547 out:
548         mutex_unlock(&tree->mutex);
549         return ret;
550 }
551