8ee5d5b24f3052c6ec4ae3d81255805bce3cae8a
[platform/upstream/btrfs-progs.git] / extent_io.c
1
2 /*
3  * Copyright (C) 2007 Oracle.  All rights reserved.
4  *
5  * This program is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU General Public
7  * License v2 as published by the Free Software Foundation.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public
15  * License along with this program; if not, write to the
16  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17  * Boston, MA 021110-1307, USA.
18  */
19 #include <stdio.h>
20 #include <stdlib.h>
21 #include <sys/types.h>
22 #include <sys/stat.h>
23 #include <fcntl.h>
24 #include <unistd.h>
25 #include "kerncompat.h"
26 #include "extent_io.h"
27 #include "list.h"
28 #include "ctree.h"
29 #include "volumes.h"
30 #include "internal.h"
31
32 void extent_io_tree_init(struct extent_io_tree *tree)
33 {
34         cache_tree_init(&tree->state);
35         cache_tree_init(&tree->cache);
36         INIT_LIST_HEAD(&tree->lru);
37         tree->cache_size = 0;
38 }
39
40 static struct extent_state *alloc_extent_state(void)
41 {
42         struct extent_state *state;
43
44         state = malloc(sizeof(*state));
45         if (!state)
46                 return NULL;
47         state->cache_node.objectid = 0;
48         state->refs = 1;
49         state->state = 0;
50         state->xprivate = 0;
51         return state;
52 }
53
54 static void btrfs_free_extent_state(struct extent_state *state)
55 {
56         state->refs--;
57         BUG_ON(state->refs < 0);
58         if (state->refs == 0)
59                 free(state);
60 }
61
62 static void free_extent_state_func(struct cache_extent *cache)
63 {
64         struct extent_state *es;
65
66         es = container_of(cache, struct extent_state, cache_node);
67         btrfs_free_extent_state(es);
68 }
69
70 void extent_io_tree_cleanup(struct extent_io_tree *tree)
71 {
72         struct extent_buffer *eb;
73
74         while(!list_empty(&tree->lru)) {
75                 eb = list_entry(tree->lru.next, struct extent_buffer, lru);
76                 fprintf(stderr, "extent buffer leak: "
77                         "start %llu len %u\n",
78                         (unsigned long long)eb->start, eb->len);
79                 free_extent_buffer(eb);
80         }
81
82         cache_tree_free_extents(&tree->state, free_extent_state_func);
83 }
84
85 static inline void update_extent_state(struct extent_state *state)
86 {
87         state->cache_node.start = state->start;
88         state->cache_node.size = state->end + 1 - state->start;
89 }
90
91 /*
92  * Utility function to look for merge candidates inside a given range.
93  * Any extents with matching state are merged together into a single
94  * extent in the tree. Extents with EXTENT_IO in their state field are
95  * not merged
96  */
97 static int merge_state(struct extent_io_tree *tree,
98                        struct extent_state *state)
99 {
100         struct extent_state *other;
101         struct cache_extent *other_node;
102
103         if (state->state & EXTENT_IOBITS)
104                 return 0;
105
106         other_node = prev_cache_extent(&state->cache_node);
107         if (other_node) {
108                 other = container_of(other_node, struct extent_state,
109                                      cache_node);
110                 if (other->end == state->start - 1 &&
111                     other->state == state->state) {
112                         state->start = other->start;
113                         update_extent_state(state);
114                         remove_cache_extent(&tree->state, &other->cache_node);
115                         btrfs_free_extent_state(other);
116                 }
117         }
118         other_node = next_cache_extent(&state->cache_node);
119         if (other_node) {
120                 other = container_of(other_node, struct extent_state,
121                                      cache_node);
122                 if (other->start == state->end + 1 &&
123                     other->state == state->state) {
124                         other->start = state->start;
125                         update_extent_state(other);
126                         remove_cache_extent(&tree->state, &state->cache_node);
127                         btrfs_free_extent_state(state);
128                 }
129         }
130         return 0;
131 }
132
133 /*
134  * insert an extent_state struct into the tree.  'bits' are set on the
135  * struct before it is inserted.
136  */
137 static int insert_state(struct extent_io_tree *tree,
138                         struct extent_state *state, u64 start, u64 end,
139                         int bits)
140 {
141         int ret;
142
143         BUG_ON(end < start);
144         state->state |= bits;
145         state->start = start;
146         state->end = end;
147         update_extent_state(state);
148         ret = insert_cache_extent(&tree->state, &state->cache_node);
149         BUG_ON(ret);
150         merge_state(tree, state);
151         return 0;
152 }
153
154 /*
155  * split a given extent state struct in two, inserting the preallocated
156  * struct 'prealloc' as the newly created second half.  'split' indicates an
157  * offset inside 'orig' where it should be split.
158  */
159 static int split_state(struct extent_io_tree *tree, struct extent_state *orig,
160                        struct extent_state *prealloc, u64 split)
161 {
162         int ret;
163         prealloc->start = orig->start;
164         prealloc->end = split - 1;
165         prealloc->state = orig->state;
166         update_extent_state(prealloc);
167         orig->start = split;
168         update_extent_state(orig);
169         ret = insert_cache_extent(&tree->state, &prealloc->cache_node);
170         BUG_ON(ret);
171         return 0;
172 }
173
174 /*
175  * clear some bits on a range in the tree.
176  */
177 static int clear_state_bit(struct extent_io_tree *tree,
178                             struct extent_state *state, int bits)
179 {
180         int ret = state->state & bits;
181
182         state->state &= ~bits;
183         if (state->state == 0) {
184                 remove_cache_extent(&tree->state, &state->cache_node);
185                 btrfs_free_extent_state(state);
186         } else {
187                 merge_state(tree, state);
188         }
189         return ret;
190 }
191
192 /*
193  * clear some bits on a range in the tree.
194  */
195 int clear_extent_bits(struct extent_io_tree *tree, u64 start, u64 end, int bits)
196 {
197         struct extent_state *state;
198         struct extent_state *prealloc = NULL;
199         struct cache_extent *node;
200         u64 last_end;
201         int err;
202         int set = 0;
203
204 again:
205         if (!prealloc) {
206                 prealloc = alloc_extent_state();
207                 if (!prealloc)
208                         return -ENOMEM;
209         }
210
211         /*
212          * this search will find the extents that end after
213          * our range starts
214          */
215         node = search_cache_extent(&tree->state, start);
216         if (!node)
217                 goto out;
218         state = container_of(node, struct extent_state, cache_node);
219         if (state->start > end)
220                 goto out;
221         last_end = state->end;
222
223         /*
224          *     | ---- desired range ---- |
225          *  | state | or
226          *  | ------------- state -------------- |
227          *
228          * We need to split the extent we found, and may flip
229          * bits on second half.
230          *
231          * If the extent we found extends past our range, we
232          * just split and search again.  It'll get split again
233          * the next time though.
234          *
235          * If the extent we found is inside our range, we clear
236          * the desired bit on it.
237          */
238         if (state->start < start) {
239                 err = split_state(tree, state, prealloc, start);
240                 BUG_ON(err == -EEXIST);
241                 prealloc = NULL;
242                 if (err)
243                         goto out;
244                 if (state->end <= end) {
245                         set |= clear_state_bit(tree, state, bits);
246                         if (last_end == (u64)-1)
247                                 goto out;
248                         start = last_end + 1;
249                 } else {
250                         start = state->start;
251                 }
252                 goto search_again;
253         }
254         /*
255          * | ---- desired range ---- |
256          *                        | state |
257          * We need to split the extent, and clear the bit
258          * on the first half
259          */
260         if (state->start <= end && state->end > end) {
261                 err = split_state(tree, state, prealloc, end + 1);
262                 BUG_ON(err == -EEXIST);
263
264                 set |= clear_state_bit(tree, prealloc, bits);
265                 prealloc = NULL;
266                 goto out;
267         }
268
269         start = state->end + 1;
270         set |= clear_state_bit(tree, state, bits);
271         if (last_end == (u64)-1)
272                 goto out;
273         start = last_end + 1;
274         goto search_again;
275 out:
276         if (prealloc)
277                 btrfs_free_extent_state(prealloc);
278         return set;
279
280 search_again:
281         if (start > end)
282                 goto out;
283         goto again;
284 }
285
286 /*
287  * set some bits on a range in the tree.
288  */
289 int set_extent_bits(struct extent_io_tree *tree, u64 start, u64 end, int bits)
290 {
291         struct extent_state *state;
292         struct extent_state *prealloc = NULL;
293         struct cache_extent *node;
294         int err = 0;
295         u64 last_start;
296         u64 last_end;
297 again:
298         if (!prealloc) {
299                 prealloc = alloc_extent_state();
300                 if (!prealloc)
301                         return -ENOMEM;
302         }
303
304         /*
305          * this search will find the extents that end after
306          * our range starts
307          */
308         node = search_cache_extent(&tree->state, start);
309         if (!node) {
310                 err = insert_state(tree, prealloc, start, end, bits);
311                 BUG_ON(err == -EEXIST);
312                 prealloc = NULL;
313                 goto out;
314         }
315
316         state = container_of(node, struct extent_state, cache_node);
317         last_start = state->start;
318         last_end = state->end;
319
320         /*
321          * | ---- desired range ---- |
322          * | state |
323          *
324          * Just lock what we found and keep going
325          */
326         if (state->start == start && state->end <= end) {
327                 state->state |= bits;
328                 merge_state(tree, state);
329                 if (last_end == (u64)-1)
330                         goto out;
331                 start = last_end + 1;
332                 goto search_again;
333         }
334         /*
335          *     | ---- desired range ---- |
336          * | state |
337          *   or
338          * | ------------- state -------------- |
339          *
340          * We need to split the extent we found, and may flip bits on
341          * second half.
342          *
343          * If the extent we found extends past our
344          * range, we just split and search again.  It'll get split
345          * again the next time though.
346          *
347          * If the extent we found is inside our range, we set the
348          * desired bit on it.
349          */
350         if (state->start < start) {
351                 err = split_state(tree, state, prealloc, start);
352                 BUG_ON(err == -EEXIST);
353                 prealloc = NULL;
354                 if (err)
355                         goto out;
356                 if (state->end <= end) {
357                         state->state |= bits;
358                         start = state->end + 1;
359                         merge_state(tree, state);
360                         if (last_end == (u64)-1)
361                                 goto out;
362                         start = last_end + 1;
363                 } else {
364                         start = state->start;
365                 }
366                 goto search_again;
367         }
368         /*
369          * | ---- desired range ---- |
370          *     | state | or               | state |
371          *
372          * There's a hole, we need to insert something in it and
373          * ignore the extent we found.
374          */
375         if (state->start > start) {
376                 u64 this_end;
377                 if (end < last_start)
378                         this_end = end;
379                 else
380                         this_end = last_start -1;
381                 err = insert_state(tree, prealloc, start, this_end,
382                                 bits);
383                 BUG_ON(err == -EEXIST);
384                 prealloc = NULL;
385                 if (err)
386                         goto out;
387                 start = this_end + 1;
388                 goto search_again;
389         }
390         /*
391          * | ---- desired range ---- |
392          * | ---------- state ---------- |
393          * We need to split the extent, and set the bit
394          * on the first half
395          */
396         err = split_state(tree, state, prealloc, end + 1);
397         BUG_ON(err == -EEXIST);
398
399         state->state |= bits;
400         merge_state(tree, prealloc);
401         prealloc = NULL;
402 out:
403         if (prealloc)
404                 btrfs_free_extent_state(prealloc);
405         return err;
406 search_again:
407         if (start > end)
408                 goto out;
409         goto again;
410 }
411
412 int set_extent_dirty(struct extent_io_tree *tree, u64 start, u64 end,
413                      gfp_t mask)
414 {
415         return set_extent_bits(tree, start, end, EXTENT_DIRTY);
416 }
417
418 int clear_extent_dirty(struct extent_io_tree *tree, u64 start, u64 end,
419                        gfp_t mask)
420 {
421         return clear_extent_bits(tree, start, end, EXTENT_DIRTY);
422 }
423
424 int find_first_extent_bit(struct extent_io_tree *tree, u64 start,
425                           u64 *start_ret, u64 *end_ret, int bits)
426 {
427         struct cache_extent *node;
428         struct extent_state *state;
429         int ret = 1;
430
431         /*
432          * this search will find all the extents that end after
433          * our range starts.
434          */
435         node = search_cache_extent(&tree->state, start);
436         if (!node)
437                 goto out;
438
439         while(1) {
440                 state = container_of(node, struct extent_state, cache_node);
441                 if (state->end >= start && (state->state & bits)) {
442                         *start_ret = state->start;
443                         *end_ret = state->end;
444                         ret = 0;
445                         break;
446                 }
447                 node = next_cache_extent(node);
448                 if (!node)
449                         break;
450         }
451 out:
452         return ret;
453 }
454
455 int test_range_bit(struct extent_io_tree *tree, u64 start, u64 end,
456                    int bits, int filled)
457 {
458         struct extent_state *state = NULL;
459         struct cache_extent *node;
460         int bitset = 0;
461
462         node = search_cache_extent(&tree->state, start);
463         while (node && start <= end) {
464                 state = container_of(node, struct extent_state, cache_node);
465
466                 if (filled && state->start > start) {
467                         bitset = 0;
468                         break;
469                 }
470                 if (state->start > end)
471                         break;
472                 if (state->state & bits) {
473                         bitset = 1;
474                         if (!filled)
475                                 break;
476                 } else if (filled) {
477                         bitset = 0;
478                         break;
479                 }
480                 start = state->end + 1;
481                 if (start > end)
482                         break;
483                 node = next_cache_extent(node);
484                 if (!node) {
485                         if (filled)
486                                 bitset = 0;
487                         break;
488                 }
489         }
490         return bitset;
491 }
492
493 int set_state_private(struct extent_io_tree *tree, u64 start, u64 private)
494 {
495         struct cache_extent *node;
496         struct extent_state *state;
497         int ret = 0;
498
499         node = search_cache_extent(&tree->state, start);
500         if (!node) {
501                 ret = -ENOENT;
502                 goto out;
503         }
504         state = container_of(node, struct extent_state, cache_node);
505         if (state->start != start) {
506                 ret = -ENOENT;
507                 goto out;
508         }
509         state->xprivate = private;
510 out:
511         return ret;
512 }
513
514 int get_state_private(struct extent_io_tree *tree, u64 start, u64 *private)
515 {
516         struct cache_extent *node;
517         struct extent_state *state;
518         int ret = 0;
519
520         node = search_cache_extent(&tree->state, start);
521         if (!node) {
522                 ret = -ENOENT;
523                 goto out;
524         }
525         state = container_of(node, struct extent_state, cache_node);
526         if (state->start != start) {
527                 ret = -ENOENT;
528                 goto out;
529         }
530         *private = state->xprivate;
531 out:
532         return ret;
533 }
534
535 static struct extent_buffer *__alloc_extent_buffer(struct extent_io_tree *tree,
536                                                    u64 bytenr, u32 blocksize)
537 {
538         struct extent_buffer *eb;
539
540         eb = calloc(1, sizeof(struct extent_buffer) + blocksize);
541         if (!eb)
542                 return NULL;
543
544         eb->start = bytenr;
545         eb->len = blocksize;
546         eb->refs = 1;
547         eb->flags = 0;
548         eb->tree = tree;
549         eb->fd = -1;
550         eb->dev_bytenr = (u64)-1;
551         eb->cache_node.start = bytenr;
552         eb->cache_node.size = blocksize;
553         INIT_LIST_HEAD(&eb->recow);
554
555         return eb;
556 }
557
558 struct extent_buffer *btrfs_clone_extent_buffer(struct extent_buffer *src)
559 {
560         struct extent_buffer *new;
561
562         new = __alloc_extent_buffer(NULL, src->start, src->len);
563         if (!new)
564                 return NULL;
565
566         copy_extent_buffer(new, src, 0, 0, src->len);
567         new->flags |= EXTENT_BUFFER_DUMMY;
568
569         return new;
570 }
571
572 void free_extent_buffer(struct extent_buffer *eb)
573 {
574         if (!eb || IS_ERR(eb))
575                 return;
576
577         eb->refs--;
578         BUG_ON(eb->refs < 0);
579         if (eb->refs == 0) {
580                 struct extent_io_tree *tree = eb->tree;
581                 BUG_ON(eb->flags & EXTENT_DIRTY);
582                 list_del_init(&eb->lru);
583                 list_del_init(&eb->recow);
584                 if (!(eb->flags & EXTENT_BUFFER_DUMMY)) {
585                         BUG_ON(tree->cache_size < eb->len);
586                         remove_cache_extent(&tree->cache, &eb->cache_node);
587                         tree->cache_size -= eb->len;
588                 }
589                 free(eb);
590         }
591 }
592
593 struct extent_buffer *find_extent_buffer(struct extent_io_tree *tree,
594                                          u64 bytenr, u32 blocksize)
595 {
596         struct extent_buffer *eb = NULL;
597         struct cache_extent *cache;
598
599         cache = lookup_cache_extent(&tree->cache, bytenr, blocksize);
600         if (cache && cache->start == bytenr &&
601             cache->size == blocksize) {
602                 eb = container_of(cache, struct extent_buffer, cache_node);
603                 list_move_tail(&eb->lru, &tree->lru);
604                 eb->refs++;
605         }
606         return eb;
607 }
608
609 struct extent_buffer *find_first_extent_buffer(struct extent_io_tree *tree,
610                                                u64 start)
611 {
612         struct extent_buffer *eb = NULL;
613         struct cache_extent *cache;
614
615         cache = search_cache_extent(&tree->cache, start);
616         if (cache) {
617                 eb = container_of(cache, struct extent_buffer, cache_node);
618                 list_move_tail(&eb->lru, &tree->lru);
619                 eb->refs++;
620         }
621         return eb;
622 }
623
624 struct extent_buffer *alloc_extent_buffer(struct extent_io_tree *tree,
625                                           u64 bytenr, u32 blocksize)
626 {
627         struct extent_buffer *eb;
628         struct cache_extent *cache;
629
630         cache = lookup_cache_extent(&tree->cache, bytenr, blocksize);
631         if (cache && cache->start == bytenr &&
632             cache->size == blocksize) {
633                 eb = container_of(cache, struct extent_buffer, cache_node);
634                 list_move_tail(&eb->lru, &tree->lru);
635                 eb->refs++;
636         } else {
637                 int ret;
638
639                 if (cache) {
640                         eb = container_of(cache, struct extent_buffer,
641                                           cache_node);
642                         free_extent_buffer(eb);
643                 }
644                 eb = __alloc_extent_buffer(tree, bytenr, blocksize);
645                 if (!eb)
646                         return NULL;
647                 ret = insert_cache_extent(&tree->cache, &eb->cache_node);
648                 if (ret) {
649                         free(eb);
650                         return NULL;
651                 }
652                 list_add_tail(&eb->lru, &tree->lru);
653                 tree->cache_size += blocksize;
654         }
655         return eb;
656 }
657
658 int read_extent_from_disk(struct extent_buffer *eb,
659                           unsigned long offset, unsigned long len)
660 {
661         int ret;
662         ret = pread(eb->fd, eb->data + offset, len, eb->dev_bytenr);
663         if (ret < 0) {
664                 ret = -errno;
665                 goto out;
666         }
667         if (ret != len) {
668                 ret = -EIO;
669                 goto out;
670         }
671         ret = 0;
672 out:
673         return ret;
674 }
675
676 int write_extent_to_disk(struct extent_buffer *eb)
677 {
678         int ret;
679         ret = pwrite(eb->fd, eb->data, eb->len, eb->dev_bytenr);
680         if (ret < 0)
681                 goto out;
682         if (ret != eb->len) {
683                 ret = -EIO;
684                 goto out;
685         }
686         ret = 0;
687 out:
688         return ret;
689 }
690
691 int read_data_from_disk(struct btrfs_fs_info *info, void *buf, u64 offset,
692                         u64 bytes, int mirror)
693 {
694         struct btrfs_multi_bio *multi = NULL;
695         struct btrfs_device *device;
696         u64 bytes_left = bytes;
697         u64 read_len;
698         u64 total_read = 0;
699         int ret;
700
701         while (bytes_left) {
702                 read_len = bytes_left;
703                 ret = btrfs_map_block(&info->mapping_tree, READ, offset,
704                                       &read_len, &multi, mirror, NULL);
705                 if (ret) {
706                         fprintf(stderr, "Couldn't map the block %Lu\n",
707                                 offset);
708                         return -EIO;
709                 }
710                 device = multi->stripes[0].dev;
711
712                 read_len = min(bytes_left, read_len);
713                 if (device->fd <= 0) {
714                         kfree(multi);
715                         return -EIO;
716                 }
717
718                 ret = pread(device->fd, buf + total_read, read_len,
719                             multi->stripes[0].physical);
720                 kfree(multi);
721                 if (ret < 0) {
722                         fprintf(stderr, "Error reading %Lu, %d\n", offset,
723                                 ret);
724                         return ret;
725                 }
726                 if (ret != read_len) {
727                         fprintf(stderr, "Short read for %Lu, read %d, "
728                                 "read_len %Lu\n", offset, ret, read_len);
729                         return -EIO;
730                 }
731
732                 bytes_left -= read_len;
733                 offset += read_len;
734                 total_read += read_len;
735         }
736
737         return 0;
738 }
739
740 int write_data_to_disk(struct btrfs_fs_info *info, void *buf, u64 offset,
741                       u64 bytes, int mirror)
742 {
743         struct btrfs_multi_bio *multi = NULL;
744         struct btrfs_device *device;
745         u64 bytes_left = bytes;
746         u64 this_len;
747         u64 total_write = 0;
748         u64 *raid_map = NULL;
749         u64 dev_bytenr;
750         int dev_nr;
751         int ret = 0;
752
753         while (bytes_left > 0) {
754                 this_len = bytes_left;
755                 dev_nr = 0;
756
757                 ret = btrfs_map_block(&info->mapping_tree, WRITE, offset,
758                                       &this_len, &multi, mirror, &raid_map);
759                 if (ret) {
760                         fprintf(stderr, "Couldn't map the block %Lu\n",
761                                 offset);
762                         return -EIO;
763                 }
764
765                 if (raid_map) {
766                         struct extent_buffer *eb;
767                         u64 stripe_len = this_len;
768
769                         this_len = min(this_len, bytes_left);
770                         this_len = min(this_len, (u64)info->tree_root->nodesize);
771
772                         eb = malloc(sizeof(struct extent_buffer) + this_len);
773                         if (!eb) {
774                                 fprintf(stderr, "cannot allocate memory for eb\n");
775                                 ret = -ENOMEM;
776                                 goto out;
777                         }
778
779                         memset(eb, 0, sizeof(struct extent_buffer) + this_len);
780                         eb->start = offset;
781                         eb->len = this_len;
782
783                         memcpy(eb->data, buf + total_write, this_len);
784                         ret = write_raid56_with_parity(info, eb, multi,
785                                                        stripe_len, raid_map);
786                         BUG_ON(ret);
787
788                         free(eb);
789                         kfree(raid_map);
790                         raid_map = NULL;
791                 } else while (dev_nr < multi->num_stripes) {
792                         device = multi->stripes[dev_nr].dev;
793                         if (device->fd <= 0) {
794                                 kfree(multi);
795                                 return -EIO;
796                         }
797
798                         dev_bytenr = multi->stripes[dev_nr].physical;
799                         this_len = min(this_len, bytes_left);
800                         dev_nr++;
801
802                         ret = pwrite(device->fd, buf + total_write, this_len, dev_bytenr);
803                         if (ret != this_len) {
804                                 if (ret < 0) {
805                                         fprintf(stderr, "Error writing to "
806                                                 "device %d\n", errno);
807                                         ret = errno;
808                                         kfree(multi);
809                                         return ret;
810                                 } else {
811                                         fprintf(stderr, "Short write\n");
812                                         kfree(multi);
813                                         return -EIO;
814                                 }
815                         }
816                 }
817
818                 BUG_ON(bytes_left < this_len);
819
820                 bytes_left -= this_len;
821                 offset += this_len;
822                 total_write += this_len;
823
824                 kfree(multi);
825                 multi = NULL;
826         }
827         return 0;
828
829 out:
830         kfree(raid_map);
831         return ret;
832 }
833
834 int set_extent_buffer_dirty(struct extent_buffer *eb)
835 {
836         struct extent_io_tree *tree = eb->tree;
837         if (!(eb->flags & EXTENT_DIRTY)) {
838                 eb->flags |= EXTENT_DIRTY;
839                 set_extent_dirty(tree, eb->start, eb->start + eb->len - 1, 0);
840                 extent_buffer_get(eb);
841         }
842         return 0;
843 }
844
845 int clear_extent_buffer_dirty(struct extent_buffer *eb)
846 {
847         struct extent_io_tree *tree = eb->tree;
848         if (eb->flags & EXTENT_DIRTY) {
849                 eb->flags &= ~EXTENT_DIRTY;
850                 clear_extent_dirty(tree, eb->start, eb->start + eb->len - 1, 0);
851                 free_extent_buffer(eb);
852         }
853         return 0;
854 }
855
856 int memcmp_extent_buffer(struct extent_buffer *eb, const void *ptrv,
857                          unsigned long start, unsigned long len)
858 {
859         return memcmp(eb->data + start, ptrv, len);
860 }
861
862 void read_extent_buffer(struct extent_buffer *eb, void *dst,
863                         unsigned long start, unsigned long len)
864 {
865         memcpy(dst, eb->data + start, len);
866 }
867
868 void write_extent_buffer(struct extent_buffer *eb, const void *src,
869                          unsigned long start, unsigned long len)
870 {
871         memcpy(eb->data + start, src, len);
872 }
873
874 void copy_extent_buffer(struct extent_buffer *dst, struct extent_buffer *src,
875                         unsigned long dst_offset, unsigned long src_offset,
876                         unsigned long len)
877 {
878         memcpy(dst->data + dst_offset, src->data + src_offset, len);
879 }
880
881 void memmove_extent_buffer(struct extent_buffer *dst, unsigned long dst_offset,
882                            unsigned long src_offset, unsigned long len)
883 {
884         memmove(dst->data + dst_offset, dst->data + src_offset, len);
885 }
886
887 void memset_extent_buffer(struct extent_buffer *eb, char c,
888                           unsigned long start, unsigned long len)
889 {
890         memset(eb->data + start, c, len);
891 }
892
893 int extent_buffer_test_bit(struct extent_buffer *eb, unsigned long start,
894                            unsigned long nr)
895 {
896         return le_test_bit(nr, (u8 *)eb->data + start);
897 }