btrfs-progs: remove unused argument from clear_extent_bits
[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,
290                     u64 end, int bits, gfp_t mask)
291 {
292         struct extent_state *state;
293         struct extent_state *prealloc = NULL;
294         struct cache_extent *node;
295         int err = 0;
296         u64 last_start;
297         u64 last_end;
298 again:
299         if (!prealloc) {
300                 prealloc = alloc_extent_state();
301                 if (!prealloc)
302                         return -ENOMEM;
303         }
304
305         /*
306          * this search will find the extents that end after
307          * our range starts
308          */
309         node = search_cache_extent(&tree->state, start);
310         if (!node) {
311                 err = insert_state(tree, prealloc, start, end, bits);
312                 BUG_ON(err == -EEXIST);
313                 prealloc = NULL;
314                 goto out;
315         }
316
317         state = container_of(node, struct extent_state, cache_node);
318         last_start = state->start;
319         last_end = state->end;
320
321         /*
322          * | ---- desired range ---- |
323          * | state |
324          *
325          * Just lock what we found and keep going
326          */
327         if (state->start == start && state->end <= end) {
328                 state->state |= bits;
329                 merge_state(tree, state);
330                 if (last_end == (u64)-1)
331                         goto out;
332                 start = last_end + 1;
333                 goto search_again;
334         }
335         /*
336          *     | ---- desired range ---- |
337          * | state |
338          *   or
339          * | ------------- state -------------- |
340          *
341          * We need to split the extent we found, and may flip bits on
342          * second half.
343          *
344          * If the extent we found extends past our
345          * range, we just split and search again.  It'll get split
346          * again the next time though.
347          *
348          * If the extent we found is inside our range, we set the
349          * desired bit on it.
350          */
351         if (state->start < start) {
352                 err = split_state(tree, state, prealloc, start);
353                 BUG_ON(err == -EEXIST);
354                 prealloc = NULL;
355                 if (err)
356                         goto out;
357                 if (state->end <= end) {
358                         state->state |= bits;
359                         start = state->end + 1;
360                         merge_state(tree, state);
361                         if (last_end == (u64)-1)
362                                 goto out;
363                         start = last_end + 1;
364                 } else {
365                         start = state->start;
366                 }
367                 goto search_again;
368         }
369         /*
370          * | ---- desired range ---- |
371          *     | state | or               | state |
372          *
373          * There's a hole, we need to insert something in it and
374          * ignore the extent we found.
375          */
376         if (state->start > start) {
377                 u64 this_end;
378                 if (end < last_start)
379                         this_end = end;
380                 else
381                         this_end = last_start -1;
382                 err = insert_state(tree, prealloc, start, this_end,
383                                 bits);
384                 BUG_ON(err == -EEXIST);
385                 prealloc = NULL;
386                 if (err)
387                         goto out;
388                 start = this_end + 1;
389                 goto search_again;
390         }
391         /*
392          * | ---- desired range ---- |
393          * | ---------- state ---------- |
394          * We need to split the extent, and set the bit
395          * on the first half
396          */
397         err = split_state(tree, state, prealloc, end + 1);
398         BUG_ON(err == -EEXIST);
399
400         state->state |= bits;
401         merge_state(tree, prealloc);
402         prealloc = NULL;
403 out:
404         if (prealloc)
405                 btrfs_free_extent_state(prealloc);
406         return err;
407 search_again:
408         if (start > end)
409                 goto out;
410         goto again;
411 }
412
413 int set_extent_dirty(struct extent_io_tree *tree, u64 start, u64 end,
414                      gfp_t mask)
415 {
416         return set_extent_bits(tree, start, end, EXTENT_DIRTY, mask);
417 }
418
419 int clear_extent_dirty(struct extent_io_tree *tree, u64 start, u64 end,
420                        gfp_t mask)
421 {
422         return clear_extent_bits(tree, start, end, EXTENT_DIRTY);
423 }
424
425 int find_first_extent_bit(struct extent_io_tree *tree, u64 start,
426                           u64 *start_ret, u64 *end_ret, int bits)
427 {
428         struct cache_extent *node;
429         struct extent_state *state;
430         int ret = 1;
431
432         /*
433          * this search will find all the extents that end after
434          * our range starts.
435          */
436         node = search_cache_extent(&tree->state, start);
437         if (!node)
438                 goto out;
439
440         while(1) {
441                 state = container_of(node, struct extent_state, cache_node);
442                 if (state->end >= start && (state->state & bits)) {
443                         *start_ret = state->start;
444                         *end_ret = state->end;
445                         ret = 0;
446                         break;
447                 }
448                 node = next_cache_extent(node);
449                 if (!node)
450                         break;
451         }
452 out:
453         return ret;
454 }
455
456 int test_range_bit(struct extent_io_tree *tree, u64 start, u64 end,
457                    int bits, int filled)
458 {
459         struct extent_state *state = NULL;
460         struct cache_extent *node;
461         int bitset = 0;
462
463         node = search_cache_extent(&tree->state, start);
464         while (node && start <= end) {
465                 state = container_of(node, struct extent_state, cache_node);
466
467                 if (filled && state->start > start) {
468                         bitset = 0;
469                         break;
470                 }
471                 if (state->start > end)
472                         break;
473                 if (state->state & bits) {
474                         bitset = 1;
475                         if (!filled)
476                                 break;
477                 } else if (filled) {
478                         bitset = 0;
479                         break;
480                 }
481                 start = state->end + 1;
482                 if (start > end)
483                         break;
484                 node = next_cache_extent(node);
485                 if (!node) {
486                         if (filled)
487                                 bitset = 0;
488                         break;
489                 }
490         }
491         return bitset;
492 }
493
494 int set_state_private(struct extent_io_tree *tree, u64 start, u64 private)
495 {
496         struct cache_extent *node;
497         struct extent_state *state;
498         int ret = 0;
499
500         node = search_cache_extent(&tree->state, start);
501         if (!node) {
502                 ret = -ENOENT;
503                 goto out;
504         }
505         state = container_of(node, struct extent_state, cache_node);
506         if (state->start != start) {
507                 ret = -ENOENT;
508                 goto out;
509         }
510         state->xprivate = private;
511 out:
512         return ret;
513 }
514
515 int get_state_private(struct extent_io_tree *tree, u64 start, u64 *private)
516 {
517         struct cache_extent *node;
518         struct extent_state *state;
519         int ret = 0;
520
521         node = search_cache_extent(&tree->state, start);
522         if (!node) {
523                 ret = -ENOENT;
524                 goto out;
525         }
526         state = container_of(node, struct extent_state, cache_node);
527         if (state->start != start) {
528                 ret = -ENOENT;
529                 goto out;
530         }
531         *private = state->xprivate;
532 out:
533         return ret;
534 }
535
536 static struct extent_buffer *__alloc_extent_buffer(struct extent_io_tree *tree,
537                                                    u64 bytenr, u32 blocksize)
538 {
539         struct extent_buffer *eb;
540
541         eb = calloc(1, sizeof(struct extent_buffer) + blocksize);
542         if (!eb)
543                 return NULL;
544
545         eb->start = bytenr;
546         eb->len = blocksize;
547         eb->refs = 1;
548         eb->flags = 0;
549         eb->tree = tree;
550         eb->fd = -1;
551         eb->dev_bytenr = (u64)-1;
552         eb->cache_node.start = bytenr;
553         eb->cache_node.size = blocksize;
554         INIT_LIST_HEAD(&eb->recow);
555
556         return eb;
557 }
558
559 struct extent_buffer *btrfs_clone_extent_buffer(struct extent_buffer *src)
560 {
561         struct extent_buffer *new;
562
563         new = __alloc_extent_buffer(NULL, src->start, src->len);
564         if (!new)
565                 return NULL;
566
567         copy_extent_buffer(new, src, 0, 0, src->len);
568         new->flags |= EXTENT_BUFFER_DUMMY;
569
570         return new;
571 }
572
573 void free_extent_buffer(struct extent_buffer *eb)
574 {
575         if (!eb || IS_ERR(eb))
576                 return;
577
578         eb->refs--;
579         BUG_ON(eb->refs < 0);
580         if (eb->refs == 0) {
581                 struct extent_io_tree *tree = eb->tree;
582                 BUG_ON(eb->flags & EXTENT_DIRTY);
583                 list_del_init(&eb->lru);
584                 list_del_init(&eb->recow);
585                 if (!(eb->flags & EXTENT_BUFFER_DUMMY)) {
586                         BUG_ON(tree->cache_size < eb->len);
587                         remove_cache_extent(&tree->cache, &eb->cache_node);
588                         tree->cache_size -= eb->len;
589                 }
590                 free(eb);
591         }
592 }
593
594 struct extent_buffer *find_extent_buffer(struct extent_io_tree *tree,
595                                          u64 bytenr, u32 blocksize)
596 {
597         struct extent_buffer *eb = NULL;
598         struct cache_extent *cache;
599
600         cache = lookup_cache_extent(&tree->cache, bytenr, blocksize);
601         if (cache && cache->start == bytenr &&
602             cache->size == blocksize) {
603                 eb = container_of(cache, struct extent_buffer, cache_node);
604                 list_move_tail(&eb->lru, &tree->lru);
605                 eb->refs++;
606         }
607         return eb;
608 }
609
610 struct extent_buffer *find_first_extent_buffer(struct extent_io_tree *tree,
611                                                u64 start)
612 {
613         struct extent_buffer *eb = NULL;
614         struct cache_extent *cache;
615
616         cache = search_cache_extent(&tree->cache, start);
617         if (cache) {
618                 eb = container_of(cache, struct extent_buffer, cache_node);
619                 list_move_tail(&eb->lru, &tree->lru);
620                 eb->refs++;
621         }
622         return eb;
623 }
624
625 struct extent_buffer *alloc_extent_buffer(struct extent_io_tree *tree,
626                                           u64 bytenr, u32 blocksize)
627 {
628         struct extent_buffer *eb;
629         struct cache_extent *cache;
630
631         cache = lookup_cache_extent(&tree->cache, bytenr, blocksize);
632         if (cache && cache->start == bytenr &&
633             cache->size == blocksize) {
634                 eb = container_of(cache, struct extent_buffer, cache_node);
635                 list_move_tail(&eb->lru, &tree->lru);
636                 eb->refs++;
637         } else {
638                 int ret;
639
640                 if (cache) {
641                         eb = container_of(cache, struct extent_buffer,
642                                           cache_node);
643                         free_extent_buffer(eb);
644                 }
645                 eb = __alloc_extent_buffer(tree, bytenr, blocksize);
646                 if (!eb)
647                         return NULL;
648                 ret = insert_cache_extent(&tree->cache, &eb->cache_node);
649                 if (ret) {
650                         free(eb);
651                         return NULL;
652                 }
653                 list_add_tail(&eb->lru, &tree->lru);
654                 tree->cache_size += blocksize;
655         }
656         return eb;
657 }
658
659 int read_extent_from_disk(struct extent_buffer *eb,
660                           unsigned long offset, unsigned long len)
661 {
662         int ret;
663         ret = pread(eb->fd, eb->data + offset, len, eb->dev_bytenr);
664         if (ret < 0) {
665                 ret = -errno;
666                 goto out;
667         }
668         if (ret != len) {
669                 ret = -EIO;
670                 goto out;
671         }
672         ret = 0;
673 out:
674         return ret;
675 }
676
677 int write_extent_to_disk(struct extent_buffer *eb)
678 {
679         int ret;
680         ret = pwrite(eb->fd, eb->data, eb->len, eb->dev_bytenr);
681         if (ret < 0)
682                 goto out;
683         if (ret != eb->len) {
684                 ret = -EIO;
685                 goto out;
686         }
687         ret = 0;
688 out:
689         return ret;
690 }
691
692 int read_data_from_disk(struct btrfs_fs_info *info, void *buf, u64 offset,
693                         u64 bytes, int mirror)
694 {
695         struct btrfs_multi_bio *multi = NULL;
696         struct btrfs_device *device;
697         u64 bytes_left = bytes;
698         u64 read_len;
699         u64 total_read = 0;
700         int ret;
701
702         while (bytes_left) {
703                 read_len = bytes_left;
704                 ret = btrfs_map_block(&info->mapping_tree, READ, offset,
705                                       &read_len, &multi, mirror, NULL);
706                 if (ret) {
707                         fprintf(stderr, "Couldn't map the block %Lu\n",
708                                 offset);
709                         return -EIO;
710                 }
711                 device = multi->stripes[0].dev;
712
713                 read_len = min(bytes_left, read_len);
714                 if (device->fd <= 0) {
715                         kfree(multi);
716                         return -EIO;
717                 }
718
719                 ret = pread(device->fd, buf + total_read, read_len,
720                             multi->stripes[0].physical);
721                 kfree(multi);
722                 if (ret < 0) {
723                         fprintf(stderr, "Error reading %Lu, %d\n", offset,
724                                 ret);
725                         return ret;
726                 }
727                 if (ret != read_len) {
728                         fprintf(stderr, "Short read for %Lu, read %d, "
729                                 "read_len %Lu\n", offset, ret, read_len);
730                         return -EIO;
731                 }
732
733                 bytes_left -= read_len;
734                 offset += read_len;
735                 total_read += read_len;
736         }
737
738         return 0;
739 }
740
741 int write_data_to_disk(struct btrfs_fs_info *info, void *buf, u64 offset,
742                       u64 bytes, int mirror)
743 {
744         struct btrfs_multi_bio *multi = NULL;
745         struct btrfs_device *device;
746         u64 bytes_left = bytes;
747         u64 this_len;
748         u64 total_write = 0;
749         u64 *raid_map = NULL;
750         u64 dev_bytenr;
751         int dev_nr;
752         int ret = 0;
753
754         while (bytes_left > 0) {
755                 this_len = bytes_left;
756                 dev_nr = 0;
757
758                 ret = btrfs_map_block(&info->mapping_tree, WRITE, offset,
759                                       &this_len, &multi, mirror, &raid_map);
760                 if (ret) {
761                         fprintf(stderr, "Couldn't map the block %Lu\n",
762                                 offset);
763                         return -EIO;
764                 }
765
766                 if (raid_map) {
767                         struct extent_buffer *eb;
768                         u64 stripe_len = this_len;
769
770                         this_len = min(this_len, bytes_left);
771                         this_len = min(this_len, (u64)info->tree_root->nodesize);
772
773                         eb = malloc(sizeof(struct extent_buffer) + this_len);
774                         if (!eb) {
775                                 fprintf(stderr, "cannot allocate memory for eb\n");
776                                 ret = -ENOMEM;
777                                 goto out;
778                         }
779
780                         memset(eb, 0, sizeof(struct extent_buffer) + this_len);
781                         eb->start = offset;
782                         eb->len = this_len;
783
784                         memcpy(eb->data, buf + total_write, this_len);
785                         ret = write_raid56_with_parity(info, eb, multi,
786                                                        stripe_len, raid_map);
787                         BUG_ON(ret);
788
789                         free(eb);
790                         kfree(raid_map);
791                         raid_map = NULL;
792                 } else while (dev_nr < multi->num_stripes) {
793                         device = multi->stripes[dev_nr].dev;
794                         if (device->fd <= 0) {
795                                 kfree(multi);
796                                 return -EIO;
797                         }
798
799                         dev_bytenr = multi->stripes[dev_nr].physical;
800                         this_len = min(this_len, bytes_left);
801                         dev_nr++;
802
803                         ret = pwrite(device->fd, buf + total_write, this_len, dev_bytenr);
804                         if (ret != this_len) {
805                                 if (ret < 0) {
806                                         fprintf(stderr, "Error writing to "
807                                                 "device %d\n", errno);
808                                         ret = errno;
809                                         kfree(multi);
810                                         return ret;
811                                 } else {
812                                         fprintf(stderr, "Short write\n");
813                                         kfree(multi);
814                                         return -EIO;
815                                 }
816                         }
817                 }
818
819                 BUG_ON(bytes_left < this_len);
820
821                 bytes_left -= this_len;
822                 offset += this_len;
823                 total_write += this_len;
824
825                 kfree(multi);
826                 multi = NULL;
827         }
828         return 0;
829
830 out:
831         kfree(raid_map);
832         return ret;
833 }
834
835 int set_extent_buffer_dirty(struct extent_buffer *eb)
836 {
837         struct extent_io_tree *tree = eb->tree;
838         if (!(eb->flags & EXTENT_DIRTY)) {
839                 eb->flags |= EXTENT_DIRTY;
840                 set_extent_dirty(tree, eb->start, eb->start + eb->len - 1, 0);
841                 extent_buffer_get(eb);
842         }
843         return 0;
844 }
845
846 int clear_extent_buffer_dirty(struct extent_buffer *eb)
847 {
848         struct extent_io_tree *tree = eb->tree;
849         if (eb->flags & EXTENT_DIRTY) {
850                 eb->flags &= ~EXTENT_DIRTY;
851                 clear_extent_dirty(tree, eb->start, eb->start + eb->len - 1, 0);
852                 free_extent_buffer(eb);
853         }
854         return 0;
855 }
856
857 int memcmp_extent_buffer(struct extent_buffer *eb, const void *ptrv,
858                          unsigned long start, unsigned long len)
859 {
860         return memcmp(eb->data + start, ptrv, len);
861 }
862
863 void read_extent_buffer(struct extent_buffer *eb, void *dst,
864                         unsigned long start, unsigned long len)
865 {
866         memcpy(dst, eb->data + start, len);
867 }
868
869 void write_extent_buffer(struct extent_buffer *eb, const void *src,
870                          unsigned long start, unsigned long len)
871 {
872         memcpy(eb->data + start, src, len);
873 }
874
875 void copy_extent_buffer(struct extent_buffer *dst, struct extent_buffer *src,
876                         unsigned long dst_offset, unsigned long src_offset,
877                         unsigned long len)
878 {
879         memcpy(dst->data + dst_offset, src->data + src_offset, len);
880 }
881
882 void memmove_extent_buffer(struct extent_buffer *dst, unsigned long dst_offset,
883                            unsigned long src_offset, unsigned long len)
884 {
885         memmove(dst->data + dst_offset, dst->data + src_offset, len);
886 }
887
888 void memset_extent_buffer(struct extent_buffer *eb, char c,
889                           unsigned long start, unsigned long len)
890 {
891         memset(eb->data + start, c, len);
892 }
893
894 int extent_buffer_test_bit(struct extent_buffer *eb, unsigned long start,
895                            unsigned long nr)
896 {
897         return le_test_bit(nr, (u8 *)eb->data + start);
898 }