Btrfs: Handle data checksumming on bios that span multiple ordered extents
[linux-3.10.git] / 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.  If the list covers more than one
190  * ordered extent, it is split across multiples.
191  */
192 int btrfs_add_ordered_sum(struct inode *inode,
193                           struct btrfs_ordered_extent *entry,
194                           struct btrfs_ordered_sum *sum)
195 {
196         struct btrfs_ordered_inode_tree *tree;
197
198         tree = &BTRFS_I(inode)->ordered_tree;
199         mutex_lock(&tree->mutex);
200         list_add_tail(&sum->list, &entry->list);
201         mutex_unlock(&tree->mutex);
202         return 0;
203 }
204
205 /*
206  * this is used to account for finished IO across a given range
207  * of the file.  The IO should not span ordered extents.  If
208  * a given ordered_extent is completely done, 1 is returned, otherwise
209  * 0.
210  *
211  * test_and_set_bit on a flag in the struct btrfs_ordered_extent is used
212  * to make sure this function only returns 1 once for a given ordered extent.
213  */
214 int btrfs_dec_test_ordered_pending(struct inode *inode,
215                                    u64 file_offset, u64 io_size)
216 {
217         struct btrfs_ordered_inode_tree *tree;
218         struct rb_node *node;
219         struct btrfs_ordered_extent *entry;
220         struct extent_io_tree *io_tree = &BTRFS_I(inode)->io_tree;
221         int ret;
222
223         tree = &BTRFS_I(inode)->ordered_tree;
224         mutex_lock(&tree->mutex);
225         clear_extent_ordered(io_tree, file_offset, file_offset + io_size - 1,
226                              GFP_NOFS);
227         node = tree_search(tree, file_offset);
228         if (!node) {
229                 ret = 1;
230                 goto out;
231         }
232
233         entry = rb_entry(node, struct btrfs_ordered_extent, rb_node);
234         if (!offset_in_entry(entry, file_offset)) {
235                 ret = 1;
236                 goto out;
237         }
238
239         ret = test_range_bit(io_tree, entry->file_offset,
240                              entry->file_offset + entry->len - 1,
241                              EXTENT_ORDERED, 0);
242         if (ret == 0)
243                 ret = test_and_set_bit(BTRFS_ORDERED_IO_DONE, &entry->flags);
244 out:
245         mutex_unlock(&tree->mutex);
246         return ret == 0;
247 }
248
249 /*
250  * used to drop a reference on an ordered extent.  This will free
251  * the extent if the last reference is dropped
252  */
253 int btrfs_put_ordered_extent(struct btrfs_ordered_extent *entry)
254 {
255         struct list_head *cur;
256         struct btrfs_ordered_sum *sum;
257
258         if (atomic_dec_and_test(&entry->refs)) {
259                 while(!list_empty(&entry->list)) {
260                         cur = entry->list.next;
261                         sum = list_entry(cur, struct btrfs_ordered_sum, list);
262                         list_del(&sum->list);
263                         kfree(sum);
264                 }
265                 kfree(entry);
266         }
267         return 0;
268 }
269
270 /*
271  * remove an ordered extent from the tree.  No references are dropped
272  * but, anyone waiting on this extent is woken up.
273  */
274 int btrfs_remove_ordered_extent(struct inode *inode,
275                                 struct btrfs_ordered_extent *entry)
276 {
277         struct btrfs_ordered_inode_tree *tree;
278         struct rb_node *node;
279
280         tree = &BTRFS_I(inode)->ordered_tree;
281         mutex_lock(&tree->mutex);
282         node = &entry->rb_node;
283         rb_erase(node, &tree->tree);
284         tree->last = NULL;
285         set_bit(BTRFS_ORDERED_COMPLETE, &entry->flags);
286         mutex_unlock(&tree->mutex);
287         wake_up(&entry->wait);
288         return 0;
289 }
290
291 /*
292  * Used to start IO or wait for a given ordered extent to finish.
293  *
294  * If wait is one, this effectively waits on page writeback for all the pages
295  * in the extent, and it waits on the io completion code to insert
296  * metadata into the btree corresponding to the extent
297  */
298 void btrfs_start_ordered_extent(struct inode *inode,
299                                        struct btrfs_ordered_extent *entry,
300                                        int wait)
301 {
302         u64 start = entry->file_offset;
303         u64 end = start + entry->len - 1;
304
305         /*
306          * pages in the range can be dirty, clean or writeback.  We
307          * start IO on any dirty ones so the wait doesn't stall waiting
308          * for pdflush to find them
309          */
310 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,22)
311         do_sync_file_range(file, start, end, SYNC_FILE_RANGE_WRITE);
312 #else
313         do_sync_mapping_range(inode->i_mapping, start, end,
314                               SYNC_FILE_RANGE_WRITE);
315 #endif
316         if (wait)
317                 wait_event(entry->wait, test_bit(BTRFS_ORDERED_COMPLETE,
318                                                  &entry->flags));
319 }
320
321 /*
322  * Used to wait on ordered extents across a large range of bytes.
323  */
324 void btrfs_wait_ordered_range(struct inode *inode, u64 start, u64 len)
325 {
326         u64 end;
327         struct btrfs_ordered_extent *ordered;
328         int found;
329         int should_wait = 0;
330
331 again:
332         if (start + len < start)
333                 end = (u64)-1;
334         else
335                 end = start + len - 1;
336         found = 0;
337         while(1) {
338                 ordered = btrfs_lookup_first_ordered_extent(inode, end);
339                 if (!ordered) {
340                         break;
341                 }
342                 if (ordered->file_offset >= start + len) {
343                         btrfs_put_ordered_extent(ordered);
344                         break;
345                 }
346                 if (ordered->file_offset + ordered->len < start) {
347                         btrfs_put_ordered_extent(ordered);
348                         break;
349                 }
350                 btrfs_start_ordered_extent(inode, ordered, should_wait);
351                 found++;
352                 end = ordered->file_offset;
353                 btrfs_put_ordered_extent(ordered);
354                 if (end == 0)
355                         break;
356                 end--;
357         }
358         if (should_wait && found) {
359                 should_wait = 0;
360                 goto again;
361         }
362 }
363
364
365 /*
366  * find an ordered extent corresponding to file_offset.  return NULL if
367  * nothing is found, otherwise take a reference on the extent and return it
368  */
369 struct btrfs_ordered_extent *btrfs_lookup_ordered_extent(struct inode *inode,
370                                                          u64 file_offset)
371 {
372         struct btrfs_ordered_inode_tree *tree;
373         struct rb_node *node;
374         struct btrfs_ordered_extent *entry = NULL;
375
376         tree = &BTRFS_I(inode)->ordered_tree;
377         mutex_lock(&tree->mutex);
378         node = tree_search(tree, file_offset);
379         if (!node)
380                 goto out;
381
382         entry = rb_entry(node, struct btrfs_ordered_extent, rb_node);
383         if (!offset_in_entry(entry, file_offset))
384                 entry = NULL;
385         if (entry)
386                 atomic_inc(&entry->refs);
387 out:
388         mutex_unlock(&tree->mutex);
389         return entry;
390 }
391
392 /*
393  * lookup and return any extent before 'file_offset'.  NULL is returned
394  * if none is found
395  */
396 struct btrfs_ordered_extent *
397 btrfs_lookup_first_ordered_extent(struct inode * inode, u64 file_offset)
398 {
399         struct btrfs_ordered_inode_tree *tree;
400         struct rb_node *node;
401         struct btrfs_ordered_extent *entry = NULL;
402
403         tree = &BTRFS_I(inode)->ordered_tree;
404         mutex_lock(&tree->mutex);
405         node = tree_search(tree, file_offset);
406         if (!node)
407                 goto out;
408
409         entry = rb_entry(node, struct btrfs_ordered_extent, rb_node);
410         atomic_inc(&entry->refs);
411 out:
412         mutex_unlock(&tree->mutex);
413         return entry;
414 }
415
416 /*
417  * After an extent is done, call this to conditionally update the on disk
418  * i_size.  i_size is updated to cover any fully written part of the file.
419  */
420 int btrfs_ordered_update_i_size(struct inode *inode,
421                                 struct btrfs_ordered_extent *ordered)
422 {
423         struct btrfs_ordered_inode_tree *tree = &BTRFS_I(inode)->ordered_tree;
424         struct extent_io_tree *io_tree = &BTRFS_I(inode)->io_tree;
425         u64 disk_i_size;
426         u64 new_i_size;
427         u64 i_size_test;
428         struct rb_node *node;
429         struct btrfs_ordered_extent *test;
430
431         mutex_lock(&tree->mutex);
432         disk_i_size = BTRFS_I(inode)->disk_i_size;
433
434         /*
435          * if the disk i_size is already at the inode->i_size, or
436          * this ordered extent is inside the disk i_size, we're done
437          */
438         if (disk_i_size >= inode->i_size ||
439             ordered->file_offset + ordered->len <= disk_i_size) {
440                 goto out;
441         }
442
443         /*
444          * we can't update the disk_isize if there are delalloc bytes
445          * between disk_i_size and  this ordered extent
446          */
447         if (test_range_bit(io_tree, disk_i_size,
448                            ordered->file_offset + ordered->len - 1,
449                            EXTENT_DELALLOC, 0)) {
450                 goto out;
451         }
452         /*
453          * walk backward from this ordered extent to disk_i_size.
454          * if we find an ordered extent then we can't update disk i_size
455          * yet
456          */
457         node = &ordered->rb_node;
458         while(1) {
459                 node = rb_prev(node);
460                 if (!node)
461                         break;
462                 test = rb_entry(node, struct btrfs_ordered_extent, rb_node);
463                 if (test->file_offset + test->len <= disk_i_size)
464                         break;
465                 if (test->file_offset >= inode->i_size)
466                         break;
467                 if (test->file_offset >= disk_i_size)
468                         goto out;
469         }
470         new_i_size = min_t(u64, entry_end(ordered), i_size_read(inode));
471
472         /*
473          * at this point, we know we can safely update i_size to at least
474          * the offset from this ordered extent.  But, we need to
475          * walk forward and see if ios from higher up in the file have
476          * finished.
477          */
478         node = rb_next(&ordered->rb_node);
479         i_size_test = 0;
480         if (node) {
481                 /*
482                  * do we have an area where IO might have finished
483                  * between our ordered extent and the next one.
484                  */
485                 test = rb_entry(node, struct btrfs_ordered_extent, rb_node);
486                 if (test->file_offset > entry_end(ordered)) {
487                         i_size_test = test->file_offset - 1;
488                 }
489         } else {
490                 i_size_test = i_size_read(inode);
491         }
492
493         /*
494          * i_size_test is the end of a region after this ordered
495          * extent where there are no ordered extents.  As long as there
496          * are no delalloc bytes in this area, it is safe to update
497          * disk_i_size to the end of the region.
498          */
499         if (i_size_test > entry_end(ordered) &&
500             !test_range_bit(io_tree, entry_end(ordered), i_size_test,
501                            EXTENT_DELALLOC, 0)) {
502                 new_i_size = min_t(u64, i_size_test, i_size_read(inode));
503         }
504         BTRFS_I(inode)->disk_i_size = new_i_size;
505 out:
506         mutex_unlock(&tree->mutex);
507         return 0;
508 }
509
510 /*
511  * search the ordered extents for one corresponding to 'offset' and
512  * try to find a checksum.  This is used because we allow pages to
513  * be reclaimed before their checksum is actually put into the btree
514  */
515 int btrfs_find_ordered_sum(struct inode *inode, u64 offset, u32 *sum)
516 {
517         struct btrfs_ordered_sum *ordered_sum;
518         struct btrfs_sector_sum *sector_sums;
519         struct btrfs_ordered_extent *ordered;
520         struct btrfs_ordered_inode_tree *tree = &BTRFS_I(inode)->ordered_tree;
521         struct list_head *cur;
522         unsigned long num_sectors;
523         unsigned long i;
524         u32 sectorsize = BTRFS_I(inode)->root->sectorsize;
525         int ret = 1;
526
527         ordered = btrfs_lookup_ordered_extent(inode, offset);
528         if (!ordered)
529                 return 1;
530
531         mutex_lock(&tree->mutex);
532         list_for_each_prev(cur, &ordered->list) {
533                 ordered_sum = list_entry(cur, struct btrfs_ordered_sum, list);
534                 if (offset >= ordered_sum->file_offset) {
535                         num_sectors = ordered_sum->len / sectorsize;
536                         sector_sums = &ordered_sum->sums;
537                         for (i = 0; i < num_sectors; i++) {
538                                 if (sector_sums[i].offset == offset) {
539 printk("find ordered sum inode %lu offset %Lu\n", inode->i_ino, offset);
540                                         *sum = sector_sums[i].sum;
541                                         ret = 0;
542                                         goto out;
543                                 }
544                         }
545                 }
546         }
547 out:
548         mutex_unlock(&tree->mutex);
549         return ret;
550 }
551