1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32#include <linux/fs.h>
33#include <linux/time.h>
34#include <linux/jbd2.h>
35#include <linux/highuid.h>
36#include <linux/pagemap.h>
37#include <linux/quotaops.h>
38#include <linux/string.h>
39#include <linux/slab.h>
40#include <asm/uaccess.h>
41#include <linux/fiemap.h>
42#include <linux/backing-dev.h>
43#include "ext4_jbd2.h"
44#include "ext4_extents.h"
45#include "xattr.h"
46
47#include <trace/events/ext4.h>
48
49
50
51
52#define EXT4_EXT_MAY_ZEROOUT 0x1
53
54#define EXT4_EXT_MARK_UNWRIT1 0x2
55#define EXT4_EXT_MARK_UNWRIT2 0x4
56
57#define EXT4_EXT_DATA_VALID1 0x8
58#define EXT4_EXT_DATA_VALID2 0x10
59
60static __le32 ext4_extent_block_csum(struct inode *inode,
61 struct ext4_extent_header *eh)
62{
63 struct ext4_inode_info *ei = EXT4_I(inode);
64 struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb);
65 __u32 csum;
66
67 csum = ext4_chksum(sbi, ei->i_csum_seed, (__u8 *)eh,
68 EXT4_EXTENT_TAIL_OFFSET(eh));
69 return cpu_to_le32(csum);
70}
71
72static int ext4_extent_block_csum_verify(struct inode *inode,
73 struct ext4_extent_header *eh)
74{
75 struct ext4_extent_tail *et;
76
77 if (!ext4_has_metadata_csum(inode->i_sb))
78 return 1;
79
80 et = find_ext4_extent_tail(eh);
81 if (et->et_checksum != ext4_extent_block_csum(inode, eh))
82 return 0;
83 return 1;
84}
85
86static void ext4_extent_block_csum_set(struct inode *inode,
87 struct ext4_extent_header *eh)
88{
89 struct ext4_extent_tail *et;
90
91 if (!ext4_has_metadata_csum(inode->i_sb))
92 return;
93
94 et = find_ext4_extent_tail(eh);
95 et->et_checksum = ext4_extent_block_csum(inode, eh);
96}
97
98static int ext4_split_extent(handle_t *handle,
99 struct inode *inode,
100 struct ext4_ext_path **ppath,
101 struct ext4_map_blocks *map,
102 int split_flag,
103 int flags);
104
105static int ext4_split_extent_at(handle_t *handle,
106 struct inode *inode,
107 struct ext4_ext_path **ppath,
108 ext4_lblk_t split,
109 int split_flag,
110 int flags);
111
112static int ext4_find_delayed_extent(struct inode *inode,
113 struct extent_status *newes);
114
115static int ext4_ext_truncate_extend_restart(handle_t *handle,
116 struct inode *inode,
117 int needed)
118{
119 int err;
120
121 if (!ext4_handle_valid(handle))
122 return 0;
123 if (handle->h_buffer_credits >= needed)
124 return 0;
125
126
127
128
129 needed += 3;
130 err = ext4_journal_extend(handle, needed - handle->h_buffer_credits);
131 if (err <= 0)
132 return err;
133 err = ext4_truncate_restart_trans(handle, inode, needed);
134 if (err == 0)
135 err = -EAGAIN;
136
137 return err;
138}
139
140
141
142
143
144
145static int ext4_ext_get_access(handle_t *handle, struct inode *inode,
146 struct ext4_ext_path *path)
147{
148 if (path->p_bh) {
149
150 BUFFER_TRACE(path->p_bh, "get_write_access");
151 return ext4_journal_get_write_access(handle, path->p_bh);
152 }
153
154
155 return 0;
156}
157
158
159
160
161
162
163
164int __ext4_ext_dirty(const char *where, unsigned int line, handle_t *handle,
165 struct inode *inode, struct ext4_ext_path *path)
166{
167 int err;
168
169 WARN_ON(!rwsem_is_locked(&EXT4_I(inode)->i_data_sem));
170 if (path->p_bh) {
171 ext4_extent_block_csum_set(inode, ext_block_hdr(path->p_bh));
172
173 err = __ext4_handle_dirty_metadata(where, line, handle,
174 inode, path->p_bh);
175 } else {
176
177 err = ext4_mark_inode_dirty(handle, inode);
178 }
179 return err;
180}
181
182static ext4_fsblk_t ext4_ext_find_goal(struct inode *inode,
183 struct ext4_ext_path *path,
184 ext4_lblk_t block)
185{
186 if (path) {
187 int depth = path->p_depth;
188 struct ext4_extent *ex;
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207 ex = path[depth].p_ext;
208 if (ex) {
209 ext4_fsblk_t ext_pblk = ext4_ext_pblock(ex);
210 ext4_lblk_t ext_block = le32_to_cpu(ex->ee_block);
211
212 if (block > ext_block)
213 return ext_pblk + (block - ext_block);
214 else
215 return ext_pblk - (ext_block - block);
216 }
217
218
219
220 if (path[depth].p_bh)
221 return path[depth].p_bh->b_blocknr;
222 }
223
224
225 return ext4_inode_to_goal_block(inode);
226}
227
228
229
230
231static ext4_fsblk_t
232ext4_ext_new_meta_block(handle_t *handle, struct inode *inode,
233 struct ext4_ext_path *path,
234 struct ext4_extent *ex, int *err, unsigned int flags)
235{
236 ext4_fsblk_t goal, newblock;
237
238 goal = ext4_ext_find_goal(inode, path, le32_to_cpu(ex->ee_block));
239 newblock = ext4_new_meta_blocks(handle, inode, goal, flags,
240 NULL, err);
241 return newblock;
242}
243
244static inline int ext4_ext_space_block(struct inode *inode, int check)
245{
246 int size;
247
248 size = (inode->i_sb->s_blocksize - sizeof(struct ext4_extent_header))
249 / sizeof(struct ext4_extent);
250#ifdef AGGRESSIVE_TEST
251 if (!check && size > 6)
252 size = 6;
253#endif
254 return size;
255}
256
257static inline int ext4_ext_space_block_idx(struct inode *inode, int check)
258{
259 int size;
260
261 size = (inode->i_sb->s_blocksize - sizeof(struct ext4_extent_header))
262 / sizeof(struct ext4_extent_idx);
263#ifdef AGGRESSIVE_TEST
264 if (!check && size > 5)
265 size = 5;
266#endif
267 return size;
268}
269
270static inline int ext4_ext_space_root(struct inode *inode, int check)
271{
272 int size;
273
274 size = sizeof(EXT4_I(inode)->i_data);
275 size -= sizeof(struct ext4_extent_header);
276 size /= sizeof(struct ext4_extent);
277#ifdef AGGRESSIVE_TEST
278 if (!check && size > 3)
279 size = 3;
280#endif
281 return size;
282}
283
284static inline int ext4_ext_space_root_idx(struct inode *inode, int check)
285{
286 int size;
287
288 size = sizeof(EXT4_I(inode)->i_data);
289 size -= sizeof(struct ext4_extent_header);
290 size /= sizeof(struct ext4_extent_idx);
291#ifdef AGGRESSIVE_TEST
292 if (!check && size > 4)
293 size = 4;
294#endif
295 return size;
296}
297
298static inline int
299ext4_force_split_extent_at(handle_t *handle, struct inode *inode,
300 struct ext4_ext_path **ppath, ext4_lblk_t lblk,
301 int nofail)
302{
303 struct ext4_ext_path *path = *ppath;
304 int unwritten = ext4_ext_is_unwritten(path[path->p_depth].p_ext);
305
306 return ext4_split_extent_at(handle, inode, ppath, lblk, unwritten ?
307 EXT4_EXT_MARK_UNWRIT1|EXT4_EXT_MARK_UNWRIT2 : 0,
308 EXT4_EX_NOCACHE | EXT4_GET_BLOCKS_PRE_IO |
309 (nofail ? EXT4_GET_BLOCKS_METADATA_NOFAIL:0));
310}
311
312
313
314
315
316
317int ext4_ext_calc_metadata_amount(struct inode *inode, ext4_lblk_t lblock)
318{
319 struct ext4_inode_info *ei = EXT4_I(inode);
320 int idxs;
321
322 idxs = ((inode->i_sb->s_blocksize - sizeof(struct ext4_extent_header))
323 / sizeof(struct ext4_extent_idx));
324
325
326
327
328
329
330
331
332
333 if (ei->i_da_metadata_calc_len &&
334 ei->i_da_metadata_calc_last_lblock+1 == lblock) {
335 int num = 0;
336
337 if ((ei->i_da_metadata_calc_len % idxs) == 0)
338 num++;
339 if ((ei->i_da_metadata_calc_len % (idxs*idxs)) == 0)
340 num++;
341 if ((ei->i_da_metadata_calc_len % (idxs*idxs*idxs)) == 0) {
342 num++;
343 ei->i_da_metadata_calc_len = 0;
344 } else
345 ei->i_da_metadata_calc_len++;
346 ei->i_da_metadata_calc_last_lblock++;
347 return num;
348 }
349
350
351
352
353
354 ei->i_da_metadata_calc_len = 1;
355 ei->i_da_metadata_calc_last_lblock = lblock;
356 return ext_depth(inode) + 1;
357}
358
359static int
360ext4_ext_max_entries(struct inode *inode, int depth)
361{
362 int max;
363
364 if (depth == ext_depth(inode)) {
365 if (depth == 0)
366 max = ext4_ext_space_root(inode, 1);
367 else
368 max = ext4_ext_space_root_idx(inode, 1);
369 } else {
370 if (depth == 0)
371 max = ext4_ext_space_block(inode, 1);
372 else
373 max = ext4_ext_space_block_idx(inode, 1);
374 }
375
376 return max;
377}
378
379static int ext4_valid_extent(struct inode *inode, struct ext4_extent *ext)
380{
381 ext4_fsblk_t block = ext4_ext_pblock(ext);
382 int len = ext4_ext_get_actual_len(ext);
383 ext4_lblk_t lblock = le32_to_cpu(ext->ee_block);
384
385
386
387
388
389
390 if (lblock + len <= lblock)
391 return 0;
392 return ext4_data_block_valid(EXT4_SB(inode->i_sb), block, len);
393}
394
395static int ext4_valid_extent_idx(struct inode *inode,
396 struct ext4_extent_idx *ext_idx)
397{
398 ext4_fsblk_t block = ext4_idx_pblock(ext_idx);
399
400 return ext4_data_block_valid(EXT4_SB(inode->i_sb), block, 1);
401}
402
403static int ext4_valid_extent_entries(struct inode *inode,
404 struct ext4_extent_header *eh,
405 int depth)
406{
407 unsigned short entries;
408 if (eh->eh_entries == 0)
409 return 1;
410
411 entries = le16_to_cpu(eh->eh_entries);
412
413 if (depth == 0) {
414
415 struct ext4_extent *ext = EXT_FIRST_EXTENT(eh);
416 struct ext4_super_block *es = EXT4_SB(inode->i_sb)->s_es;
417 ext4_fsblk_t pblock = 0;
418 ext4_lblk_t lblock = 0;
419 ext4_lblk_t prev = 0;
420 int len = 0;
421 while (entries) {
422 if (!ext4_valid_extent(inode, ext))
423 return 0;
424
425
426 lblock = le32_to_cpu(ext->ee_block);
427 len = ext4_ext_get_actual_len(ext);
428 if ((lblock <= prev) && prev) {
429 pblock = ext4_ext_pblock(ext);
430 es->s_last_error_block = cpu_to_le64(pblock);
431 return 0;
432 }
433 ext++;
434 entries--;
435 prev = lblock + len - 1;
436 }
437 } else {
438 struct ext4_extent_idx *ext_idx = EXT_FIRST_INDEX(eh);
439 while (entries) {
440 if (!ext4_valid_extent_idx(inode, ext_idx))
441 return 0;
442 ext_idx++;
443 entries--;
444 }
445 }
446 return 1;
447}
448
449static int __ext4_ext_check(const char *function, unsigned int line,
450 struct inode *inode, struct ext4_extent_header *eh,
451 int depth, ext4_fsblk_t pblk)
452{
453 const char *error_msg;
454 int max = 0, err = -EFSCORRUPTED;
455
456 if (unlikely(eh->eh_magic != EXT4_EXT_MAGIC)) {
457 error_msg = "invalid magic";
458 goto corrupted;
459 }
460 if (unlikely(le16_to_cpu(eh->eh_depth) != depth)) {
461 error_msg = "unexpected eh_depth";
462 goto corrupted;
463 }
464 if (unlikely(eh->eh_max == 0)) {
465 error_msg = "invalid eh_max";
466 goto corrupted;
467 }
468 max = ext4_ext_max_entries(inode, depth);
469 if (unlikely(le16_to_cpu(eh->eh_max) > max)) {
470 error_msg = "too large eh_max";
471 goto corrupted;
472 }
473 if (unlikely(le16_to_cpu(eh->eh_entries) > le16_to_cpu(eh->eh_max))) {
474 error_msg = "invalid eh_entries";
475 goto corrupted;
476 }
477 if (!ext4_valid_extent_entries(inode, eh, depth)) {
478 error_msg = "invalid extent entries";
479 goto corrupted;
480 }
481 if (unlikely(depth > 32)) {
482 error_msg = "too large eh_depth";
483 goto corrupted;
484 }
485
486 if (ext_depth(inode) != depth &&
487 !ext4_extent_block_csum_verify(inode, eh)) {
488 error_msg = "extent tree corrupted";
489 err = -EFSBADCRC;
490 goto corrupted;
491 }
492 return 0;
493
494corrupted:
495 ext4_error_inode(inode, function, line, 0,
496 "pblk %llu bad header/extent: %s - magic %x, "
497 "entries %u, max %u(%u), depth %u(%u)",
498 (unsigned long long) pblk, error_msg,
499 le16_to_cpu(eh->eh_magic),
500 le16_to_cpu(eh->eh_entries), le16_to_cpu(eh->eh_max),
501 max, le16_to_cpu(eh->eh_depth), depth);
502 return err;
503}
504
505#define ext4_ext_check(inode, eh, depth, pblk) \
506 __ext4_ext_check(__func__, __LINE__, (inode), (eh), (depth), (pblk))
507
508int ext4_ext_check_inode(struct inode *inode)
509{
510 return ext4_ext_check(inode, ext_inode_hdr(inode), ext_depth(inode), 0);
511}
512
513static struct buffer_head *
514__read_extent_tree_block(const char *function, unsigned int line,
515 struct inode *inode, ext4_fsblk_t pblk, int depth,
516 int flags)
517{
518 struct buffer_head *bh;
519 int err;
520
521 bh = sb_getblk_gfp(inode->i_sb, pblk, __GFP_MOVABLE | GFP_NOFS);
522 if (unlikely(!bh))
523 return ERR_PTR(-ENOMEM);
524
525 if (!bh_uptodate_or_lock(bh)) {
526 trace_ext4_ext_load_extent(inode, pblk, _RET_IP_);
527 err = bh_submit_read(bh);
528 if (err < 0)
529 goto errout;
530 }
531 if (buffer_verified(bh) && !(flags & EXT4_EX_FORCE_CACHE))
532 return bh;
533 err = __ext4_ext_check(function, line, inode,
534 ext_block_hdr(bh), depth, pblk);
535 if (err)
536 goto errout;
537 set_buffer_verified(bh);
538
539
540
541 if (!(flags & EXT4_EX_NOCACHE) && depth == 0) {
542 struct ext4_extent_header *eh = ext_block_hdr(bh);
543 struct ext4_extent *ex = EXT_FIRST_EXTENT(eh);
544 ext4_lblk_t prev = 0;
545 int i;
546
547 for (i = le16_to_cpu(eh->eh_entries); i > 0; i--, ex++) {
548 unsigned int status = EXTENT_STATUS_WRITTEN;
549 ext4_lblk_t lblk = le32_to_cpu(ex->ee_block);
550 int len = ext4_ext_get_actual_len(ex);
551
552 if (prev && (prev != lblk))
553 ext4_es_cache_extent(inode, prev,
554 lblk - prev, ~0,
555 EXTENT_STATUS_HOLE);
556
557 if (ext4_ext_is_unwritten(ex))
558 status = EXTENT_STATUS_UNWRITTEN;
559 ext4_es_cache_extent(inode, lblk, len,
560 ext4_ext_pblock(ex), status);
561 prev = lblk + len;
562 }
563 }
564 return bh;
565errout:
566 put_bh(bh);
567 return ERR_PTR(err);
568
569}
570
571#define read_extent_tree_block(inode, pblk, depth, flags) \
572 __read_extent_tree_block(__func__, __LINE__, (inode), (pblk), \
573 (depth), (flags))
574
575
576
577
578
579int ext4_ext_precache(struct inode *inode)
580{
581 struct ext4_inode_info *ei = EXT4_I(inode);
582 struct ext4_ext_path *path = NULL;
583 struct buffer_head *bh;
584 int i = 0, depth, ret = 0;
585
586 if (!ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS))
587 return 0;
588
589 down_read(&ei->i_data_sem);
590 depth = ext_depth(inode);
591
592 path = kzalloc(sizeof(struct ext4_ext_path) * (depth + 1),
593 GFP_NOFS);
594 if (path == NULL) {
595 up_read(&ei->i_data_sem);
596 return -ENOMEM;
597 }
598
599
600 if (depth == 0)
601 goto out;
602 path[0].p_hdr = ext_inode_hdr(inode);
603 ret = ext4_ext_check(inode, path[0].p_hdr, depth, 0);
604 if (ret)
605 goto out;
606 path[0].p_idx = EXT_FIRST_INDEX(path[0].p_hdr);
607 while (i >= 0) {
608
609
610
611
612 if ((i == depth) ||
613 path[i].p_idx > EXT_LAST_INDEX(path[i].p_hdr)) {
614 brelse(path[i].p_bh);
615 path[i].p_bh = NULL;
616 i--;
617 continue;
618 }
619 bh = read_extent_tree_block(inode,
620 ext4_idx_pblock(path[i].p_idx++),
621 depth - i - 1,
622 EXT4_EX_FORCE_CACHE);
623 if (IS_ERR(bh)) {
624 ret = PTR_ERR(bh);
625 break;
626 }
627 i++;
628 path[i].p_bh = bh;
629 path[i].p_hdr = ext_block_hdr(bh);
630 path[i].p_idx = EXT_FIRST_INDEX(path[i].p_hdr);
631 }
632 ext4_set_inode_state(inode, EXT4_STATE_EXT_PRECACHED);
633out:
634 up_read(&ei->i_data_sem);
635 ext4_ext_drop_refs(path);
636 kfree(path);
637 return ret;
638}
639
640#ifdef EXT_DEBUG
641static void ext4_ext_show_path(struct inode *inode, struct ext4_ext_path *path)
642{
643 int k, l = path->p_depth;
644
645 ext_debug("path:");
646 for (k = 0; k <= l; k++, path++) {
647 if (path->p_idx) {
648 ext_debug(" %d->%llu", le32_to_cpu(path->p_idx->ei_block),
649 ext4_idx_pblock(path->p_idx));
650 } else if (path->p_ext) {
651 ext_debug(" %d:[%d]%d:%llu ",
652 le32_to_cpu(path->p_ext->ee_block),
653 ext4_ext_is_unwritten(path->p_ext),
654 ext4_ext_get_actual_len(path->p_ext),
655 ext4_ext_pblock(path->p_ext));
656 } else
657 ext_debug(" []");
658 }
659 ext_debug("\n");
660}
661
662static void ext4_ext_show_leaf(struct inode *inode, struct ext4_ext_path *path)
663{
664 int depth = ext_depth(inode);
665 struct ext4_extent_header *eh;
666 struct ext4_extent *ex;
667 int i;
668
669 if (!path)
670 return;
671
672 eh = path[depth].p_hdr;
673 ex = EXT_FIRST_EXTENT(eh);
674
675 ext_debug("Displaying leaf extents for inode %lu\n", inode->i_ino);
676
677 for (i = 0; i < le16_to_cpu(eh->eh_entries); i++, ex++) {
678 ext_debug("%d:[%d]%d:%llu ", le32_to_cpu(ex->ee_block),
679 ext4_ext_is_unwritten(ex),
680 ext4_ext_get_actual_len(ex), ext4_ext_pblock(ex));
681 }
682 ext_debug("\n");
683}
684
685static void ext4_ext_show_move(struct inode *inode, struct ext4_ext_path *path,
686 ext4_fsblk_t newblock, int level)
687{
688 int depth = ext_depth(inode);
689 struct ext4_extent *ex;
690
691 if (depth != level) {
692 struct ext4_extent_idx *idx;
693 idx = path[level].p_idx;
694 while (idx <= EXT_MAX_INDEX(path[level].p_hdr)) {
695 ext_debug("%d: move %d:%llu in new index %llu\n", level,
696 le32_to_cpu(idx->ei_block),
697 ext4_idx_pblock(idx),
698 newblock);
699 idx++;
700 }
701
702 return;
703 }
704
705 ex = path[depth].p_ext;
706 while (ex <= EXT_MAX_EXTENT(path[depth].p_hdr)) {
707 ext_debug("move %d:%llu:[%d]%d in new leaf %llu\n",
708 le32_to_cpu(ex->ee_block),
709 ext4_ext_pblock(ex),
710 ext4_ext_is_unwritten(ex),
711 ext4_ext_get_actual_len(ex),
712 newblock);
713 ex++;
714 }
715}
716
717#else
718#define ext4_ext_show_path(inode, path)
719#define ext4_ext_show_leaf(inode, path)
720#define ext4_ext_show_move(inode, path, newblock, level)
721#endif
722
723void ext4_ext_drop_refs(struct ext4_ext_path *path)
724{
725 int depth, i;
726
727 if (!path)
728 return;
729 depth = path->p_depth;
730 for (i = 0; i <= depth; i++, path++)
731 if (path->p_bh) {
732 brelse(path->p_bh);
733 path->p_bh = NULL;
734 }
735}
736
737
738
739
740
741
742static void
743ext4_ext_binsearch_idx(struct inode *inode,
744 struct ext4_ext_path *path, ext4_lblk_t block)
745{
746 struct ext4_extent_header *eh = path->p_hdr;
747 struct ext4_extent_idx *r, *l, *m;
748
749
750 ext_debug("binsearch for %u(idx): ", block);
751
752 l = EXT_FIRST_INDEX(eh) + 1;
753 r = EXT_LAST_INDEX(eh);
754 while (l <= r) {
755 m = l + (r - l) / 2;
756 if (block < le32_to_cpu(m->ei_block))
757 r = m - 1;
758 else
759 l = m + 1;
760 ext_debug("%p(%u):%p(%u):%p(%u) ", l, le32_to_cpu(l->ei_block),
761 m, le32_to_cpu(m->ei_block),
762 r, le32_to_cpu(r->ei_block));
763 }
764
765 path->p_idx = l - 1;
766 ext_debug(" -> %u->%lld ", le32_to_cpu(path->p_idx->ei_block),
767 ext4_idx_pblock(path->p_idx));
768
769#ifdef CHECK_BINSEARCH
770 {
771 struct ext4_extent_idx *chix, *ix;
772 int k;
773
774 chix = ix = EXT_FIRST_INDEX(eh);
775 for (k = 0; k < le16_to_cpu(eh->eh_entries); k++, ix++) {
776 if (k != 0 &&
777 le32_to_cpu(ix->ei_block) <= le32_to_cpu(ix[-1].ei_block)) {
778 printk(KERN_DEBUG "k=%d, ix=0x%p, "
779 "first=0x%p\n", k,
780 ix, EXT_FIRST_INDEX(eh));
781 printk(KERN_DEBUG "%u <= %u\n",
782 le32_to_cpu(ix->ei_block),
783 le32_to_cpu(ix[-1].ei_block));
784 }
785 BUG_ON(k && le32_to_cpu(ix->ei_block)
786 <= le32_to_cpu(ix[-1].ei_block));
787 if (block < le32_to_cpu(ix->ei_block))
788 break;
789 chix = ix;
790 }
791 BUG_ON(chix != path->p_idx);
792 }
793#endif
794
795}
796
797
798
799
800
801
802static void
803ext4_ext_binsearch(struct inode *inode,
804 struct ext4_ext_path *path, ext4_lblk_t block)
805{
806 struct ext4_extent_header *eh = path->p_hdr;
807 struct ext4_extent *r, *l, *m;
808
809 if (eh->eh_entries == 0) {
810
811
812
813
814 return;
815 }
816
817 ext_debug("binsearch for %u: ", block);
818
819 l = EXT_FIRST_EXTENT(eh) + 1;
820 r = EXT_LAST_EXTENT(eh);
821
822 while (l <= r) {
823 m = l + (r - l) / 2;
824 if (block < le32_to_cpu(m->ee_block))
825 r = m - 1;
826 else
827 l = m + 1;
828 ext_debug("%p(%u):%p(%u):%p(%u) ", l, le32_to_cpu(l->ee_block),
829 m, le32_to_cpu(m->ee_block),
830 r, le32_to_cpu(r->ee_block));
831 }
832
833 path->p_ext = l - 1;
834 ext_debug(" -> %d:%llu:[%d]%d ",
835 le32_to_cpu(path->p_ext->ee_block),
836 ext4_ext_pblock(path->p_ext),
837 ext4_ext_is_unwritten(path->p_ext),
838 ext4_ext_get_actual_len(path->p_ext));
839
840#ifdef CHECK_BINSEARCH
841 {
842 struct ext4_extent *chex, *ex;
843 int k;
844
845 chex = ex = EXT_FIRST_EXTENT(eh);
846 for (k = 0; k < le16_to_cpu(eh->eh_entries); k++, ex++) {
847 BUG_ON(k && le32_to_cpu(ex->ee_block)
848 <= le32_to_cpu(ex[-1].ee_block));
849 if (block < le32_to_cpu(ex->ee_block))
850 break;
851 chex = ex;
852 }
853 BUG_ON(chex != path->p_ext);
854 }
855#endif
856
857}
858
859int ext4_ext_tree_init(handle_t *handle, struct inode *inode)
860{
861 struct ext4_extent_header *eh;
862
863 eh = ext_inode_hdr(inode);
864 eh->eh_depth = 0;
865 eh->eh_entries = 0;
866 eh->eh_magic = EXT4_EXT_MAGIC;
867 eh->eh_max = cpu_to_le16(ext4_ext_space_root(inode, 0));
868 ext4_mark_inode_dirty(handle, inode);
869 return 0;
870}
871
872struct ext4_ext_path *
873ext4_find_extent(struct inode *inode, ext4_lblk_t block,
874 struct ext4_ext_path **orig_path, int flags)
875{
876 struct ext4_extent_header *eh;
877 struct buffer_head *bh;
878 struct ext4_ext_path *path = orig_path ? *orig_path : NULL;
879 short int depth, i, ppos = 0;
880 int ret;
881
882 eh = ext_inode_hdr(inode);
883 depth = ext_depth(inode);
884
885 if (path) {
886 ext4_ext_drop_refs(path);
887 if (depth > path[0].p_maxdepth) {
888 kfree(path);
889 *orig_path = path = NULL;
890 }
891 }
892 if (!path) {
893
894 path = kzalloc(sizeof(struct ext4_ext_path) * (depth + 2),
895 GFP_NOFS);
896 if (unlikely(!path))
897 return ERR_PTR(-ENOMEM);
898 path[0].p_maxdepth = depth + 1;
899 }
900 path[0].p_hdr = eh;
901 path[0].p_bh = NULL;
902
903 i = depth;
904
905 while (i) {
906 ext_debug("depth %d: num %d, max %d\n",
907 ppos, le16_to_cpu(eh->eh_entries), le16_to_cpu(eh->eh_max));
908
909 ext4_ext_binsearch_idx(inode, path + ppos, block);
910 path[ppos].p_block = ext4_idx_pblock(path[ppos].p_idx);
911 path[ppos].p_depth = i;
912 path[ppos].p_ext = NULL;
913
914 bh = read_extent_tree_block(inode, path[ppos].p_block, --i,
915 flags);
916 if (IS_ERR(bh)) {
917 ret = PTR_ERR(bh);
918 goto err;
919 }
920
921 eh = ext_block_hdr(bh);
922 ppos++;
923 path[ppos].p_bh = bh;
924 path[ppos].p_hdr = eh;
925 }
926
927 path[ppos].p_depth = i;
928 path[ppos].p_ext = NULL;
929 path[ppos].p_idx = NULL;
930
931
932 ext4_ext_binsearch(inode, path + ppos, block);
933
934 if (path[ppos].p_ext)
935 path[ppos].p_block = ext4_ext_pblock(path[ppos].p_ext);
936
937 ext4_ext_show_path(inode, path);
938
939 return path;
940
941err:
942 ext4_ext_drop_refs(path);
943 kfree(path);
944 if (orig_path)
945 *orig_path = NULL;
946 return ERR_PTR(ret);
947}
948
949
950
951
952
953
954static int ext4_ext_insert_index(handle_t *handle, struct inode *inode,
955 struct ext4_ext_path *curp,
956 int logical, ext4_fsblk_t ptr)
957{
958 struct ext4_extent_idx *ix;
959 int len, err;
960
961 err = ext4_ext_get_access(handle, inode, curp);
962 if (err)
963 return err;
964
965 if (unlikely(logical == le32_to_cpu(curp->p_idx->ei_block))) {
966 EXT4_ERROR_INODE(inode,
967 "logical %d == ei_block %d!",
968 logical, le32_to_cpu(curp->p_idx->ei_block));
969 return -EFSCORRUPTED;
970 }
971
972 if (unlikely(le16_to_cpu(curp->p_hdr->eh_entries)
973 >= le16_to_cpu(curp->p_hdr->eh_max))) {
974 EXT4_ERROR_INODE(inode,
975 "eh_entries %d >= eh_max %d!",
976 le16_to_cpu(curp->p_hdr->eh_entries),
977 le16_to_cpu(curp->p_hdr->eh_max));
978 return -EFSCORRUPTED;
979 }
980
981 if (logical > le32_to_cpu(curp->p_idx->ei_block)) {
982
983 ext_debug("insert new index %d after: %llu\n", logical, ptr);
984 ix = curp->p_idx + 1;
985 } else {
986
987 ext_debug("insert new index %d before: %llu\n", logical, ptr);
988 ix = curp->p_idx;
989 }
990
991 len = EXT_LAST_INDEX(curp->p_hdr) - ix + 1;
992 BUG_ON(len < 0);
993 if (len > 0) {
994 ext_debug("insert new index %d: "
995 "move %d indices from 0x%p to 0x%p\n",
996 logical, len, ix, ix + 1);
997 memmove(ix + 1, ix, len * sizeof(struct ext4_extent_idx));
998 }
999
1000 if (unlikely(ix > EXT_MAX_INDEX(curp->p_hdr))) {
1001 EXT4_ERROR_INODE(inode, "ix > EXT_MAX_INDEX!");
1002 return -EFSCORRUPTED;
1003 }
1004
1005 ix->ei_block = cpu_to_le32(logical);
1006 ext4_idx_store_pblock(ix, ptr);
1007 le16_add_cpu(&curp->p_hdr->eh_entries, 1);
1008
1009 if (unlikely(ix > EXT_LAST_INDEX(curp->p_hdr))) {
1010 EXT4_ERROR_INODE(inode, "ix > EXT_LAST_INDEX!");
1011 return -EFSCORRUPTED;
1012 }
1013
1014 err = ext4_ext_dirty(handle, inode, curp);
1015 ext4_std_error(inode->i_sb, err);
1016
1017 return err;
1018}
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030static int ext4_ext_split(handle_t *handle, struct inode *inode,
1031 unsigned int flags,
1032 struct ext4_ext_path *path,
1033 struct ext4_extent *newext, int at)
1034{
1035 struct buffer_head *bh = NULL;
1036 int depth = ext_depth(inode);
1037 struct ext4_extent_header *neh;
1038 struct ext4_extent_idx *fidx;
1039 int i = at, k, m, a;
1040 ext4_fsblk_t newblock, oldblock;
1041 __le32 border;
1042 ext4_fsblk_t *ablocks = NULL;
1043 int err = 0;
1044
1045
1046
1047
1048
1049
1050 if (unlikely(path[depth].p_ext > EXT_MAX_EXTENT(path[depth].p_hdr))) {
1051 EXT4_ERROR_INODE(inode, "p_ext > EXT_MAX_EXTENT!");
1052 return -EFSCORRUPTED;
1053 }
1054 if (path[depth].p_ext != EXT_MAX_EXTENT(path[depth].p_hdr)) {
1055 border = path[depth].p_ext[1].ee_block;
1056 ext_debug("leaf will be split."
1057 " next leaf starts at %d\n",
1058 le32_to_cpu(border));
1059 } else {
1060 border = newext->ee_block;
1061 ext_debug("leaf will be added."
1062 " next leaf starts at %d\n",
1063 le32_to_cpu(border));
1064 }
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078 ablocks = kzalloc(sizeof(ext4_fsblk_t) * depth, GFP_NOFS);
1079 if (!ablocks)
1080 return -ENOMEM;
1081
1082
1083 ext_debug("allocate %d blocks for indexes/leaf\n", depth - at);
1084 for (a = 0; a < depth - at; a++) {
1085 newblock = ext4_ext_new_meta_block(handle, inode, path,
1086 newext, &err, flags);
1087 if (newblock == 0)
1088 goto cleanup;
1089 ablocks[a] = newblock;
1090 }
1091
1092
1093 newblock = ablocks[--a];
1094 if (unlikely(newblock == 0)) {
1095 EXT4_ERROR_INODE(inode, "newblock == 0!");
1096 err = -EFSCORRUPTED;
1097 goto cleanup;
1098 }
1099 bh = sb_getblk_gfp(inode->i_sb, newblock, __GFP_MOVABLE | GFP_NOFS);
1100 if (unlikely(!bh)) {
1101 err = -ENOMEM;
1102 goto cleanup;
1103 }
1104 lock_buffer(bh);
1105
1106 err = ext4_journal_get_create_access(handle, bh);
1107 if (err)
1108 goto cleanup;
1109
1110 neh = ext_block_hdr(bh);
1111 neh->eh_entries = 0;
1112 neh->eh_max = cpu_to_le16(ext4_ext_space_block(inode, 0));
1113 neh->eh_magic = EXT4_EXT_MAGIC;
1114 neh->eh_depth = 0;
1115
1116
1117 if (unlikely(path[depth].p_hdr->eh_entries !=
1118 path[depth].p_hdr->eh_max)) {
1119 EXT4_ERROR_INODE(inode, "eh_entries %d != eh_max %d!",
1120 path[depth].p_hdr->eh_entries,
1121 path[depth].p_hdr->eh_max);
1122 err = -EFSCORRUPTED;
1123 goto cleanup;
1124 }
1125
1126 m = EXT_MAX_EXTENT(path[depth].p_hdr) - path[depth].p_ext++;
1127 ext4_ext_show_move(inode, path, newblock, depth);
1128 if (m) {
1129 struct ext4_extent *ex;
1130 ex = EXT_FIRST_EXTENT(neh);
1131 memmove(ex, path[depth].p_ext, sizeof(struct ext4_extent) * m);
1132 le16_add_cpu(&neh->eh_entries, m);
1133 }
1134
1135 ext4_extent_block_csum_set(inode, neh);
1136 set_buffer_uptodate(bh);
1137 unlock_buffer(bh);
1138
1139 err = ext4_handle_dirty_metadata(handle, inode, bh);
1140 if (err)
1141 goto cleanup;
1142 brelse(bh);
1143 bh = NULL;
1144
1145
1146 if (m) {
1147 err = ext4_ext_get_access(handle, inode, path + depth);
1148 if (err)
1149 goto cleanup;
1150 le16_add_cpu(&path[depth].p_hdr->eh_entries, -m);
1151 err = ext4_ext_dirty(handle, inode, path + depth);
1152 if (err)
1153 goto cleanup;
1154
1155 }
1156
1157
1158 k = depth - at - 1;
1159 if (unlikely(k < 0)) {
1160 EXT4_ERROR_INODE(inode, "k %d < 0!", k);
1161 err = -EFSCORRUPTED;
1162 goto cleanup;
1163 }
1164 if (k)
1165 ext_debug("create %d intermediate indices\n", k);
1166
1167
1168 i = depth - 1;
1169 while (k--) {
1170 oldblock = newblock;
1171 newblock = ablocks[--a];
1172 bh = sb_getblk(inode->i_sb, newblock);
1173 if (unlikely(!bh)) {
1174 err = -ENOMEM;
1175 goto cleanup;
1176 }
1177 lock_buffer(bh);
1178
1179 err = ext4_journal_get_create_access(handle, bh);
1180 if (err)
1181 goto cleanup;
1182
1183 neh = ext_block_hdr(bh);
1184 neh->eh_entries = cpu_to_le16(1);
1185 neh->eh_magic = EXT4_EXT_MAGIC;
1186 neh->eh_max = cpu_to_le16(ext4_ext_space_block_idx(inode, 0));
1187 neh->eh_depth = cpu_to_le16(depth - i);
1188 fidx = EXT_FIRST_INDEX(neh);
1189 fidx->ei_block = border;
1190 ext4_idx_store_pblock(fidx, oldblock);
1191
1192 ext_debug("int.index at %d (block %llu): %u -> %llu\n",
1193 i, newblock, le32_to_cpu(border), oldblock);
1194
1195
1196 if (unlikely(EXT_MAX_INDEX(path[i].p_hdr) !=
1197 EXT_LAST_INDEX(path[i].p_hdr))) {
1198 EXT4_ERROR_INODE(inode,
1199 "EXT_MAX_INDEX != EXT_LAST_INDEX ee_block %d!",
1200 le32_to_cpu(path[i].p_ext->ee_block));
1201 err = -EFSCORRUPTED;
1202 goto cleanup;
1203 }
1204
1205 m = EXT_MAX_INDEX(path[i].p_hdr) - path[i].p_idx++;
1206 ext_debug("cur 0x%p, last 0x%p\n", path[i].p_idx,
1207 EXT_MAX_INDEX(path[i].p_hdr));
1208 ext4_ext_show_move(inode, path, newblock, i);
1209 if (m) {
1210 memmove(++fidx, path[i].p_idx,
1211 sizeof(struct ext4_extent_idx) * m);
1212 le16_add_cpu(&neh->eh_entries, m);
1213 }
1214 ext4_extent_block_csum_set(inode, neh);
1215 set_buffer_uptodate(bh);
1216 unlock_buffer(bh);
1217
1218 err = ext4_handle_dirty_metadata(handle, inode, bh);
1219 if (err)
1220 goto cleanup;
1221 brelse(bh);
1222 bh = NULL;
1223
1224
1225 if (m) {
1226 err = ext4_ext_get_access(handle, inode, path + i);
1227 if (err)
1228 goto cleanup;
1229 le16_add_cpu(&path[i].p_hdr->eh_entries, -m);
1230 err = ext4_ext_dirty(handle, inode, path + i);
1231 if (err)
1232 goto cleanup;
1233 }
1234
1235 i--;
1236 }
1237
1238
1239 err = ext4_ext_insert_index(handle, inode, path + at,
1240 le32_to_cpu(border), newblock);
1241
1242cleanup:
1243 if (bh) {
1244 if (buffer_locked(bh))
1245 unlock_buffer(bh);
1246 brelse(bh);
1247 }
1248
1249 if (err) {
1250
1251 for (i = 0; i < depth; i++) {
1252 if (!ablocks[i])
1253 continue;
1254 ext4_free_blocks(handle, inode, NULL, ablocks[i], 1,
1255 EXT4_FREE_BLOCKS_METADATA);
1256 }
1257 }
1258 kfree(ablocks);
1259
1260 return err;
1261}
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271static int ext4_ext_grow_indepth(handle_t *handle, struct inode *inode,
1272 unsigned int flags)
1273{
1274 struct ext4_extent_header *neh;
1275 struct buffer_head *bh;
1276 ext4_fsblk_t newblock, goal = 0;
1277 struct ext4_super_block *es = EXT4_SB(inode->i_sb)->s_es;
1278 int err = 0;
1279
1280
1281 if (ext_depth(inode))
1282 goal = ext4_idx_pblock(EXT_FIRST_INDEX(ext_inode_hdr(inode)));
1283 if (goal > le32_to_cpu(es->s_first_data_block)) {
1284 flags |= EXT4_MB_HINT_TRY_GOAL;
1285 goal--;
1286 } else
1287 goal = ext4_inode_to_goal_block(inode);
1288 newblock = ext4_new_meta_blocks(handle, inode, goal, flags,
1289 NULL, &err);
1290 if (newblock == 0)
1291 return err;
1292
1293 bh = sb_getblk_gfp(inode->i_sb, newblock, __GFP_MOVABLE | GFP_NOFS);
1294 if (unlikely(!bh))
1295 return -ENOMEM;
1296 lock_buffer(bh);
1297
1298 err = ext4_journal_get_create_access(handle, bh);
1299 if (err) {
1300 unlock_buffer(bh);
1301 goto out;
1302 }
1303
1304
1305 memmove(bh->b_data, EXT4_I(inode)->i_data,
1306 sizeof(EXT4_I(inode)->i_data));
1307
1308
1309 neh = ext_block_hdr(bh);
1310
1311
1312 if (ext_depth(inode))
1313 neh->eh_max = cpu_to_le16(ext4_ext_space_block_idx(inode, 0));
1314 else
1315 neh->eh_max = cpu_to_le16(ext4_ext_space_block(inode, 0));
1316 neh->eh_magic = EXT4_EXT_MAGIC;
1317 ext4_extent_block_csum_set(inode, neh);
1318 set_buffer_uptodate(bh);
1319 unlock_buffer(bh);
1320
1321 err = ext4_handle_dirty_metadata(handle, inode, bh);
1322 if (err)
1323 goto out;
1324
1325
1326 neh = ext_inode_hdr(inode);
1327 neh->eh_entries = cpu_to_le16(1);
1328 ext4_idx_store_pblock(EXT_FIRST_INDEX(neh), newblock);
1329 if (neh->eh_depth == 0) {
1330
1331 neh->eh_max = cpu_to_le16(ext4_ext_space_root_idx(inode, 0));
1332 EXT_FIRST_INDEX(neh)->ei_block =
1333 EXT_FIRST_EXTENT(neh)->ee_block;
1334 }
1335 ext_debug("new root: num %d(%d), lblock %d, ptr %llu\n",
1336 le16_to_cpu(neh->eh_entries), le16_to_cpu(neh->eh_max),
1337 le32_to_cpu(EXT_FIRST_INDEX(neh)->ei_block),
1338 ext4_idx_pblock(EXT_FIRST_INDEX(neh)));
1339
1340 le16_add_cpu(&neh->eh_depth, 1);
1341 ext4_mark_inode_dirty(handle, inode);
1342out:
1343 brelse(bh);
1344
1345 return err;
1346}
1347
1348
1349
1350
1351
1352
1353static int ext4_ext_create_new_leaf(handle_t *handle, struct inode *inode,
1354 unsigned int mb_flags,
1355 unsigned int gb_flags,
1356 struct ext4_ext_path **ppath,
1357 struct ext4_extent *newext)
1358{
1359 struct ext4_ext_path *path = *ppath;
1360 struct ext4_ext_path *curp;
1361 int depth, i, err = 0;
1362
1363repeat:
1364 i = depth = ext_depth(inode);
1365
1366
1367 curp = path + depth;
1368 while (i > 0 && !EXT_HAS_FREE_INDEX(curp)) {
1369 i--;
1370 curp--;
1371 }
1372
1373
1374
1375 if (EXT_HAS_FREE_INDEX(curp)) {
1376
1377
1378 err = ext4_ext_split(handle, inode, mb_flags, path, newext, i);
1379 if (err)
1380 goto out;
1381
1382
1383 path = ext4_find_extent(inode,
1384 (ext4_lblk_t)le32_to_cpu(newext->ee_block),
1385 ppath, gb_flags);
1386 if (IS_ERR(path))
1387 err = PTR_ERR(path);
1388 } else {
1389
1390 err = ext4_ext_grow_indepth(handle, inode, mb_flags);
1391 if (err)
1392 goto out;
1393
1394
1395 path = ext4_find_extent(inode,
1396 (ext4_lblk_t)le32_to_cpu(newext->ee_block),
1397 ppath, gb_flags);
1398 if (IS_ERR(path)) {
1399 err = PTR_ERR(path);
1400 goto out;
1401 }
1402
1403
1404
1405
1406
1407 depth = ext_depth(inode);
1408 if (path[depth].p_hdr->eh_entries == path[depth].p_hdr->eh_max) {
1409
1410 goto repeat;
1411 }
1412 }
1413
1414out:
1415 return err;
1416}
1417
1418
1419
1420
1421
1422
1423
1424
1425static int ext4_ext_search_left(struct inode *inode,
1426 struct ext4_ext_path *path,
1427 ext4_lblk_t *logical, ext4_fsblk_t *phys)
1428{
1429 struct ext4_extent_idx *ix;
1430 struct ext4_extent *ex;
1431 int depth, ee_len;
1432
1433 if (unlikely(path == NULL)) {
1434 EXT4_ERROR_INODE(inode, "path == NULL *logical %d!", *logical);
1435 return -EFSCORRUPTED;
1436 }
1437 depth = path->p_depth;
1438 *phys = 0;
1439
1440 if (depth == 0 && path->p_ext == NULL)
1441 return 0;
1442
1443
1444
1445
1446
1447 ex = path[depth].p_ext;
1448 ee_len = ext4_ext_get_actual_len(ex);
1449 if (*logical < le32_to_cpu(ex->ee_block)) {
1450 if (unlikely(EXT_FIRST_EXTENT(path[depth].p_hdr) != ex)) {
1451 EXT4_ERROR_INODE(inode,
1452 "EXT_FIRST_EXTENT != ex *logical %d ee_block %d!",
1453 *logical, le32_to_cpu(ex->ee_block));
1454 return -EFSCORRUPTED;
1455 }
1456 while (--depth >= 0) {
1457 ix = path[depth].p_idx;
1458 if (unlikely(ix != EXT_FIRST_INDEX(path[depth].p_hdr))) {
1459 EXT4_ERROR_INODE(inode,
1460 "ix (%d) != EXT_FIRST_INDEX (%d) (depth %d)!",
1461 ix != NULL ? le32_to_cpu(ix->ei_block) : 0,
1462 EXT_FIRST_INDEX(path[depth].p_hdr) != NULL ?
1463 le32_to_cpu(EXT_FIRST_INDEX(path[depth].p_hdr)->ei_block) : 0,
1464 depth);
1465 return -EFSCORRUPTED;
1466 }
1467 }
1468 return 0;
1469 }
1470
1471 if (unlikely(*logical < (le32_to_cpu(ex->ee_block) + ee_len))) {
1472 EXT4_ERROR_INODE(inode,
1473 "logical %d < ee_block %d + ee_len %d!",
1474 *logical, le32_to_cpu(ex->ee_block), ee_len);
1475 return -EFSCORRUPTED;
1476 }
1477
1478 *logical = le32_to_cpu(ex->ee_block) + ee_len - 1;
1479 *phys = ext4_ext_pblock(ex) + ee_len - 1;
1480 return 0;
1481}
1482
1483
1484
1485
1486
1487
1488
1489
1490static int ext4_ext_search_right(struct inode *inode,
1491 struct ext4_ext_path *path,
1492 ext4_lblk_t *logical, ext4_fsblk_t *phys,
1493 struct ext4_extent **ret_ex)
1494{
1495 struct buffer_head *bh = NULL;
1496 struct ext4_extent_header *eh;
1497 struct ext4_extent_idx *ix;
1498 struct ext4_extent *ex;
1499 ext4_fsblk_t block;
1500 int depth;
1501 int ee_len;
1502
1503 if (unlikely(path == NULL)) {
1504 EXT4_ERROR_INODE(inode, "path == NULL *logical %d!", *logical);
1505 return -EFSCORRUPTED;
1506 }
1507 depth = path->p_depth;
1508 *phys = 0;
1509
1510 if (depth == 0 && path->p_ext == NULL)
1511 return 0;
1512
1513
1514
1515
1516
1517 ex = path[depth].p_ext;
1518 ee_len = ext4_ext_get_actual_len(ex);
1519 if (*logical < le32_to_cpu(ex->ee_block)) {
1520 if (unlikely(EXT_FIRST_EXTENT(path[depth].p_hdr) != ex)) {
1521 EXT4_ERROR_INODE(inode,
1522 "first_extent(path[%d].p_hdr) != ex",
1523 depth);
1524 return -EFSCORRUPTED;
1525 }
1526 while (--depth >= 0) {
1527 ix = path[depth].p_idx;
1528 if (unlikely(ix != EXT_FIRST_INDEX(path[depth].p_hdr))) {
1529 EXT4_ERROR_INODE(inode,
1530 "ix != EXT_FIRST_INDEX *logical %d!",
1531 *logical);
1532 return -EFSCORRUPTED;
1533 }
1534 }
1535 goto found_extent;
1536 }
1537
1538 if (unlikely(*logical < (le32_to_cpu(ex->ee_block) + ee_len))) {
1539 EXT4_ERROR_INODE(inode,
1540 "logical %d < ee_block %d + ee_len %d!",
1541 *logical, le32_to_cpu(ex->ee_block), ee_len);
1542 return -EFSCORRUPTED;
1543 }
1544
1545 if (ex != EXT_LAST_EXTENT(path[depth].p_hdr)) {
1546
1547 ex++;
1548 goto found_extent;
1549 }
1550
1551
1552 while (--depth >= 0) {
1553 ix = path[depth].p_idx;
1554 if (ix != EXT_LAST_INDEX(path[depth].p_hdr))
1555 goto got_index;
1556 }
1557
1558
1559 return 0;
1560
1561got_index:
1562
1563
1564
1565 ix++;
1566 block = ext4_idx_pblock(ix);
1567 while (++depth < path->p_depth) {
1568
1569 bh = read_extent_tree_block(inode, block,
1570 path->p_depth - depth, 0);
1571 if (IS_ERR(bh))
1572 return PTR_ERR(bh);
1573 eh = ext_block_hdr(bh);
1574 ix = EXT_FIRST_INDEX(eh);
1575 block = ext4_idx_pblock(ix);
1576 put_bh(bh);
1577 }
1578
1579 bh = read_extent_tree_block(inode, block, path->p_depth - depth, 0);
1580 if (IS_ERR(bh))
1581 return PTR_ERR(bh);
1582 eh = ext_block_hdr(bh);
1583 ex = EXT_FIRST_EXTENT(eh);
1584found_extent:
1585 *logical = le32_to_cpu(ex->ee_block);
1586 *phys = ext4_ext_pblock(ex);
1587 *ret_ex = ex;
1588 if (bh)
1589 put_bh(bh);
1590 return 0;
1591}
1592
1593
1594
1595
1596
1597
1598
1599
1600ext4_lblk_t
1601ext4_ext_next_allocated_block(struct ext4_ext_path *path)
1602{
1603 int depth;
1604
1605 BUG_ON(path == NULL);
1606 depth = path->p_depth;
1607
1608 if (depth == 0 && path->p_ext == NULL)
1609 return EXT_MAX_BLOCKS;
1610
1611 while (depth >= 0) {
1612 if (depth == path->p_depth) {
1613
1614 if (path[depth].p_ext &&
1615 path[depth].p_ext !=
1616 EXT_LAST_EXTENT(path[depth].p_hdr))
1617 return le32_to_cpu(path[depth].p_ext[1].ee_block);
1618 } else {
1619
1620 if (path[depth].p_idx !=
1621 EXT_LAST_INDEX(path[depth].p_hdr))
1622 return le32_to_cpu(path[depth].p_idx[1].ei_block);
1623 }
1624 depth--;
1625 }
1626
1627 return EXT_MAX_BLOCKS;
1628}
1629
1630
1631
1632
1633
1634static ext4_lblk_t ext4_ext_next_leaf_block(struct ext4_ext_path *path)
1635{
1636 int depth;
1637
1638 BUG_ON(path == NULL);
1639 depth = path->p_depth;
1640
1641
1642 if (depth == 0)
1643 return EXT_MAX_BLOCKS;
1644
1645
1646 depth--;
1647
1648 while (depth >= 0) {
1649 if (path[depth].p_idx !=
1650 EXT_LAST_INDEX(path[depth].p_hdr))
1651 return (ext4_lblk_t)
1652 le32_to_cpu(path[depth].p_idx[1].ei_block);
1653 depth--;
1654 }
1655
1656 return EXT_MAX_BLOCKS;
1657}
1658
1659
1660
1661
1662
1663
1664
1665static int ext4_ext_correct_indexes(handle_t *handle, struct inode *inode,
1666 struct ext4_ext_path *path)
1667{
1668 struct ext4_extent_header *eh;
1669 int depth = ext_depth(inode);
1670 struct ext4_extent *ex;
1671 __le32 border;
1672 int k, err = 0;
1673
1674 eh = path[depth].p_hdr;
1675 ex = path[depth].p_ext;
1676
1677 if (unlikely(ex == NULL || eh == NULL)) {
1678 EXT4_ERROR_INODE(inode,
1679 "ex %p == NULL or eh %p == NULL", ex, eh);
1680 return -EFSCORRUPTED;
1681 }
1682
1683 if (depth == 0) {
1684
1685 return 0;
1686 }
1687
1688 if (ex != EXT_FIRST_EXTENT(eh)) {
1689
1690 return 0;
1691 }
1692
1693
1694
1695
1696 k = depth - 1;
1697 border = path[depth].p_ext->ee_block;
1698 err = ext4_ext_get_access(handle, inode, path + k);
1699 if (err)
1700 return err;
1701 path[k].p_idx->ei_block = border;
1702 err = ext4_ext_dirty(handle, inode, path + k);
1703 if (err)
1704 return err;
1705
1706 while (k--) {
1707
1708 if (path[k+1].p_idx != EXT_FIRST_INDEX(path[k+1].p_hdr))
1709 break;
1710 err = ext4_ext_get_access(handle, inode, path + k);
1711 if (err)
1712 break;
1713 path[k].p_idx->ei_block = border;
1714 err = ext4_ext_dirty(handle, inode, path + k);
1715 if (err)
1716 break;
1717 }
1718
1719 return err;
1720}
1721
1722int
1723ext4_can_extents_be_merged(struct inode *inode, struct ext4_extent *ex1,
1724 struct ext4_extent *ex2)
1725{
1726 unsigned short ext1_ee_len, ext2_ee_len;
1727
1728 if (ext4_ext_is_unwritten(ex1) != ext4_ext_is_unwritten(ex2))
1729 return 0;
1730
1731 ext1_ee_len = ext4_ext_get_actual_len(ex1);
1732 ext2_ee_len = ext4_ext_get_actual_len(ex2);
1733
1734 if (le32_to_cpu(ex1->ee_block) + ext1_ee_len !=
1735 le32_to_cpu(ex2->ee_block))
1736 return 0;
1737
1738
1739
1740
1741
1742
1743 if (ext1_ee_len + ext2_ee_len > EXT_INIT_MAX_LEN)
1744 return 0;
1745
1746
1747
1748
1749
1750
1751 if (ext4_ext_is_unwritten(ex1) &&
1752 (ext4_test_inode_state(inode, EXT4_STATE_DIO_UNWRITTEN) ||
1753 atomic_read(&EXT4_I(inode)->i_unwritten) ||
1754 (ext1_ee_len + ext2_ee_len > EXT_UNWRITTEN_MAX_LEN)))
1755 return 0;
1756#ifdef AGGRESSIVE_TEST
1757 if (ext1_ee_len >= 4)
1758 return 0;
1759#endif
1760
1761 if (ext4_ext_pblock(ex1) + ext1_ee_len == ext4_ext_pblock(ex2))
1762 return 1;
1763 return 0;
1764}
1765
1766
1767
1768
1769
1770
1771
1772
1773static int ext4_ext_try_to_merge_right(struct inode *inode,
1774 struct ext4_ext_path *path,
1775 struct ext4_extent *ex)
1776{
1777 struct ext4_extent_header *eh;
1778 unsigned int depth, len;
1779 int merge_done = 0, unwritten;
1780
1781 depth = ext_depth(inode);
1782 BUG_ON(path[depth].p_hdr == NULL);
1783 eh = path[depth].p_hdr;
1784
1785 while (ex < EXT_LAST_EXTENT(eh)) {
1786 if (!ext4_can_extents_be_merged(inode, ex, ex + 1))
1787 break;
1788
1789 unwritten = ext4_ext_is_unwritten(ex);
1790 ex->ee_len = cpu_to_le16(ext4_ext_get_actual_len(ex)
1791 + ext4_ext_get_actual_len(ex + 1));
1792 if (unwritten)
1793 ext4_ext_mark_unwritten(ex);
1794
1795 if (ex + 1 < EXT_LAST_EXTENT(eh)) {
1796 len = (EXT_LAST_EXTENT(eh) - ex - 1)
1797 * sizeof(struct ext4_extent);
1798 memmove(ex + 1, ex + 2, len);
1799 }
1800 le16_add_cpu(&eh->eh_entries, -1);
1801 merge_done = 1;
1802 WARN_ON(eh->eh_entries == 0);
1803 if (!eh->eh_entries)
1804 EXT4_ERROR_INODE(inode, "eh->eh_entries = 0!");
1805 }
1806
1807 return merge_done;
1808}
1809
1810
1811
1812
1813
1814static void ext4_ext_try_to_merge_up(handle_t *handle,
1815 struct inode *inode,
1816 struct ext4_ext_path *path)
1817{
1818 size_t s;
1819 unsigned max_root = ext4_ext_space_root(inode, 0);
1820 ext4_fsblk_t blk;
1821
1822 if ((path[0].p_depth != 1) ||
1823 (le16_to_cpu(path[0].p_hdr->eh_entries) != 1) ||
1824 (le16_to_cpu(path[1].p_hdr->eh_entries) > max_root))
1825 return;
1826
1827
1828
1829
1830
1831
1832 if (ext4_journal_extend(handle, 2))
1833 return;
1834
1835
1836
1837
1838 blk = ext4_idx_pblock(path[0].p_idx);
1839 s = le16_to_cpu(path[1].p_hdr->eh_entries) *
1840 sizeof(struct ext4_extent_idx);
1841 s += sizeof(struct ext4_extent_header);
1842
1843 path[1].p_maxdepth = path[0].p_maxdepth;
1844 memcpy(path[0].p_hdr, path[1].p_hdr, s);
1845 path[0].p_depth = 0;
1846 path[0].p_ext = EXT_FIRST_EXTENT(path[0].p_hdr) +
1847 (path[1].p_ext - EXT_FIRST_EXTENT(path[1].p_hdr));
1848 path[0].p_hdr->eh_max = cpu_to_le16(max_root);
1849
1850 brelse(path[1].p_bh);
1851 ext4_free_blocks(handle, inode, NULL, blk, 1,
1852 EXT4_FREE_BLOCKS_METADATA | EXT4_FREE_BLOCKS_FORGET);
1853}
1854
1855
1856
1857
1858
1859static void ext4_ext_try_to_merge(handle_t *handle,
1860 struct inode *inode,
1861 struct ext4_ext_path *path,
1862 struct ext4_extent *ex) {
1863 struct ext4_extent_header *eh;
1864 unsigned int depth;
1865 int merge_done = 0;
1866
1867 depth = ext_depth(inode);
1868 BUG_ON(path[depth].p_hdr == NULL);
1869 eh = path[depth].p_hdr;
1870
1871 if (ex > EXT_FIRST_EXTENT(eh))
1872 merge_done = ext4_ext_try_to_merge_right(inode, path, ex - 1);
1873
1874 if (!merge_done)
1875 (void) ext4_ext_try_to_merge_right(inode, path, ex);
1876
1877 ext4_ext_try_to_merge_up(handle, inode, path);
1878}
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888static unsigned int ext4_ext_check_overlap(struct ext4_sb_info *sbi,
1889 struct inode *inode,
1890 struct ext4_extent *newext,
1891 struct ext4_ext_path *path)
1892{
1893 ext4_lblk_t b1, b2;
1894 unsigned int depth, len1;
1895 unsigned int ret = 0;
1896
1897 b1 = le32_to_cpu(newext->ee_block);
1898 len1 = ext4_ext_get_actual_len(newext);
1899 depth = ext_depth(inode);
1900 if (!path[depth].p_ext)
1901 goto out;
1902 b2 = EXT4_LBLK_CMASK(sbi, le32_to_cpu(path[depth].p_ext->ee_block));
1903
1904
1905
1906
1907
1908 if (b2 < b1) {
1909 b2 = ext4_ext_next_allocated_block(path);
1910 if (b2 == EXT_MAX_BLOCKS)
1911 goto out;
1912 b2 = EXT4_LBLK_CMASK(sbi, b2);
1913 }
1914
1915
1916 if (b1 + len1 < b1) {
1917 len1 = EXT_MAX_BLOCKS - b1;
1918 newext->ee_len = cpu_to_le16(len1);
1919 ret = 1;
1920 }
1921
1922
1923 if (b1 + len1 > b2) {
1924 newext->ee_len = cpu_to_le16(b2 - b1);
1925 ret = 1;
1926 }
1927out:
1928 return ret;
1929}
1930
1931
1932
1933
1934
1935
1936
1937int ext4_ext_insert_extent(handle_t *handle, struct inode *inode,
1938 struct ext4_ext_path **ppath,
1939 struct ext4_extent *newext, int gb_flags)
1940{
1941 struct ext4_ext_path *path = *ppath;
1942 struct ext4_extent_header *eh;
1943 struct ext4_extent *ex, *fex;
1944 struct ext4_extent *nearex;
1945 struct ext4_ext_path *npath = NULL;
1946 int depth, len, err;
1947 ext4_lblk_t next;
1948 int mb_flags = 0, unwritten;
1949
1950 if (gb_flags & EXT4_GET_BLOCKS_DELALLOC_RESERVE)
1951 mb_flags |= EXT4_MB_DELALLOC_RESERVED;
1952 if (unlikely(ext4_ext_get_actual_len(newext) == 0)) {
1953 EXT4_ERROR_INODE(inode, "ext4_ext_get_actual_len(newext) == 0");
1954 return -EFSCORRUPTED;
1955 }
1956 depth = ext_depth(inode);
1957 ex = path[depth].p_ext;
1958 eh = path[depth].p_hdr;
1959 if (unlikely(path[depth].p_hdr == NULL)) {
1960 EXT4_ERROR_INODE(inode, "path[%d].p_hdr == NULL", depth);
1961 return -EFSCORRUPTED;
1962 }
1963
1964
1965 if (ex && !(gb_flags & EXT4_GET_BLOCKS_PRE_IO)) {
1966
1967
1968
1969
1970
1971
1972
1973
1974 if (ex < EXT_LAST_EXTENT(eh) &&
1975 (le32_to_cpu(ex->ee_block) +
1976 ext4_ext_get_actual_len(ex) <
1977 le32_to_cpu(newext->ee_block))) {
1978 ex += 1;
1979 goto prepend;
1980 } else if ((ex > EXT_FIRST_EXTENT(eh)) &&
1981 (le32_to_cpu(newext->ee_block) +
1982 ext4_ext_get_actual_len(newext) <
1983 le32_to_cpu(ex->ee_block)))
1984 ex -= 1;
1985
1986
1987 if (ext4_can_extents_be_merged(inode, ex, newext)) {
1988 ext_debug("append [%d]%d block to %u:[%d]%d"
1989 "(from %llu)\n",
1990 ext4_ext_is_unwritten(newext),
1991 ext4_ext_get_actual_len(newext),
1992 le32_to_cpu(ex->ee_block),
1993 ext4_ext_is_unwritten(ex),
1994 ext4_ext_get_actual_len(ex),
1995 ext4_ext_pblock(ex));
1996 err = ext4_ext_get_access(handle, inode,
1997 path + depth);
1998 if (err)
1999 return err;
2000 unwritten = ext4_ext_is_unwritten(ex);
2001 ex->ee_len = cpu_to_le16(ext4_ext_get_actual_len(ex)
2002 + ext4_ext_get_actual_len(newext));
2003 if (unwritten)
2004 ext4_ext_mark_unwritten(ex);
2005 eh = path[depth].p_hdr;
2006 nearex = ex;
2007 goto merge;
2008 }
2009
2010prepend:
2011
2012 if (ext4_can_extents_be_merged(inode, newext, ex)) {
2013 ext_debug("prepend %u[%d]%d block to %u:[%d]%d"
2014 "(from %llu)\n",
2015 le32_to_cpu(newext->ee_block),
2016 ext4_ext_is_unwritten(newext),
2017 ext4_ext_get_actual_len(newext),
2018 le32_to_cpu(ex->ee_block),
2019 ext4_ext_is_unwritten(ex),
2020 ext4_ext_get_actual_len(ex),
2021 ext4_ext_pblock(ex));
2022 err = ext4_ext_get_access(handle, inode,
2023 path + depth);
2024 if (err)
2025 return err;
2026
2027 unwritten = ext4_ext_is_unwritten(ex);
2028 ex->ee_block = newext->ee_block;
2029 ext4_ext_store_pblock(ex, ext4_ext_pblock(newext));
2030 ex->ee_len = cpu_to_le16(ext4_ext_get_actual_len(ex)
2031 + ext4_ext_get_actual_len(newext));
2032 if (unwritten)
2033 ext4_ext_mark_unwritten(ex);
2034 eh = path[depth].p_hdr;
2035 nearex = ex;
2036 goto merge;
2037 }
2038 }
2039
2040 depth = ext_depth(inode);
2041 eh = path[depth].p_hdr;
2042 if (le16_to_cpu(eh->eh_entries) < le16_to_cpu(eh->eh_max))
2043 goto has_space;
2044
2045
2046 fex = EXT_LAST_EXTENT(eh);
2047 next = EXT_MAX_BLOCKS;
2048 if (le32_to_cpu(newext->ee_block) > le32_to_cpu(fex->ee_block))
2049 next = ext4_ext_next_leaf_block(path);
2050 if (next != EXT_MAX_BLOCKS) {
2051 ext_debug("next leaf block - %u\n", next);
2052 BUG_ON(npath != NULL);
2053 npath = ext4_find_extent(inode, next, NULL, 0);
2054 if (IS_ERR(npath))
2055 return PTR_ERR(npath);
2056 BUG_ON(npath->p_depth != path->p_depth);
2057 eh = npath[depth].p_hdr;
2058 if (le16_to_cpu(eh->eh_entries) < le16_to_cpu(eh->eh_max)) {
2059 ext_debug("next leaf isn't full(%d)\n",
2060 le16_to_cpu(eh->eh_entries));
2061 path = npath;
2062 goto has_space;
2063 }
2064 ext_debug("next leaf has no free space(%d,%d)\n",
2065 le16_to_cpu(eh->eh_entries), le16_to_cpu(eh->eh_max));
2066 }
2067
2068
2069
2070
2071
2072 if (gb_flags & EXT4_GET_BLOCKS_METADATA_NOFAIL)
2073 mb_flags |= EXT4_MB_USE_RESERVED;
2074 err = ext4_ext_create_new_leaf(handle, inode, mb_flags, gb_flags,
2075 ppath, newext);
2076 if (err)
2077 goto cleanup;
2078 depth = ext_depth(inode);
2079 eh = path[depth].p_hdr;
2080
2081has_space:
2082 nearex = path[depth].p_ext;
2083
2084 err = ext4_ext_get_access(handle, inode, path + depth);
2085 if (err)
2086 goto cleanup;
2087
2088 if (!nearex) {
2089
2090 ext_debug("first extent in the leaf: %u:%llu:[%d]%d\n",
2091 le32_to_cpu(newext->ee_block),
2092 ext4_ext_pblock(newext),
2093 ext4_ext_is_unwritten(newext),
2094 ext4_ext_get_actual_len(newext));
2095 nearex = EXT_FIRST_EXTENT(eh);
2096 } else {
2097 if (le32_to_cpu(newext->ee_block)
2098 > le32_to_cpu(nearex->ee_block)) {
2099
2100 ext_debug("insert %u:%llu:[%d]%d before: "
2101 "nearest %p\n",
2102 le32_to_cpu(newext->ee_block),
2103 ext4_ext_pblock(newext),
2104 ext4_ext_is_unwritten(newext),
2105 ext4_ext_get_actual_len(newext),
2106 nearex);
2107 nearex++;
2108 } else {
2109
2110 BUG_ON(newext->ee_block == nearex->ee_block);
2111 ext_debug("insert %u:%llu:[%d]%d after: "
2112 "nearest %p\n",
2113 le32_to_cpu(newext->ee_block),
2114 ext4_ext_pblock(newext),
2115 ext4_ext_is_unwritten(newext),
2116 ext4_ext_get_actual_len(newext),
2117 nearex);
2118 }
2119 len = EXT_LAST_EXTENT(eh) - nearex + 1;
2120 if (len > 0) {
2121 ext_debug("insert %u:%llu:[%d]%d: "
2122 "move %d extents from 0x%p to 0x%p\n",
2123 le32_to_cpu(newext->ee_block),
2124 ext4_ext_pblock(newext),
2125 ext4_ext_is_unwritten(newext),
2126 ext4_ext_get_actual_len(newext),
2127 len, nearex, nearex + 1);
2128 memmove(nearex + 1, nearex,
2129 len * sizeof(struct ext4_extent));
2130 }
2131 }
2132
2133 le16_add_cpu(&eh->eh_entries, 1);
2134 path[depth].p_ext = nearex;
2135 nearex->ee_block = newext->ee_block;
2136 ext4_ext_store_pblock(nearex, ext4_ext_pblock(newext));
2137 nearex->ee_len = newext->ee_len;
2138
2139merge:
2140
2141 if (!(gb_flags & EXT4_GET_BLOCKS_PRE_IO))
2142 ext4_ext_try_to_merge(handle, inode, path, nearex);
2143
2144
2145
2146 err = ext4_ext_correct_indexes(handle, inode, path);
2147 if (err)
2148 goto cleanup;
2149
2150 err = ext4_ext_dirty(handle, inode, path + path->p_depth);
2151
2152cleanup:
2153 ext4_ext_drop_refs(npath);
2154 kfree(npath);
2155 return err;
2156}
2157
2158static int ext4_fill_fiemap_extents(struct inode *inode,
2159 ext4_lblk_t block, ext4_lblk_t num,
2160 struct fiemap_extent_info *fieinfo)
2161{
2162 struct ext4_ext_path *path = NULL;
2163 struct ext4_extent *ex;
2164 struct extent_status es;
2165 ext4_lblk_t next, next_del, start = 0, end = 0;
2166 ext4_lblk_t last = block + num;
2167 int exists, depth = 0, err = 0;
2168 unsigned int flags = 0;
2169 unsigned char blksize_bits = inode->i_sb->s_blocksize_bits;
2170
2171 while (block < last && block != EXT_MAX_BLOCKS) {
2172 num = last - block;
2173
2174 down_read(&EXT4_I(inode)->i_data_sem);
2175
2176 path = ext4_find_extent(inode, block, &path, 0);
2177 if (IS_ERR(path)) {
2178 up_read(&EXT4_I(inode)->i_data_sem);
2179 err = PTR_ERR(path);
2180 path = NULL;
2181 break;
2182 }
2183
2184 depth = ext_depth(inode);
2185 if (unlikely(path[depth].p_hdr == NULL)) {
2186 up_read(&EXT4_I(inode)->i_data_sem);
2187 EXT4_ERROR_INODE(inode, "path[%d].p_hdr == NULL", depth);
2188 err = -EFSCORRUPTED;
2189 break;
2190 }
2191 ex = path[depth].p_ext;
2192 next = ext4_ext_next_allocated_block(path);
2193
2194 flags = 0;
2195 exists = 0;
2196 if (!ex) {
2197
2198
2199 start = block;
2200 end = block + num;
2201 } else if (le32_to_cpu(ex->ee_block) > block) {
2202
2203 start = block;
2204 end = le32_to_cpu(ex->ee_block);
2205 if (block + num < end)
2206 end = block + num;
2207 } else if (block >= le32_to_cpu(ex->ee_block)
2208 + ext4_ext_get_actual_len(ex)) {
2209
2210 start = block;
2211 end = block + num;
2212 if (end >= next)
2213 end = next;
2214 } else if (block >= le32_to_cpu(ex->ee_block)) {
2215
2216
2217
2218
2219 start = block;
2220 end = le32_to_cpu(ex->ee_block)
2221 + ext4_ext_get_actual_len(ex);
2222 if (block + num < end)
2223 end = block + num;
2224 exists = 1;
2225 } else {
2226 BUG();
2227 }
2228 BUG_ON(end <= start);
2229
2230 if (!exists) {
2231 es.es_lblk = start;
2232 es.es_len = end - start;
2233 es.es_pblk = 0;
2234 } else {
2235 es.es_lblk = le32_to_cpu(ex->ee_block);
2236 es.es_len = ext4_ext_get_actual_len(ex);
2237 es.es_pblk = ext4_ext_pblock(ex);
2238 if (ext4_ext_is_unwritten(ex))
2239 flags |= FIEMAP_EXTENT_UNWRITTEN;
2240 }
2241
2242
2243
2244
2245
2246
2247 next_del = ext4_find_delayed_extent(inode, &es);
2248 if (!exists && next_del) {
2249 exists = 1;
2250 flags |= (FIEMAP_EXTENT_DELALLOC |
2251 FIEMAP_EXTENT_UNKNOWN);
2252 }
2253 up_read(&EXT4_I(inode)->i_data_sem);
2254
2255 if (unlikely(es.es_len == 0)) {
2256 EXT4_ERROR_INODE(inode, "es.es_len == 0");
2257 err = -EFSCORRUPTED;
2258 break;
2259 }
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272 if (next == next_del && next == EXT_MAX_BLOCKS) {
2273 flags |= FIEMAP_EXTENT_LAST;
2274 if (unlikely(next_del != EXT_MAX_BLOCKS ||
2275 next != EXT_MAX_BLOCKS)) {
2276 EXT4_ERROR_INODE(inode,
2277 "next extent == %u, next "
2278 "delalloc extent = %u",
2279 next, next_del);
2280 err = -EFSCORRUPTED;
2281 break;
2282 }
2283 }
2284
2285 if (exists) {
2286 err = fiemap_fill_next_extent(fieinfo,
2287 (__u64)es.es_lblk << blksize_bits,
2288 (__u64)es.es_pblk << blksize_bits,
2289 (__u64)es.es_len << blksize_bits,
2290 flags);
2291 if (err < 0)
2292 break;
2293 if (err == 1) {
2294 err = 0;
2295 break;
2296 }
2297 }
2298
2299 block = es.es_lblk + es.es_len;
2300 }
2301
2302 ext4_ext_drop_refs(path);
2303 kfree(path);
2304 return err;
2305}
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320static ext4_lblk_t ext4_ext_determine_hole(struct inode *inode,
2321 struct ext4_ext_path *path,
2322 ext4_lblk_t *lblk)
2323{
2324 int depth = ext_depth(inode);
2325 struct ext4_extent *ex;
2326 ext4_lblk_t len;
2327
2328 ex = path[depth].p_ext;
2329 if (ex == NULL) {
2330
2331 *lblk = 0;
2332 len = EXT_MAX_BLOCKS;
2333 } else if (*lblk < le32_to_cpu(ex->ee_block)) {
2334 len = le32_to_cpu(ex->ee_block) - *lblk;
2335 } else if (*lblk >= le32_to_cpu(ex->ee_block)
2336 + ext4_ext_get_actual_len(ex)) {
2337 ext4_lblk_t next;
2338
2339 *lblk = le32_to_cpu(ex->ee_block) + ext4_ext_get_actual_len(ex);
2340 next = ext4_ext_next_allocated_block(path);
2341 BUG_ON(next == *lblk);
2342 len = next - *lblk;
2343 } else {
2344 BUG();
2345 }
2346 return len;
2347}
2348
2349
2350
2351
2352
2353
2354static void
2355ext4_ext_put_gap_in_cache(struct inode *inode, ext4_lblk_t hole_start,
2356 ext4_lblk_t hole_len)
2357{
2358 struct extent_status es;
2359
2360 ext4_es_find_delayed_extent_range(inode, hole_start,
2361 hole_start + hole_len - 1, &es);
2362 if (es.es_len) {
2363
2364 if (es.es_lblk <= hole_start)
2365 return;
2366 hole_len = min(es.es_lblk - hole_start, hole_len);
2367 }
2368 ext_debug(" -> %u:%u\n", hole_start, hole_len);
2369 ext4_es_insert_extent(inode, hole_start, hole_len, ~0,
2370 EXTENT_STATUS_HOLE);
2371}
2372
2373
2374
2375
2376
2377static int ext4_ext_rm_idx(handle_t *handle, struct inode *inode,
2378 struct ext4_ext_path *path, int depth)
2379{
2380 int err;
2381 ext4_fsblk_t leaf;
2382
2383
2384 depth--;
2385 path = path + depth;
2386 leaf = ext4_idx_pblock(path->p_idx);
2387 if (unlikely(path->p_hdr->eh_entries == 0)) {
2388 EXT4_ERROR_INODE(inode, "path->p_hdr->eh_entries == 0");
2389 return -EFSCORRUPTED;
2390 }
2391 err = ext4_ext_get_access(handle, inode, path);
2392 if (err)
2393 return err;
2394
2395 if (path->p_idx != EXT_LAST_INDEX(path->p_hdr)) {
2396 int len = EXT_LAST_INDEX(path->p_hdr) - path->p_idx;
2397 len *= sizeof(struct ext4_extent_idx);
2398 memmove(path->p_idx, path->p_idx + 1, len);
2399 }
2400
2401 le16_add_cpu(&path->p_hdr->eh_entries, -1);
2402 err = ext4_ext_dirty(handle, inode, path);
2403 if (err)
2404 return err;
2405 ext_debug("index is empty, remove it, free block %llu\n", leaf);
2406 trace_ext4_ext_rm_idx(inode, leaf);
2407
2408 ext4_free_blocks(handle, inode, NULL, leaf, 1,
2409 EXT4_FREE_BLOCKS_METADATA | EXT4_FREE_BLOCKS_FORGET);
2410
2411 while (--depth >= 0) {
2412 if (path->p_idx != EXT_FIRST_INDEX(path->p_hdr))
2413 break;
2414 path--;
2415 err = ext4_ext_get_access(handle, inode, path);
2416 if (err)
2417 break;
2418 path->p_idx->ei_block = (path+1)->p_idx->ei_block;
2419 err = ext4_ext_dirty(handle, inode, path);
2420 if (err)
2421 break;
2422 }
2423 return err;
2424}
2425
2426
2427
2428
2429
2430
2431
2432
2433int ext4_ext_calc_credits_for_single_extent(struct inode *inode, int nrblocks,
2434 struct ext4_ext_path *path)
2435{
2436 if (path) {
2437 int depth = ext_depth(inode);
2438 int ret = 0;
2439
2440
2441 if (le16_to_cpu(path[depth].p_hdr->eh_entries)
2442 < le16_to_cpu(path[depth].p_hdr->eh_max)) {
2443
2444
2445
2446
2447
2448
2449
2450
2451
2452
2453 ret = 2 + EXT4_META_TRANS_BLOCKS(inode->i_sb);
2454 return ret;
2455 }
2456 }
2457
2458 return ext4_chunk_trans_blocks(inode, nrblocks);
2459}
2460
2461
2462
2463
2464
2465
2466
2467
2468
2469
2470int ext4_ext_index_trans_blocks(struct inode *inode, int extents)
2471{
2472 int index;
2473 int depth;
2474
2475
2476 if (ext4_has_inline_data(inode))
2477 return 1;
2478
2479 depth = ext_depth(inode);
2480
2481 if (extents <= 1)
2482 index = depth * 2;
2483 else
2484 index = depth * 3;
2485
2486 return index;
2487}
2488
2489static inline int get_default_free_blocks_flags(struct inode *inode)
2490{
2491 if (S_ISDIR(inode->i_mode) || S_ISLNK(inode->i_mode))
2492 return EXT4_FREE_BLOCKS_METADATA | EXT4_FREE_BLOCKS_FORGET;
2493 else if (ext4_should_journal_data(inode))
2494 return EXT4_FREE_BLOCKS_FORGET;
2495 return 0;
2496}
2497
2498static int ext4_remove_blocks(handle_t *handle, struct inode *inode,
2499 struct ext4_extent *ex,
2500 long long *partial_cluster,
2501 ext4_lblk_t from, ext4_lblk_t to)
2502{
2503 struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb);
2504 unsigned short ee_len = ext4_ext_get_actual_len(ex);
2505 ext4_fsblk_t pblk;
2506 int flags = get_default_free_blocks_flags(inode);
2507
2508
2509
2510
2511
2512
2513
2514
2515 flags |= EXT4_FREE_BLOCKS_NOFREE_FIRST_CLUSTER;
2516
2517 trace_ext4_remove_blocks(inode, ex, from, to, *partial_cluster);
2518
2519
2520
2521
2522
2523 pblk = ext4_ext_pblock(ex) + ee_len - 1;
2524 if (*partial_cluster > 0 &&
2525 *partial_cluster != (long long) EXT4_B2C(sbi, pblk)) {
2526 ext4_free_blocks(handle, inode, NULL,
2527 EXT4_C2B(sbi, *partial_cluster),
2528 sbi->s_cluster_ratio, flags);
2529 *partial_cluster = 0;
2530 }
2531
2532#ifdef EXTENTS_STATS
2533 {
2534 struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb);
2535 spin_lock(&sbi->s_ext_stats_lock);
2536 sbi->s_ext_blocks += ee_len;
2537 sbi->s_ext_extents++;
2538 if (ee_len < sbi->s_ext_min)
2539 sbi->s_ext_min = ee_len;
2540 if (ee_len > sbi->s_ext_max)
2541 sbi->s_ext_max = ee_len;
2542 if (ext_depth(inode) > sbi->s_depth_max)
2543 sbi->s_depth_max = ext_depth(inode);
2544 spin_unlock(&sbi->s_ext_stats_lock);
2545 }
2546#endif
2547 if (from >= le32_to_cpu(ex->ee_block)
2548 && to == le32_to_cpu(ex->ee_block) + ee_len - 1) {
2549
2550 ext4_lblk_t num;
2551 long long first_cluster;
2552
2553 num = le32_to_cpu(ex->ee_block) + ee_len - from;
2554 pblk = ext4_ext_pblock(ex) + ee_len - num;
2555
2556
2557
2558
2559
2560 if (*partial_cluster < 0 &&
2561 *partial_cluster == -(long long) EXT4_B2C(sbi, pblk+num-1))
2562 flags |= EXT4_FREE_BLOCKS_NOFREE_LAST_CLUSTER;
2563
2564 ext_debug("free last %u blocks starting %llu partial %lld\n",
2565 num, pblk, *partial_cluster);
2566 ext4_free_blocks(handle, inode, NULL, pblk, num, flags);
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583 if (EXT4_PBLK_COFF(sbi, pblk) && ee_len == num) {
2584 first_cluster = (long long) EXT4_B2C(sbi, pblk);
2585 if (first_cluster != -*partial_cluster)
2586 *partial_cluster = first_cluster;
2587 } else {
2588 *partial_cluster = 0;
2589 }
2590 } else
2591 ext4_error(sbi->s_sb, "strange request: removal(2) "
2592 "%u-%u from %u:%u",
2593 from, to, le32_to_cpu(ex->ee_block), ee_len);
2594 return 0;
2595}
2596
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613static int
2614ext4_ext_rm_leaf(handle_t *handle, struct inode *inode,
2615 struct ext4_ext_path *path,
2616 long long *partial_cluster,
2617 ext4_lblk_t start, ext4_lblk_t end)
2618{
2619 struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb);
2620 int err = 0, correct_index = 0;
2621 int depth = ext_depth(inode), credits;
2622 struct ext4_extent_header *eh;
2623 ext4_lblk_t a, b;
2624 unsigned num;
2625 ext4_lblk_t ex_ee_block;
2626 unsigned short ex_ee_len;
2627 unsigned unwritten = 0;
2628 struct ext4_extent *ex;
2629 ext4_fsblk_t pblk;
2630
2631
2632 ext_debug("truncate since %u in leaf to %u\n", start, end);
2633 if (!path[depth].p_hdr)
2634 path[depth].p_hdr = ext_block_hdr(path[depth].p_bh);
2635 eh = path[depth].p_hdr;
2636 if (unlikely(path[depth].p_hdr == NULL)) {
2637 EXT4_ERROR_INODE(inode, "path[%d].p_hdr == NULL", depth);
2638 return -EFSCORRUPTED;
2639 }
2640
2641 ex = path[depth].p_ext;
2642 if (!ex)
2643 ex = EXT_LAST_EXTENT(eh);
2644
2645 ex_ee_block = le32_to_cpu(ex->ee_block);
2646 ex_ee_len = ext4_ext_get_actual_len(ex);
2647
2648 trace_ext4_ext_rm_leaf(inode, start, ex, *partial_cluster);
2649
2650 while (ex >= EXT_FIRST_EXTENT(eh) &&
2651 ex_ee_block + ex_ee_len > start) {
2652
2653 if (ext4_ext_is_unwritten(ex))
2654 unwritten = 1;
2655 else
2656 unwritten = 0;
2657
2658 ext_debug("remove ext %u:[%d]%d\n", ex_ee_block,
2659 unwritten, ex_ee_len);
2660 path[depth].p_ext = ex;
2661
2662 a = ex_ee_block > start ? ex_ee_block : start;
2663 b = ex_ee_block+ex_ee_len - 1 < end ?
2664 ex_ee_block+ex_ee_len - 1 : end;
2665
2666 ext_debug(" border %u:%u\n", a, b);
2667
2668
2669 if (end < ex_ee_block) {
2670
2671
2672
2673
2674
2675
2676
2677 if (sbi->s_cluster_ratio > 1) {
2678 pblk = ext4_ext_pblock(ex);
2679 *partial_cluster =
2680 -(long long) EXT4_B2C(sbi, pblk);
2681 }
2682 ex--;
2683 ex_ee_block = le32_to_cpu(ex->ee_block);
2684 ex_ee_len = ext4_ext_get_actual_len(ex);
2685 continue;
2686 } else if (b != ex_ee_block + ex_ee_len - 1) {
2687 EXT4_ERROR_INODE(inode,
2688 "can not handle truncate %u:%u "
2689 "on extent %u:%u",
2690 start, end, ex_ee_block,
2691 ex_ee_block + ex_ee_len - 1);
2692 err = -EFSCORRUPTED;
2693 goto out;
2694 } else if (a != ex_ee_block) {
2695
2696 num = a - ex_ee_block;
2697 } else {
2698
2699 num = 0;
2700 }
2701
2702
2703
2704
2705
2706
2707 credits = 7 + 2*(ex_ee_len/EXT4_BLOCKS_PER_GROUP(inode->i_sb));
2708 if (ex == EXT_FIRST_EXTENT(eh)) {
2709 correct_index = 1;
2710 credits += (ext_depth(inode)) + 1;
2711 }
2712 credits += EXT4_MAXQUOTAS_TRANS_BLOCKS(inode->i_sb);
2713
2714 err = ext4_ext_truncate_extend_restart(handle, inode, credits);
2715 if (err)
2716 goto out;
2717
2718 err = ext4_ext_get_access(handle, inode, path + depth);
2719 if (err)
2720 goto out;
2721
2722 err = ext4_remove_blocks(handle, inode, ex, partial_cluster,
2723 a, b);
2724 if (err)
2725 goto out;
2726
2727 if (num == 0)
2728
2729 ext4_ext_store_pblock(ex, 0);
2730
2731 ex->ee_len = cpu_to_le16(num);
2732
2733
2734
2735
2736 if (unwritten && num)
2737 ext4_ext_mark_unwritten(ex);
2738
2739
2740
2741
2742 if (num == 0) {
2743 if (end != EXT_MAX_BLOCKS - 1) {
2744
2745
2746
2747
2748
2749 memmove(ex, ex+1, (EXT_LAST_EXTENT(eh) - ex) *
2750 sizeof(struct ext4_extent));
2751
2752
2753 memset(EXT_LAST_EXTENT(eh), 0,
2754 sizeof(struct ext4_extent));
2755 }
2756 le16_add_cpu(&eh->eh_entries, -1);
2757 }
2758
2759 err = ext4_ext_dirty(handle, inode, path + depth);
2760 if (err)
2761 goto out;
2762
2763 ext_debug("new extent: %u:%u:%llu\n", ex_ee_block, num,
2764 ext4_ext_pblock(ex));
2765 ex--;
2766 ex_ee_block = le32_to_cpu(ex->ee_block);
2767 ex_ee_len = ext4_ext_get_actual_len(ex);
2768 }
2769
2770 if (correct_index && eh->eh_entries)
2771 err = ext4_ext_correct_indexes(handle, inode, path);
2772
2773
2774
2775
2776
2777
2778
2779
2780 if (*partial_cluster > 0 && ex >= EXT_FIRST_EXTENT(eh)) {
2781 pblk = ext4_ext_pblock(ex) + ex_ee_len - 1;
2782 if (*partial_cluster != (long long) EXT4_B2C(sbi, pblk)) {
2783 ext4_free_blocks(handle, inode, NULL,
2784 EXT4_C2B(sbi, *partial_cluster),
2785 sbi->s_cluster_ratio,
2786 get_default_free_blocks_flags(inode));
2787 }
2788 *partial_cluster = 0;
2789 }
2790
2791
2792
2793 if (err == 0 && eh->eh_entries == 0 && path[depth].p_bh != NULL)
2794 err = ext4_ext_rm_idx(handle, inode, path, depth);
2795
2796out:
2797 return err;
2798}
2799
2800
2801
2802
2803
2804static int
2805ext4_ext_more_to_rm(struct ext4_ext_path *path)
2806{
2807 BUG_ON(path->p_idx == NULL);
2808
2809 if (path->p_idx < EXT_FIRST_INDEX(path->p_hdr))
2810 return 0;
2811
2812
2813
2814
2815
2816 if (le16_to_cpu(path->p_hdr->eh_entries) == path->p_block)
2817 return 0;
2818 return 1;
2819}
2820
2821int ext4_ext_remove_space(struct inode *inode, ext4_lblk_t start,
2822 ext4_lblk_t end)
2823{
2824 struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb);
2825 int depth = ext_depth(inode);
2826 struct ext4_ext_path *path = NULL;
2827 long long partial_cluster = 0;
2828 handle_t *handle;
2829 int i = 0, err = 0;
2830
2831 ext_debug("truncate since %u to %u\n", start, end);
2832
2833
2834 handle = ext4_journal_start(inode, EXT4_HT_TRUNCATE, depth + 1);
2835 if (IS_ERR(handle))
2836 return PTR_ERR(handle);
2837
2838again:
2839 trace_ext4_ext_remove_space(inode, start, end, depth);
2840
2841
2842
2843
2844
2845
2846
2847
2848 if (end < EXT_MAX_BLOCKS - 1) {
2849 struct ext4_extent *ex;
2850 ext4_lblk_t ee_block, ex_end, lblk;
2851 ext4_fsblk_t pblk;
2852
2853
2854 path = ext4_find_extent(inode, end, NULL, EXT4_EX_NOCACHE);
2855 if (IS_ERR(path)) {
2856 ext4_journal_stop(handle);
2857 return PTR_ERR(path);
2858 }
2859 depth = ext_depth(inode);
2860
2861 ex = path[depth].p_ext;
2862 if (!ex) {
2863 if (depth) {
2864 EXT4_ERROR_INODE(inode,
2865 "path[%d].p_hdr == NULL",
2866 depth);
2867 err = -EFSCORRUPTED;
2868 }
2869 goto out;
2870 }
2871
2872 ee_block = le32_to_cpu(ex->ee_block);
2873 ex_end = ee_block + ext4_ext_get_actual_len(ex) - 1;
2874
2875
2876
2877
2878
2879
2880
2881 if (end >= ee_block && end < ex_end) {
2882
2883
2884
2885
2886
2887
2888 if (sbi->s_cluster_ratio > 1) {
2889 pblk = ext4_ext_pblock(ex) + end - ee_block + 2;
2890 partial_cluster =
2891 -(long long) EXT4_B2C(sbi, pblk);
2892 }
2893
2894
2895
2896
2897
2898
2899
2900 err = ext4_force_split_extent_at(handle, inode, &path,
2901 end + 1, 1);
2902 if (err < 0)
2903 goto out;
2904
2905 } else if (sbi->s_cluster_ratio > 1 && end >= ex_end) {
2906
2907
2908
2909
2910
2911
2912
2913
2914 lblk = ex_end + 1;
2915 err = ext4_ext_search_right(inode, path, &lblk, &pblk,
2916 &ex);
2917 if (err)
2918 goto out;
2919 if (pblk)
2920 partial_cluster =
2921 -(long long) EXT4_B2C(sbi, pblk);
2922 }
2923 }
2924
2925
2926
2927
2928 depth = ext_depth(inode);
2929 if (path) {
2930 int k = i = depth;
2931 while (--k > 0)
2932 path[k].p_block =
2933 le16_to_cpu(path[k].p_hdr->eh_entries)+1;
2934 } else {
2935 path = kzalloc(sizeof(struct ext4_ext_path) * (depth + 1),
2936 GFP_NOFS);
2937 if (path == NULL) {
2938 ext4_journal_stop(handle);
2939 return -ENOMEM;
2940 }
2941 path[0].p_maxdepth = path[0].p_depth = depth;
2942 path[0].p_hdr = ext_inode_hdr(inode);
2943 i = 0;
2944
2945 if (ext4_ext_check(inode, path[0].p_hdr, depth, 0)) {
2946 err = -EFSCORRUPTED;
2947 goto out;
2948 }
2949 }
2950 err = 0;
2951
2952 while (i >= 0 && err == 0) {
2953 if (i == depth) {
2954
2955 err = ext4_ext_rm_leaf(handle, inode, path,
2956 &partial_cluster, start,
2957 end);
2958
2959 brelse(path[i].p_bh);
2960 path[i].p_bh = NULL;
2961 i--;
2962 continue;
2963 }
2964
2965
2966 if (!path[i].p_hdr) {
2967 ext_debug("initialize header\n");
2968 path[i].p_hdr = ext_block_hdr(path[i].p_bh);
2969 }
2970
2971 if (!path[i].p_idx) {
2972
2973 path[i].p_idx = EXT_LAST_INDEX(path[i].p_hdr);
2974 path[i].p_block = le16_to_cpu(path[i].p_hdr->eh_entries)+1;
2975 ext_debug("init index ptr: hdr 0x%p, num %d\n",
2976 path[i].p_hdr,
2977 le16_to_cpu(path[i].p_hdr->eh_entries));
2978 } else {
2979
2980 path[i].p_idx--;
2981 }
2982
2983 ext_debug("level %d - index, first 0x%p, cur 0x%p\n",
2984 i, EXT_FIRST_INDEX(path[i].p_hdr),
2985 path[i].p_idx);
2986 if (ext4_ext_more_to_rm(path + i)) {
2987 struct buffer_head *bh;
2988
2989 ext_debug("move to level %d (block %llu)\n",
2990 i + 1, ext4_idx_pblock(path[i].p_idx));
2991 memset(path + i + 1, 0, sizeof(*path));
2992 bh = read_extent_tree_block(inode,
2993 ext4_idx_pblock(path[i].p_idx), depth - i - 1,
2994 EXT4_EX_NOCACHE);
2995 if (IS_ERR(bh)) {
2996
2997 err = PTR_ERR(bh);
2998 break;
2999 }
3000
3001
3002 cond_resched();
3003 if (WARN_ON(i + 1 > depth)) {
3004 err = -EFSCORRUPTED;
3005 break;
3006 }
3007 path[i + 1].p_bh = bh;
3008
3009
3010
3011 path[i].p_block = le16_to_cpu(path[i].p_hdr->eh_entries);
3012 i++;
3013 } else {
3014
3015 if (path[i].p_hdr->eh_entries == 0 && i > 0) {
3016
3017
3018
3019 err = ext4_ext_rm_idx(handle, inode, path, i);
3020 }
3021
3022 brelse(path[i].p_bh);
3023 path[i].p_bh = NULL;
3024 i--;
3025 ext_debug("return to level %d\n", i);
3026 }
3027 }
3028
3029 trace_ext4_ext_remove_space_done(inode, start, end, depth,
3030 partial_cluster, path->p_hdr->eh_entries);
3031
3032
3033
3034
3035
3036
3037
3038 if (partial_cluster > 0 && err == 0) {
3039
3040 ext4_free_blocks(handle, inode, NULL,
3041 EXT4_C2B(sbi, partial_cluster),
3042 sbi->s_cluster_ratio,
3043 get_default_free_blocks_flags(inode));
3044 }
3045
3046
3047 if (path->p_hdr->eh_entries == 0) {
3048
3049
3050
3051
3052 err = ext4_ext_get_access(handle, inode, path);
3053 if (err == 0) {
3054 ext_inode_hdr(inode)->eh_depth = 0;
3055 ext_inode_hdr(inode)->eh_max =
3056 cpu_to_le16(ext4_ext_space_root(inode, 0));
3057 err = ext4_ext_dirty(handle, inode, path);
3058 }
3059 }
3060out:
3061 ext4_ext_drop_refs(path);
3062 kfree(path);
3063 path = NULL;
3064 if (err == -EAGAIN)
3065 goto again;
3066 ext4_journal_stop(handle);
3067
3068 return err;
3069}
3070
3071
3072
3073
3074void ext4_ext_init(struct super_block *sb)
3075{
3076
3077
3078
3079
3080 if (ext4_has_feature_extents(sb)) {
3081#if defined(AGGRESSIVE_TEST) || defined(CHECK_BINSEARCH) || defined(EXTENTS_STATS)
3082 printk(KERN_INFO "EXT4-fs: file extents enabled"
3083#ifdef AGGRESSIVE_TEST
3084 ", aggressive tests"
3085#endif
3086#ifdef CHECK_BINSEARCH
3087 ", check binsearch"
3088#endif
3089#ifdef EXTENTS_STATS
3090 ", stats"
3091#endif
3092 "\n");
3093#endif
3094#ifdef EXTENTS_STATS
3095 spin_lock_init(&EXT4_SB(sb)->s_ext_stats_lock);
3096 EXT4_SB(sb)->s_ext_min = 1 << 30;
3097 EXT4_SB(sb)->s_ext_max = 0;
3098#endif
3099 }
3100}
3101
3102
3103
3104
3105void ext4_ext_release(struct super_block *sb)
3106{
3107 if (!ext4_has_feature_extents(sb))
3108 return;
3109
3110#ifdef EXTENTS_STATS
3111 if (EXT4_SB(sb)->s_ext_blocks && EXT4_SB(sb)->s_ext_extents) {
3112 struct ext4_sb_info *sbi = EXT4_SB(sb);
3113 printk(KERN_ERR "EXT4-fs: %lu blocks in %lu extents (%lu ave)\n",
3114 sbi->s_ext_blocks, sbi->s_ext_extents,
3115 sbi->s_ext_blocks / sbi->s_ext_extents);
3116 printk(KERN_ERR "EXT4-fs: extents: %lu min, %lu max, max depth %lu\n",
3117 sbi->s_ext_min, sbi->s_ext_max, sbi->s_depth_max);
3118 }
3119#endif
3120}
3121
3122static int ext4_zeroout_es(struct inode *inode, struct ext4_extent *ex)
3123{
3124 ext4_lblk_t ee_block;
3125 ext4_fsblk_t ee_pblock;
3126 unsigned int ee_len;
3127
3128 ee_block = le32_to_cpu(ex->ee_block);
3129 ee_len = ext4_ext_get_actual_len(ex);
3130 ee_pblock = ext4_ext_pblock(ex);
3131
3132 if (ee_len == 0)
3133 return 0;
3134
3135 return ext4_es_insert_extent(inode, ee_block, ee_len, ee_pblock,
3136 EXTENT_STATUS_WRITTEN);
3137}
3138
3139
3140static int ext4_ext_zeroout(struct inode *inode, struct ext4_extent *ex)
3141{
3142 ext4_fsblk_t ee_pblock;
3143 unsigned int ee_len;
3144
3145 ee_len = ext4_ext_get_actual_len(ex);
3146 ee_pblock = ext4_ext_pblock(ex);
3147 return ext4_issue_zeroout(inode, le32_to_cpu(ex->ee_block), ee_pblock,
3148 ee_len);
3149}
3150
3151
3152
3153
3154
3155
3156
3157
3158
3159
3160
3161
3162
3163
3164
3165
3166
3167
3168
3169
3170
3171
3172static int ext4_split_extent_at(handle_t *handle,
3173 struct inode *inode,
3174 struct ext4_ext_path **ppath,
3175 ext4_lblk_t split,
3176 int split_flag,
3177 int flags)
3178{
3179 struct ext4_ext_path *path = *ppath;
3180 ext4_fsblk_t newblock;
3181 ext4_lblk_t ee_block;
3182 struct ext4_extent *ex, newex, orig_ex, zero_ex;
3183 struct ext4_extent *ex2 = NULL;
3184 unsigned int ee_len, depth;
3185 int err = 0;
3186
3187 BUG_ON((split_flag & (EXT4_EXT_DATA_VALID1 | EXT4_EXT_DATA_VALID2)) ==
3188 (EXT4_EXT_DATA_VALID1 | EXT4_EXT_DATA_VALID2));
3189
3190 ext_debug("ext4_split_extents_at: inode %lu, logical"
3191 "block %llu\n", inode->i_ino, (unsigned long long)split);
3192
3193 ext4_ext_show_leaf(inode, path);
3194
3195 depth = ext_depth(inode);
3196 ex = path[depth].p_ext;
3197 ee_block = le32_to_cpu(ex->ee_block);
3198 ee_len = ext4_ext_get_actual_len(ex);
3199 newblock = split - ee_block + ext4_ext_pblock(ex);
3200
3201 BUG_ON(split < ee_block || split >= (ee_block + ee_len));
3202 BUG_ON(!ext4_ext_is_unwritten(ex) &&
3203 split_flag & (EXT4_EXT_MAY_ZEROOUT |
3204 EXT4_EXT_MARK_UNWRIT1 |
3205 EXT4_EXT_MARK_UNWRIT2));
3206
3207 err = ext4_ext_get_access(handle, inode, path + depth);
3208 if (err)
3209 goto out;
3210
3211 if (split == ee_block) {
3212
3213
3214
3215
3216
3217 if (split_flag & EXT4_EXT_MARK_UNWRIT2)
3218 ext4_ext_mark_unwritten(ex);
3219 else
3220 ext4_ext_mark_initialized(ex);
3221
3222 if (!(flags & EXT4_GET_BLOCKS_PRE_IO))
3223 ext4_ext_try_to_merge(handle, inode, path, ex);
3224
3225 err = ext4_ext_dirty(handle, inode, path + path->p_depth);
3226 goto out;
3227 }
3228
3229
3230 memcpy(&orig_ex, ex, sizeof(orig_ex));
3231 ex->ee_len = cpu_to_le16(split - ee_block);
3232 if (split_flag & EXT4_EXT_MARK_UNWRIT1)
3233 ext4_ext_mark_unwritten(ex);
3234
3235
3236
3237
3238
3239 err = ext4_ext_dirty(handle, inode, path + depth);
3240 if (err)
3241 goto fix_extent_len;
3242
3243 ex2 = &newex;
3244 ex2->ee_block = cpu_to_le32(split);
3245 ex2->ee_len = cpu_to_le16(ee_len - (split - ee_block));
3246 ext4_ext_store_pblock(ex2, newblock);
3247 if (split_flag & EXT4_EXT_MARK_UNWRIT2)
3248 ext4_ext_mark_unwritten(ex2);
3249
3250 err = ext4_ext_insert_extent(handle, inode, ppath, &newex, flags);
3251 if (err == -ENOSPC && (EXT4_EXT_MAY_ZEROOUT & split_flag)) {
3252 if (split_flag & (EXT4_EXT_DATA_VALID1|EXT4_EXT_DATA_VALID2)) {
3253 if (split_flag & EXT4_EXT_DATA_VALID1) {
3254 err = ext4_ext_zeroout(inode, ex2);
3255 zero_ex.ee_block = ex2->ee_block;
3256 zero_ex.ee_len = cpu_to_le16(
3257 ext4_ext_get_actual_len(ex2));
3258 ext4_ext_store_pblock(&zero_ex,
3259 ext4_ext_pblock(ex2));
3260 } else {
3261 err = ext4_ext_zeroout(inode, ex);
3262 zero_ex.ee_block = ex->ee_block;
3263 zero_ex.ee_len = cpu_to_le16(
3264 ext4_ext_get_actual_len(ex));
3265 ext4_ext_store_pblock(&zero_ex,
3266 ext4_ext_pblock(ex));
3267 }
3268 } else {
3269 err = ext4_ext_zeroout(inode, &orig_ex);
3270 zero_ex.ee_block = orig_ex.ee_block;
3271 zero_ex.ee_len = cpu_to_le16(
3272 ext4_ext_get_actual_len(&orig_ex));
3273 ext4_ext_store_pblock(&zero_ex,
3274 ext4_ext_pblock(&orig_ex));
3275 }
3276
3277 if (err)
3278 goto fix_extent_len;
3279
3280 ex->ee_len = cpu_to_le16(ee_len);
3281 ext4_ext_try_to_merge(handle, inode, path, ex);
3282 err = ext4_ext_dirty(handle, inode, path + path->p_depth);
3283 if (err)
3284 goto fix_extent_len;
3285
3286
3287 err = ext4_zeroout_es(inode, &zero_ex);
3288
3289 goto out;
3290 } else if (err)
3291 goto fix_extent_len;
3292
3293out:
3294 ext4_ext_show_leaf(inode, path);
3295 return err;
3296
3297fix_extent_len:
3298 ex->ee_len = orig_ex.ee_len;
3299 ext4_ext_dirty(handle, inode, path + path->p_depth);
3300 return err;
3301}
3302
3303
3304
3305
3306
3307
3308
3309
3310
3311
3312
3313
3314static int ext4_split_extent(handle_t *handle,
3315 struct inode *inode,
3316 struct ext4_ext_path **ppath,
3317 struct ext4_map_blocks *map,
3318 int split_flag,
3319 int flags)
3320{
3321 struct ext4_ext_path *path = *ppath;
3322 ext4_lblk_t ee_block;
3323 struct ext4_extent *ex;
3324 unsigned int ee_len, depth;
3325 int err = 0;
3326 int unwritten;
3327 int split_flag1, flags1;
3328 int allocated = map->m_len;
3329
3330 depth = ext_depth(inode);
3331 ex = path[depth].p_ext;
3332 ee_block = le32_to_cpu(ex->ee_block);
3333 ee_len = ext4_ext_get_actual_len(ex);
3334 unwritten = ext4_ext_is_unwritten(ex);
3335
3336 if (map->m_lblk + map->m_len < ee_block + ee_len) {
3337 split_flag1 = split_flag & EXT4_EXT_MAY_ZEROOUT;
3338 flags1 = flags | EXT4_GET_BLOCKS_PRE_IO;
3339 if (unwritten)
3340 split_flag1 |= EXT4_EXT_MARK_UNWRIT1 |
3341 EXT4_EXT_MARK_UNWRIT2;
3342 if (split_flag & EXT4_EXT_DATA_VALID2)
3343 split_flag1 |= EXT4_EXT_DATA_VALID1;
3344 err = ext4_split_extent_at(handle, inode, ppath,
3345 map->m_lblk + map->m_len, split_flag1, flags1);
3346 if (err)
3347 goto out;
3348 } else {
3349 allocated = ee_len - (map->m_lblk - ee_block);
3350 }
3351
3352
3353
3354
3355 path = ext4_find_extent(inode, map->m_lblk, ppath, 0);
3356 if (IS_ERR(path))
3357 return PTR_ERR(path);
3358 depth = ext_depth(inode);
3359 ex = path[depth].p_ext;
3360 if (!ex) {
3361 EXT4_ERROR_INODE(inode, "unexpected hole at %lu",
3362 (unsigned long) map->m_lblk);
3363 return -EFSCORRUPTED;
3364 }
3365 unwritten = ext4_ext_is_unwritten(ex);
3366 split_flag1 = 0;
3367
3368 if (map->m_lblk >= ee_block) {
3369 split_flag1 = split_flag & EXT4_EXT_DATA_VALID2;
3370 if (unwritten) {
3371 split_flag1 |= EXT4_EXT_MARK_UNWRIT1;
3372 split_flag1 |= split_flag & (EXT4_EXT_MAY_ZEROOUT |
3373 EXT4_EXT_MARK_UNWRIT2);
3374 }
3375 err = ext4_split_extent_at(handle, inode, ppath,
3376 map->m_lblk, split_flag1, flags);
3377 if (err)
3378 goto out;
3379 }
3380
3381 ext4_ext_show_leaf(inode, path);
3382out:
3383 return err ? err : allocated;
3384}
3385
3386
3387
3388
3389
3390
3391
3392
3393
3394
3395
3396
3397
3398
3399
3400
3401
3402
3403
3404
3405
3406static int ext4_ext_convert_to_initialized(handle_t *handle,
3407 struct inode *inode,
3408 struct ext4_map_blocks *map,
3409 struct ext4_ext_path **ppath,
3410 int flags)
3411{
3412 struct ext4_ext_path *path = *ppath;
3413 struct ext4_sb_info *sbi;
3414 struct ext4_extent_header *eh;
3415 struct ext4_map_blocks split_map;
3416 struct ext4_extent zero_ex;
3417 struct ext4_extent *ex, *abut_ex;
3418 ext4_lblk_t ee_block, eof_block;
3419 unsigned int ee_len, depth, map_len = map->m_len;
3420 int allocated = 0, max_zeroout = 0;
3421 int err = 0;
3422 int split_flag = 0;
3423
3424 ext_debug("ext4_ext_convert_to_initialized: inode %lu, logical"
3425 "block %llu, max_blocks %u\n", inode->i_ino,
3426 (unsigned long long)map->m_lblk, map_len);
3427
3428 sbi = EXT4_SB(inode->i_sb);
3429 eof_block = (inode->i_size + inode->i_sb->s_blocksize - 1) >>
3430 inode->i_sb->s_blocksize_bits;
3431 if (eof_block < map->m_lblk + map_len)
3432 eof_block = map->m_lblk + map_len;
3433
3434 depth = ext_depth(inode);
3435 eh = path[depth].p_hdr;
3436 ex = path[depth].p_ext;
3437 ee_block = le32_to_cpu(ex->ee_block);
3438 ee_len = ext4_ext_get_actual_len(ex);
3439 zero_ex.ee_len = 0;
3440
3441 trace_ext4_ext_convert_to_initialized_enter(inode, map, ex);
3442
3443
3444 BUG_ON(!ext4_ext_is_unwritten(ex));
3445 BUG_ON(!in_range(map->m_lblk, ee_block, ee_len));
3446
3447
3448
3449
3450
3451
3452
3453
3454
3455
3456
3457
3458
3459
3460
3461
3462 if ((map->m_lblk == ee_block) &&
3463
3464 (map_len < ee_len) &&
3465 (ex > EXT_FIRST_EXTENT(eh))) {
3466 ext4_lblk_t prev_lblk;
3467 ext4_fsblk_t prev_pblk, ee_pblk;
3468 unsigned int prev_len;
3469
3470 abut_ex = ex - 1;
3471 prev_lblk = le32_to_cpu(abut_ex->ee_block);
3472 prev_len = ext4_ext_get_actual_len(abut_ex);
3473 prev_pblk = ext4_ext_pblock(abut_ex);
3474 ee_pblk = ext4_ext_pblock(ex);
3475
3476
3477
3478
3479
3480
3481
3482
3483
3484
3485 if ((!ext4_ext_is_unwritten(abut_ex)) &&
3486 ((prev_lblk + prev_len) == ee_block) &&
3487 ((prev_pblk + prev_len) == ee_pblk) &&
3488 (prev_len < (EXT_INIT_MAX_LEN - map_len))) {
3489 err = ext4_ext_get_access(handle, inode, path + depth);
3490 if (err)
3491 goto out;
3492
3493 trace_ext4_ext_convert_to_initialized_fastpath(inode,
3494 map, ex, abut_ex);
3495
3496
3497 ex->ee_block = cpu_to_le32(ee_block + map_len);
3498 ext4_ext_store_pblock(ex, ee_pblk + map_len);
3499 ex->ee_len = cpu_to_le16(ee_len - map_len);
3500 ext4_ext_mark_unwritten(ex);
3501
3502
3503 abut_ex->ee_len = cpu_to_le16(prev_len + map_len);
3504
3505
3506 allocated = map_len;
3507 }
3508 } else if (((map->m_lblk + map_len) == (ee_block + ee_len)) &&
3509 (map_len < ee_len) &&
3510 ex < EXT_LAST_EXTENT(eh)) {
3511
3512 ext4_lblk_t next_lblk;
3513 ext4_fsblk_t next_pblk, ee_pblk;
3514 unsigned int next_len;
3515
3516 abut_ex = ex + 1;
3517 next_lblk = le32_to_cpu(abut_ex->ee_block);
3518 next_len = ext4_ext_get_actual_len(abut_ex);
3519 next_pblk = ext4_ext_pblock(abut_ex);
3520 ee_pblk = ext4_ext_pblock(ex);
3521
3522
3523
3524
3525
3526
3527
3528
3529
3530
3531 if ((!ext4_ext_is_unwritten(abut_ex)) &&
3532 ((map->m_lblk + map_len) == next_lblk) &&
3533 ((ee_pblk + ee_len) == next_pblk) &&
3534 (next_len < (EXT_INIT_MAX_LEN - map_len))) {
3535 err = ext4_ext_get_access(handle, inode, path + depth);
3536 if (err)
3537 goto out;
3538
3539 trace_ext4_ext_convert_to_initialized_fastpath(inode,
3540 map, ex, abut_ex);
3541
3542
3543 abut_ex->ee_block = cpu_to_le32(next_lblk - map_len);
3544 ext4_ext_store_pblock(abut_ex, next_pblk - map_len);
3545 ex->ee_len = cpu_to_le16(ee_len - map_len);
3546 ext4_ext_mark_unwritten(ex);
3547
3548
3549 abut_ex->ee_len = cpu_to_le16(next_len + map_len);
3550
3551
3552 allocated = map_len;
3553 }
3554 }
3555 if (allocated) {
3556
3557 ext4_ext_dirty(handle, inode, path + depth);
3558
3559
3560 path[depth].p_ext = abut_ex;
3561 goto out;
3562 } else
3563 allocated = ee_len - (map->m_lblk - ee_block);
3564
3565 WARN_ON(map->m_lblk < ee_block);
3566
3567
3568
3569
3570 split_flag |= ee_block + ee_len <= eof_block ? EXT4_EXT_MAY_ZEROOUT : 0;
3571
3572 if (EXT4_EXT_MAY_ZEROOUT & split_flag)
3573 max_zeroout = sbi->s_extent_max_zeroout_kb >>
3574 (inode->i_sb->s_blocksize_bits - 10);
3575
3576 if (ext4_encrypted_inode(inode))
3577 max_zeroout = 0;
3578
3579
3580 if (max_zeroout && (ee_len <= max_zeroout)) {
3581 err = ext4_ext_zeroout(inode, ex);
3582 if (err)
3583 goto out;
3584 zero_ex.ee_block = ex->ee_block;
3585 zero_ex.ee_len = cpu_to_le16(ext4_ext_get_actual_len(ex));
3586 ext4_ext_store_pblock(&zero_ex, ext4_ext_pblock(ex));
3587
3588 err = ext4_ext_get_access(handle, inode, path + depth);
3589 if (err)
3590 goto out;
3591 ext4_ext_mark_initialized(ex);
3592 ext4_ext_try_to_merge(handle, inode, path, ex);
3593 err = ext4_ext_dirty(handle, inode, path + path->p_depth);
3594 goto out;
3595 }
3596
3597
3598
3599
3600
3601
3602
3603
3604 split_map.m_lblk = map->m_lblk;
3605 split_map.m_len = map->m_len;
3606
3607 if (max_zeroout && (allocated > map->m_len)) {
3608 if (allocated <= max_zeroout) {
3609
3610 zero_ex.ee_block =
3611 cpu_to_le32(map->m_lblk);
3612 zero_ex.ee_len = cpu_to_le16(allocated);
3613 ext4_ext_store_pblock(&zero_ex,
3614 ext4_ext_pblock(ex) + map->m_lblk - ee_block);
3615 err = ext4_ext_zeroout(inode, &zero_ex);
3616 if (err)
3617 goto out;
3618 split_map.m_lblk = map->m_lblk;
3619 split_map.m_len = allocated;
3620 } else if (map->m_lblk - ee_block + map->m_len < max_zeroout) {
3621
3622 if (map->m_lblk != ee_block) {
3623 zero_ex.ee_block = ex->ee_block;
3624 zero_ex.ee_len = cpu_to_le16(map->m_lblk -
3625 ee_block);
3626 ext4_ext_store_pblock(&zero_ex,
3627 ext4_ext_pblock(ex));
3628 err = ext4_ext_zeroout(inode, &zero_ex);
3629 if (err)
3630 goto out;
3631 }
3632
3633 split_map.m_lblk = ee_block;
3634 split_map.m_len = map->m_lblk - ee_block + map->m_len;
3635 allocated = map->m_len;
3636 }
3637 }
3638
3639 err = ext4_split_extent(handle, inode, ppath, &split_map, split_flag,
3640 flags);
3641 if (err > 0)
3642 err = 0;
3643out:
3644
3645 if (!err)
3646 err = ext4_zeroout_es(inode, &zero_ex);
3647 return err ? err : allocated;
3648}
3649
3650
3651
3652
3653
3654
3655
3656
3657
3658
3659
3660
3661
3662
3663
3664
3665
3666
3667
3668
3669
3670
3671
3672
3673
3674static int ext4_split_convert_extents(handle_t *handle,
3675 struct inode *inode,
3676 struct ext4_map_blocks *map,
3677 struct ext4_ext_path **ppath,
3678 int flags)
3679{
3680 struct ext4_ext_path *path = *ppath;
3681 ext4_lblk_t eof_block;
3682 ext4_lblk_t ee_block;
3683 struct ext4_extent *ex;
3684 unsigned int ee_len;
3685 int split_flag = 0, depth;
3686
3687 ext_debug("%s: inode %lu, logical block %llu, max_blocks %u\n",
3688 __func__, inode->i_ino,
3689 (unsigned long long)map->m_lblk, map->m_len);
3690
3691 eof_block = (inode->i_size + inode->i_sb->s_blocksize - 1) >>
3692 inode->i_sb->s_blocksize_bits;
3693 if (eof_block < map->m_lblk + map->m_len)
3694 eof_block = map->m_lblk + map->m_len;
3695
3696
3697
3698
3699 depth = ext_depth(inode);
3700 ex = path[depth].p_ext;
3701 ee_block = le32_to_cpu(ex->ee_block);
3702 ee_len = ext4_ext_get_actual_len(ex);
3703
3704
3705 if (flags & EXT4_GET_BLOCKS_CONVERT_UNWRITTEN) {
3706 split_flag |= EXT4_EXT_DATA_VALID1;
3707
3708 } else if (flags & EXT4_GET_BLOCKS_CONVERT) {
3709 split_flag |= ee_block + ee_len <= eof_block ?
3710 EXT4_EXT_MAY_ZEROOUT : 0;
3711 split_flag |= (EXT4_EXT_MARK_UNWRIT2 | EXT4_EXT_DATA_VALID2);
3712 }
3713 flags |= EXT4_GET_BLOCKS_PRE_IO;
3714 return ext4_split_extent(handle, inode, ppath, map, split_flag, flags);
3715}
3716
3717static int ext4_convert_unwritten_extents_endio(handle_t *handle,
3718 struct inode *inode,
3719 struct ext4_map_blocks *map,
3720 struct ext4_ext_path **ppath)
3721{
3722 struct ext4_ext_path *path = *ppath;
3723 struct ext4_extent *ex;
3724 ext4_lblk_t ee_block;
3725 unsigned int ee_len;
3726 int depth;
3727 int err = 0;
3728
3729 depth = ext_depth(inode);
3730 ex = path[depth].p_ext;
3731 ee_block = le32_to_cpu(ex->ee_block);
3732 ee_len = ext4_ext_get_actual_len(ex);
3733
3734 ext_debug("ext4_convert_unwritten_extents_endio: inode %lu, logical"
3735 "block %llu, max_blocks %u\n", inode->i_ino,
3736 (unsigned long long)ee_block, ee_len);
3737
3738
3739
3740
3741
3742
3743
3744 if (ee_block != map->m_lblk || ee_len > map->m_len) {
3745#ifdef EXT4_DEBUG
3746 ext4_warning("Inode (%ld) finished: extent logical block %llu,"
3747 " len %u; IO logical block %llu, len %u",
3748 inode->i_ino, (unsigned long long)ee_block, ee_len,
3749 (unsigned long long)map->m_lblk, map->m_len);
3750#endif
3751 err = ext4_split_convert_extents(handle, inode, map, ppath,
3752 EXT4_GET_BLOCKS_CONVERT);
3753 if (err < 0)
3754 return err;
3755 path = ext4_find_extent(inode, map->m_lblk, ppath, 0);
3756 if (IS_ERR(path))
3757 return PTR_ERR(path);
3758 depth = ext_depth(inode);
3759 ex = path[depth].p_ext;
3760 }
3761
3762 err = ext4_ext_get_access(handle, inode, path + depth);
3763 if (err)
3764 goto out;
3765
3766 ext4_ext_mark_initialized(ex);
3767
3768
3769
3770
3771 ext4_ext_try_to_merge(handle, inode, path, ex);
3772
3773
3774 err = ext4_ext_dirty(handle, inode, path + path->p_depth);
3775out:
3776 ext4_ext_show_leaf(inode, path);
3777 return err;
3778}
3779
3780static void unmap_underlying_metadata_blocks(struct block_device *bdev,
3781 sector_t block, int count)
3782{
3783 int i;
3784 for (i = 0; i < count; i++)
3785 unmap_underlying_metadata(bdev, block + i);
3786}
3787
3788
3789
3790
3791static int check_eofblocks_fl(handle_t *handle, struct inode *inode,
3792 ext4_lblk_t lblk,
3793 struct ext4_ext_path *path,
3794 unsigned int len)
3795{
3796 int i, depth;
3797 struct ext4_extent_header *eh;
3798 struct ext4_extent *last_ex;
3799
3800 if (!ext4_test_inode_flag(inode, EXT4_INODE_EOFBLOCKS))
3801 return 0;
3802
3803 depth = ext_depth(inode);
3804 eh = path[depth].p_hdr;
3805
3806
3807
3808
3809
3810
3811 if (unlikely(!eh->eh_entries))
3812 goto out;
3813 last_ex = EXT_LAST_EXTENT(eh);
3814
3815
3816
3817
3818
3819
3820
3821
3822
3823 if (lblk + len < le32_to_cpu(last_ex->ee_block) +
3824 ext4_ext_get_actual_len(last_ex))
3825 return 0;
3826
3827
3828
3829
3830
3831
3832
3833 for (i = depth-1; i >= 0; i--)
3834 if (path[i].p_idx != EXT_LAST_INDEX(path[i].p_hdr))
3835 return 0;
3836out:
3837 ext4_clear_inode_flag(inode, EXT4_INODE_EOFBLOCKS);
3838 return ext4_mark_inode_dirty(handle, inode);
3839}
3840
3841
3842
3843
3844
3845
3846int ext4_find_delalloc_range(struct inode *inode,
3847 ext4_lblk_t lblk_start,
3848 ext4_lblk_t lblk_end)
3849{
3850 struct extent_status es;
3851
3852 ext4_es_find_delayed_extent_range(inode, lblk_start, lblk_end, &es);
3853 if (es.es_len == 0)
3854 return 0;
3855 else if (es.es_lblk <= lblk_start &&
3856 lblk_start < es.es_lblk + es.es_len)
3857 return 1;
3858 else if (lblk_start <= es.es_lblk && es.es_lblk <= lblk_end)
3859 return 1;
3860 else
3861 return 0;
3862}
3863
3864int ext4_find_delalloc_cluster(struct inode *inode, ext4_lblk_t lblk)
3865{
3866 struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb);
3867 ext4_lblk_t lblk_start, lblk_end;
3868 lblk_start = EXT4_LBLK_CMASK(sbi, lblk);
3869 lblk_end = lblk_start + sbi->s_cluster_ratio - 1;
3870
3871 return ext4_find_delalloc_range(inode, lblk_start, lblk_end);
3872}
3873
3874
3875
3876
3877
3878
3879
3880
3881
3882
3883
3884
3885
3886
3887
3888
3889
3890
3891
3892
3893
3894
3895
3896
3897
3898
3899
3900
3901
3902
3903
3904
3905
3906
3907
3908
3909static unsigned int
3910get_reserved_cluster_alloc(struct inode *inode, ext4_lblk_t lblk_start,
3911 unsigned int num_blks)
3912{
3913 struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb);
3914 ext4_lblk_t alloc_cluster_start, alloc_cluster_end;
3915 ext4_lblk_t lblk_from, lblk_to, c_offset;
3916 unsigned int allocated_clusters = 0;
3917
3918 alloc_cluster_start = EXT4_B2C(sbi, lblk_start);
3919 alloc_cluster_end = EXT4_B2C(sbi, lblk_start + num_blks - 1);
3920
3921
3922 allocated_clusters = alloc_cluster_end - alloc_cluster_start + 1;
3923
3924 trace_ext4_get_reserved_cluster_alloc(inode, lblk_start, num_blks);
3925
3926
3927 c_offset = EXT4_LBLK_COFF(sbi, lblk_start);
3928 if (c_offset) {
3929 lblk_from = EXT4_LBLK_CMASK(sbi, lblk_start);
3930 lblk_to = lblk_from + c_offset - 1;
3931
3932 if (ext4_find_delalloc_range(inode, lblk_from, lblk_to))
3933 allocated_clusters--;
3934 }
3935
3936
3937 c_offset = EXT4_LBLK_COFF(sbi, lblk_start + num_blks);
3938 if (allocated_clusters && c_offset) {
3939 lblk_from = lblk_start + num_blks;
3940 lblk_to = lblk_from + (sbi->s_cluster_ratio - c_offset) - 1;
3941
3942 if (ext4_find_delalloc_range(inode, lblk_from, lblk_to))
3943 allocated_clusters--;
3944 }
3945
3946 return allocated_clusters;
3947}
3948
3949static int
3950convert_initialized_extent(handle_t *handle, struct inode *inode,
3951 struct ext4_map_blocks *map,
3952 struct ext4_ext_path **ppath,
3953 unsigned int allocated)
3954{
3955 struct ext4_ext_path *path = *ppath;
3956 struct ext4_extent *ex;
3957 ext4_lblk_t ee_block;
3958 unsigned int ee_len;
3959 int depth;
3960 int err = 0;
3961
3962
3963
3964
3965
3966 if (map->m_len > EXT_UNWRITTEN_MAX_LEN)
3967 map->m_len = EXT_UNWRITTEN_MAX_LEN / 2;
3968
3969 depth = ext_depth(inode);
3970 ex = path[depth].p_ext;
3971 ee_block = le32_to_cpu(ex->ee_block);
3972 ee_len = ext4_ext_get_actual_len(ex);
3973
3974 ext_debug("%s: inode %lu, logical"
3975 "block %llu, max_blocks %u\n", __func__, inode->i_ino,
3976 (unsigned long long)ee_block, ee_len);
3977
3978 if (ee_block != map->m_lblk || ee_len > map->m_len) {
3979 err = ext4_split_convert_extents(handle, inode, map, ppath,
3980 EXT4_GET_BLOCKS_CONVERT_UNWRITTEN);
3981 if (err < 0)
3982 return err;
3983 path = ext4_find_extent(inode, map->m_lblk, ppath, 0);
3984 if (IS_ERR(path))
3985 return PTR_ERR(path);
3986 depth = ext_depth(inode);
3987 ex = path[depth].p_ext;
3988 if (!ex) {
3989 EXT4_ERROR_INODE(inode, "unexpected hole at %lu",
3990 (unsigned long) map->m_lblk);
3991 return -EFSCORRUPTED;
3992 }
3993 }
3994
3995 err = ext4_ext_get_access(handle, inode, path + depth);
3996 if (err)
3997 return err;
3998
3999 ext4_ext_mark_unwritten(ex);
4000
4001
4002
4003
4004 ext4_ext_try_to_merge(handle, inode, path, ex);
4005
4006
4007 err = ext4_ext_dirty(handle, inode, path + path->p_depth);
4008 if (err)
4009 return err;
4010 ext4_ext_show_leaf(inode, path);
4011
4012 ext4_update_inode_fsync_trans(handle, inode, 1);
4013 err = check_eofblocks_fl(handle, inode, map->m_lblk, path, map->m_len);
4014 if (err)
4015 return err;
4016 map->m_flags |= EXT4_MAP_UNWRITTEN;
4017 if (allocated > map->m_len)
4018 allocated = map->m_len;
4019 map->m_len = allocated;
4020 return allocated;
4021}
4022
4023static int
4024ext4_ext_handle_unwritten_extents(handle_t *handle, struct inode *inode,
4025 struct ext4_map_blocks *map,
4026 struct ext4_ext_path **ppath, int flags,
4027 unsigned int allocated, ext4_fsblk_t newblock)
4028{
4029 struct ext4_ext_path *path = *ppath;
4030 int ret = 0;
4031 int err = 0;
4032
4033 ext_debug("ext4_ext_handle_unwritten_extents: inode %lu, logical "
4034 "block %llu, max_blocks %u, flags %x, allocated %u\n",
4035 inode->i_ino, (unsigned long long)map->m_lblk, map->m_len,
4036 flags, allocated);
4037 ext4_ext_show_leaf(inode, path);
4038
4039
4040
4041
4042
4043 flags |= EXT4_GET_BLOCKS_METADATA_NOFAIL;
4044
4045 trace_ext4_ext_handle_unwritten_extents(inode, map, flags,
4046 allocated, newblock);
4047
4048
4049 if (flags & EXT4_GET_BLOCKS_PRE_IO) {
4050 ret = ext4_split_convert_extents(handle, inode, map, ppath,
4051 flags | EXT4_GET_BLOCKS_CONVERT);
4052 if (ret <= 0)
4053 goto out;
4054 map->m_flags |= EXT4_MAP_UNWRITTEN;
4055 goto out;
4056 }
4057
4058 if (flags & EXT4_GET_BLOCKS_CONVERT) {
4059 if (flags & EXT4_GET_BLOCKS_ZERO) {
4060 if (allocated > map->m_len)
4061 allocated = map->m_len;
4062 err = ext4_issue_zeroout(inode, map->m_lblk, newblock,
4063 allocated);
4064 if (err < 0)
4065 goto out2;
4066 }
4067 ret = ext4_convert_unwritten_extents_endio(handle, inode, map,
4068 ppath);
4069 if (ret >= 0) {
4070 ext4_update_inode_fsync_trans(handle, inode, 1);
4071 err = check_eofblocks_fl(handle, inode, map->m_lblk,
4072 path, map->m_len);
4073 } else
4074 err = ret;
4075 map->m_flags |= EXT4_MAP_MAPPED;
4076 map->m_pblk = newblock;
4077 if (allocated > map->m_len)
4078 allocated = map->m_len;
4079 map->m_len = allocated;
4080 goto out2;
4081 }
4082
4083
4084
4085
4086
4087 if (flags & EXT4_GET_BLOCKS_UNWRIT_EXT) {
4088 map->m_flags |= EXT4_MAP_UNWRITTEN;
4089 goto map_out;
4090 }
4091
4092
4093 if ((flags & EXT4_GET_BLOCKS_CREATE) == 0) {
4094
4095
4096
4097
4098
4099
4100
4101 map->m_flags |= EXT4_MAP_UNWRITTEN;
4102 goto out1;
4103 }
4104
4105
4106 ret = ext4_ext_convert_to_initialized(handle, inode, map, ppath, flags);
4107 if (ret >= 0)
4108 ext4_update_inode_fsync_trans(handle, inode, 1);
4109out:
4110 if (ret <= 0) {
4111 err = ret;
4112 goto out2;
4113 } else
4114 allocated = ret;
4115 map->m_flags |= EXT4_MAP_NEW;
4116
4117
4118
4119
4120
4121
4122
4123 if (allocated > map->m_len) {
4124 unmap_underlying_metadata_blocks(inode->i_sb->s_bdev,
4125 newblock + map->m_len,
4126 allocated - map->m_len);
4127 allocated = map->m_len;
4128 }
4129 map->m_len = allocated;
4130
4131
4132
4133
4134
4135
4136
4137
4138 if (flags & EXT4_GET_BLOCKS_DELALLOC_RESERVE) {
4139 unsigned int reserved_clusters;
4140 reserved_clusters = get_reserved_cluster_alloc(inode,
4141 map->m_lblk, map->m_len);
4142 if (reserved_clusters)
4143 ext4_da_update_reserve_space(inode,
4144 reserved_clusters,
4145 0);
4146 }
4147
4148map_out:
4149 map->m_flags |= EXT4_MAP_MAPPED;
4150 if ((flags & EXT4_GET_BLOCKS_KEEP_SIZE) == 0) {
4151 err = check_eofblocks_fl(handle, inode, map->m_lblk, path,
4152 map->m_len);
4153 if (err < 0)
4154 goto out2;
4155 }
4156out1:
4157 if (allocated > map->m_len)
4158 allocated = map->m_len;
4159 ext4_ext_show_leaf(inode, path);
4160 map->m_pblk = newblock;
4161 map->m_len = allocated;
4162out2:
4163 return err ? err : allocated;
4164}
4165
4166
4167
4168
4169
4170
4171
4172
4173
4174
4175
4176
4177
4178
4179
4180
4181
4182
4183
4184
4185
4186
4187
4188
4189
4190
4191
4192
4193
4194
4195
4196
4197
4198
4199
4200
4201
4202
4203
4204
4205
4206
4207static int get_implied_cluster_alloc(struct super_block *sb,
4208 struct ext4_map_blocks *map,
4209 struct ext4_extent *ex,
4210 struct ext4_ext_path *path)
4211{
4212 struct ext4_sb_info *sbi = EXT4_SB(sb);
4213 ext4_lblk_t c_offset = EXT4_LBLK_COFF(sbi, map->m_lblk);
4214 ext4_lblk_t ex_cluster_start, ex_cluster_end;
4215 ext4_lblk_t rr_cluster_start;
4216 ext4_lblk_t ee_block = le32_to_cpu(ex->ee_block);
4217 ext4_fsblk_t ee_start = ext4_ext_pblock(ex);
4218 unsigned short ee_len = ext4_ext_get_actual_len(ex);
4219
4220
4221 ex_cluster_start = EXT4_B2C(sbi, ee_block);
4222 ex_cluster_end = EXT4_B2C(sbi, ee_block + ee_len - 1);
4223
4224
4225 rr_cluster_start = EXT4_B2C(sbi, map->m_lblk);
4226
4227 if ((rr_cluster_start == ex_cluster_end) ||
4228 (rr_cluster_start == ex_cluster_start)) {
4229 if (rr_cluster_start == ex_cluster_end)
4230 ee_start += ee_len - 1;
4231 map->m_pblk = EXT4_PBLK_CMASK(sbi, ee_start) + c_offset;
4232 map->m_len = min(map->m_len,
4233 (unsigned) sbi->s_cluster_ratio - c_offset);
4234
4235
4236
4237
4238
4239
4240
4241
4242
4243 if (map->m_lblk < ee_block)
4244 map->m_len = min(map->m_len, ee_block - map->m_lblk);
4245
4246
4247
4248
4249
4250
4251
4252
4253
4254
4255 if (map->m_lblk > ee_block) {
4256 ext4_lblk_t next = ext4_ext_next_allocated_block(path);
4257 map->m_len = min(map->m_len, next - map->m_lblk);
4258 }
4259
4260 trace_ext4_get_implied_cluster_alloc_exit(sb, map, 1);
4261 return 1;
4262 }
4263
4264 trace_ext4_get_implied_cluster_alloc_exit(sb, map, 0);
4265 return 0;
4266}
4267
4268
4269
4270
4271
4272
4273
4274
4275
4276
4277
4278
4279
4280
4281
4282
4283
4284
4285
4286
4287int ext4_ext_map_blocks(handle_t *handle, struct inode *inode,
4288 struct ext4_map_blocks *map, int flags)
4289{
4290 struct ext4_ext_path *path = NULL;
4291 struct ext4_extent newex, *ex, *ex2;
4292 struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb);
4293 ext4_fsblk_t newblock = 0;
4294 int free_on_err = 0, err = 0, depth, ret;
4295 unsigned int allocated = 0, offset = 0;
4296 unsigned int allocated_clusters = 0;
4297 struct ext4_allocation_request ar;
4298 ext4_lblk_t cluster_offset;
4299 bool map_from_cluster = false;
4300
4301 ext_debug("blocks %u/%u requested for inode %lu\n",
4302 map->m_lblk, map->m_len, inode->i_ino);
4303 trace_ext4_ext_map_blocks_enter(inode, map->m_lblk, map->m_len, flags);
4304
4305
4306 path = ext4_find_extent(inode, map->m_lblk, NULL, 0);
4307 if (IS_ERR(path)) {
4308 err = PTR_ERR(path);
4309 path = NULL;
4310 goto out2;
4311 }
4312
4313 depth = ext_depth(inode);
4314
4315
4316
4317
4318
4319
4320 if (unlikely(path[depth].p_ext == NULL && depth != 0)) {
4321 EXT4_ERROR_INODE(inode, "bad extent address "
4322 "lblock: %lu, depth: %d pblock %lld",
4323 (unsigned long) map->m_lblk, depth,
4324 path[depth].p_block);
4325 err = -EFSCORRUPTED;
4326 goto out2;
4327 }
4328
4329 ex = path[depth].p_ext;
4330 if (ex) {
4331 ext4_lblk_t ee_block = le32_to_cpu(ex->ee_block);
4332 ext4_fsblk_t ee_start = ext4_ext_pblock(ex);
4333 unsigned short ee_len;
4334
4335
4336
4337
4338
4339
4340 ee_len = ext4_ext_get_actual_len(ex);
4341
4342 trace_ext4_ext_show_extent(inode, ee_block, ee_start, ee_len);
4343
4344
4345 if (in_range(map->m_lblk, ee_block, ee_len)) {
4346 newblock = map->m_lblk - ee_block + ee_start;
4347
4348 allocated = ee_len - (map->m_lblk - ee_block);
4349 ext_debug("%u fit into %u:%d -> %llu\n", map->m_lblk,
4350 ee_block, ee_len, newblock);
4351
4352
4353
4354
4355
4356 if ((!ext4_ext_is_unwritten(ex)) &&
4357 (flags & EXT4_GET_BLOCKS_CONVERT_UNWRITTEN)) {
4358 allocated = convert_initialized_extent(
4359 handle, inode, map, &path,
4360 allocated);
4361 goto out2;
4362 } else if (!ext4_ext_is_unwritten(ex))
4363 goto out;
4364
4365 ret = ext4_ext_handle_unwritten_extents(
4366 handle, inode, map, &path, flags,
4367 allocated, newblock);
4368 if (ret < 0)
4369 err = ret;
4370 else
4371 allocated = ret;
4372 goto out2;
4373 }
4374 }
4375
4376
4377
4378
4379
4380 if ((flags & EXT4_GET_BLOCKS_CREATE) == 0) {
4381 ext4_lblk_t hole_start, hole_len;
4382
4383 hole_start = map->m_lblk;
4384 hole_len = ext4_ext_determine_hole(inode, path, &hole_start);
4385
4386
4387
4388
4389 ext4_ext_put_gap_in_cache(inode, hole_start, hole_len);
4390
4391
4392 if (hole_start != map->m_lblk)
4393 hole_len -= map->m_lblk - hole_start;
4394 map->m_pblk = 0;
4395 map->m_len = min_t(unsigned int, map->m_len, hole_len);
4396
4397 goto out2;
4398 }
4399
4400
4401
4402
4403 newex.ee_block = cpu_to_le32(map->m_lblk);
4404 cluster_offset = EXT4_LBLK_COFF(sbi, map->m_lblk);
4405
4406
4407
4408
4409
4410 if (cluster_offset && ex &&
4411 get_implied_cluster_alloc(inode->i_sb, map, ex, path)) {
4412 ar.len = allocated = map->m_len;
4413 newblock = map->m_pblk;
4414 map_from_cluster = true;
4415 goto got_allocated_blocks;
4416 }
4417
4418
4419 ar.lleft = map->m_lblk;
4420 err = ext4_ext_search_left(inode, path, &ar.lleft, &ar.pleft);
4421 if (err)
4422 goto out2;
4423 ar.lright = map->m_lblk;
4424 ex2 = NULL;
4425 err = ext4_ext_search_right(inode, path, &ar.lright, &ar.pright, &ex2);
4426 if (err)
4427 goto out2;
4428
4429
4430
4431 if ((sbi->s_cluster_ratio > 1) && ex2 &&
4432 get_implied_cluster_alloc(inode->i_sb, map, ex2, path)) {
4433 ar.len = allocated = map->m_len;
4434 newblock = map->m_pblk;
4435 map_from_cluster = true;
4436 goto got_allocated_blocks;
4437 }
4438
4439
4440
4441
4442
4443
4444
4445 if (map->m_len > EXT_INIT_MAX_LEN &&
4446 !(flags & EXT4_GET_BLOCKS_UNWRIT_EXT))
4447 map->m_len = EXT_INIT_MAX_LEN;
4448 else if (map->m_len > EXT_UNWRITTEN_MAX_LEN &&
4449 (flags & EXT4_GET_BLOCKS_UNWRIT_EXT))
4450 map->m_len = EXT_UNWRITTEN_MAX_LEN;
4451
4452
4453 newex.ee_len = cpu_to_le16(map->m_len);
4454 err = ext4_ext_check_overlap(sbi, inode, &newex, path);
4455 if (err)
4456 allocated = ext4_ext_get_actual_len(&newex);
4457 else
4458 allocated = map->m_len;
4459
4460
4461 ar.inode = inode;
4462 ar.goal = ext4_ext_find_goal(inode, path, map->m_lblk);
4463 ar.logical = map->m_lblk;
4464
4465
4466
4467
4468
4469
4470
4471
4472 offset = EXT4_LBLK_COFF(sbi, map->m_lblk);
4473 ar.len = EXT4_NUM_B2C(sbi, offset+allocated);
4474 ar.goal -= offset;
4475 ar.logical -= offset;
4476 if (S_ISREG(inode->i_mode))
4477 ar.flags = EXT4_MB_HINT_DATA;
4478 else
4479
4480 ar.flags = 0;
4481 if (flags & EXT4_GET_BLOCKS_NO_NORMALIZE)
4482 ar.flags |= EXT4_MB_HINT_NOPREALLOC;
4483 if (flags & EXT4_GET_BLOCKS_DELALLOC_RESERVE)
4484 ar.flags |= EXT4_MB_DELALLOC_RESERVED;
4485 if (flags & EXT4_GET_BLOCKS_METADATA_NOFAIL)
4486 ar.flags |= EXT4_MB_USE_RESERVED;
4487 newblock = ext4_mb_new_blocks(handle, &ar, &err);
4488 if (!newblock)
4489 goto out2;
4490 ext_debug("allocate new block: goal %llu, found %llu/%u\n",
4491 ar.goal, newblock, allocated);
4492 free_on_err = 1;
4493 allocated_clusters = ar.len;
4494 ar.len = EXT4_C2B(sbi, ar.len) - offset;
4495 if (ar.len > allocated)
4496 ar.len = allocated;
4497
4498got_allocated_blocks:
4499
4500 ext4_ext_store_pblock(&newex, newblock + offset);
4501 newex.ee_len = cpu_to_le16(ar.len);
4502
4503 if (flags & EXT4_GET_BLOCKS_UNWRIT_EXT){
4504 ext4_ext_mark_unwritten(&newex);
4505 map->m_flags |= EXT4_MAP_UNWRITTEN;
4506 }
4507
4508 err = 0;
4509 if ((flags & EXT4_GET_BLOCKS_KEEP_SIZE) == 0)
4510 err = check_eofblocks_fl(handle, inode, map->m_lblk,
4511 path, ar.len);
4512 if (!err)
4513 err = ext4_ext_insert_extent(handle, inode, &path,
4514 &newex, flags);
4515
4516 if (err && free_on_err) {
4517 int fb_flags = flags & EXT4_GET_BLOCKS_DELALLOC_RESERVE ?
4518 EXT4_FREE_BLOCKS_NO_QUOT_UPDATE : 0;
4519
4520
4521
4522 ext4_discard_preallocations(inode);
4523 ext4_free_blocks(handle, inode, NULL, newblock,
4524 EXT4_C2B(sbi, allocated_clusters), fb_flags);
4525 goto out2;
4526 }
4527
4528
4529 newblock = ext4_ext_pblock(&newex);
4530 allocated = ext4_ext_get_actual_len(&newex);
4531 if (allocated > map->m_len)
4532 allocated = map->m_len;
4533 map->m_flags |= EXT4_MAP_NEW;
4534
4535
4536
4537
4538
4539 if (flags & EXT4_GET_BLOCKS_DELALLOC_RESERVE) {
4540 unsigned int reserved_clusters;
4541
4542
4543
4544 reserved_clusters = get_reserved_cluster_alloc(inode,
4545 map->m_lblk, allocated);
4546 if (!map_from_cluster) {
4547 BUG_ON(allocated_clusters < reserved_clusters);
4548 if (reserved_clusters < allocated_clusters) {
4549 struct ext4_inode_info *ei = EXT4_I(inode);
4550 int reservation = allocated_clusters -
4551 reserved_clusters;
4552
4553
4554
4555
4556
4557
4558
4559
4560
4561
4562
4563
4564
4565
4566
4567
4568
4569
4570
4571
4572
4573
4574
4575
4576
4577
4578
4579
4580
4581
4582
4583
4584
4585
4586
4587
4588
4589
4590
4591
4592 dquot_reserve_block(inode,
4593 EXT4_C2B(sbi, reservation));
4594 spin_lock(&ei->i_block_reservation_lock);
4595 ei->i_reserved_data_blocks += reservation;
4596 spin_unlock(&ei->i_block_reservation_lock);
4597 }
4598
4599
4600
4601
4602
4603
4604
4605 ext4_da_update_reserve_space(inode, allocated_clusters,
4606 1);
4607 }
4608 }
4609
4610
4611
4612
4613
4614 if ((flags & EXT4_GET_BLOCKS_UNWRIT_EXT) == 0)
4615 ext4_update_inode_fsync_trans(handle, inode, 1);
4616 else
4617 ext4_update_inode_fsync_trans(handle, inode, 0);
4618out:
4619 if (allocated > map->m_len)
4620 allocated = map->m_len;
4621 ext4_ext_show_leaf(inode, path);
4622 map->m_flags |= EXT4_MAP_MAPPED;
4623 map->m_pblk = newblock;
4624 map->m_len = allocated;
4625out2:
4626 ext4_ext_drop_refs(path);
4627 kfree(path);
4628
4629 trace_ext4_ext_map_blocks_exit(inode, flags, map,
4630 err ? err : allocated);
4631 return err ? err : allocated;
4632}
4633
4634void ext4_ext_truncate(handle_t *handle, struct inode *inode)
4635{
4636 struct super_block *sb = inode->i_sb;
4637 ext4_lblk_t last_block;
4638 int err = 0;
4639
4640
4641
4642
4643
4644
4645
4646
4647 EXT4_I(inode)->i_disksize = inode->i_size;
4648 ext4_mark_inode_dirty(handle, inode);
4649
4650 last_block = (inode->i_size + sb->s_blocksize - 1)
4651 >> EXT4_BLOCK_SIZE_BITS(sb);
4652retry:
4653 err = ext4_es_remove_extent(inode, last_block,
4654 EXT_MAX_BLOCKS - last_block);
4655 if (err == -ENOMEM) {
4656 cond_resched();
4657 congestion_wait(BLK_RW_ASYNC, HZ/50);
4658 goto retry;
4659 }
4660 if (err) {
4661 ext4_std_error(inode->i_sb, err);
4662 return;
4663 }
4664 err = ext4_ext_remove_space(inode, last_block, EXT_MAX_BLOCKS - 1);
4665 ext4_std_error(inode->i_sb, err);
4666}
4667
4668static int ext4_alloc_file_blocks(struct file *file, ext4_lblk_t offset,
4669 ext4_lblk_t len, loff_t new_size,
4670 int flags, int mode)
4671{
4672 struct inode *inode = file_inode(file);
4673 handle_t *handle;
4674 int ret = 0;
4675 int ret2 = 0;
4676 int retries = 0;
4677 int depth = 0;
4678 struct ext4_map_blocks map;
4679 unsigned int credits;
4680 loff_t epos;
4681
4682 map.m_lblk = offset;
4683 map.m_len = len;
4684
4685
4686
4687
4688
4689 if (len <= EXT_UNWRITTEN_MAX_LEN)
4690 flags |= EXT4_GET_BLOCKS_NO_NORMALIZE;
4691
4692
4693
4694
4695 credits = ext4_chunk_trans_blocks(inode, len);
4696
4697
4698
4699 if (ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS))
4700 depth = ext_depth(inode);
4701 else
4702 depth = -1;
4703
4704retry:
4705 while (ret >= 0 && len) {
4706
4707
4708
4709 if (depth >= 0 && depth != ext_depth(inode)) {
4710 credits = ext4_chunk_trans_blocks(inode, len);
4711 depth = ext_depth(inode);
4712 }
4713
4714 handle = ext4_journal_start(inode, EXT4_HT_MAP_BLOCKS,
4715 credits);
4716 if (IS_ERR(handle)) {
4717 ret = PTR_ERR(handle);
4718 break;
4719 }
4720 ret = ext4_map_blocks(handle, inode, &map, flags);
4721 if (ret <= 0) {
4722 ext4_debug("inode #%lu: block %u: len %u: "
4723 "ext4_ext_map_blocks returned %d",
4724 inode->i_ino, map.m_lblk,
4725 map.m_len, ret);
4726 ext4_mark_inode_dirty(handle, inode);
4727 ret2 = ext4_journal_stop(handle);
4728 break;
4729 }
4730 map.m_lblk += ret;
4731 map.m_len = len = len - ret;
4732 epos = (loff_t)map.m_lblk << inode->i_blkbits;
4733 inode->i_ctime = ext4_current_time(inode);
4734 if (new_size) {
4735 if (epos > new_size)
4736 epos = new_size;
4737 if (ext4_update_inode_size(inode, epos) & 0x1)
4738 inode->i_mtime = inode->i_ctime;
4739 } else {
4740 if (epos > inode->i_size)
4741 ext4_set_inode_flag(inode,
4742 EXT4_INODE_EOFBLOCKS);
4743 }
4744 ext4_mark_inode_dirty(handle, inode);
4745 ret2 = ext4_journal_stop(handle);
4746 if (ret2)
4747 break;
4748 }
4749 if (ret == -ENOSPC &&
4750 ext4_should_retry_alloc(inode->i_sb, &retries)) {
4751 ret = 0;
4752 goto retry;
4753 }
4754
4755 return ret > 0 ? ret2 : ret;
4756}
4757
4758static long ext4_zero_range(struct file *file, loff_t offset,
4759 loff_t len, int mode)
4760{
4761 struct inode *inode = file_inode(file);
4762 handle_t *handle = NULL;
4763 unsigned int max_blocks;
4764 loff_t new_size = 0;
4765 int ret = 0;
4766 int flags;
4767 int credits;
4768 int partial_begin, partial_end;
4769 loff_t start, end;
4770 ext4_lblk_t lblk;
4771 unsigned int blkbits = inode->i_blkbits;
4772
4773 trace_ext4_zero_range(inode, offset, len, mode);
4774
4775 if (!S_ISREG(inode->i_mode))
4776 return -EINVAL;
4777
4778
4779 if (ext4_should_journal_data(inode)) {
4780 ret = ext4_force_commit(inode->i_sb);
4781 if (ret)
4782 return ret;
4783 }
4784
4785
4786
4787
4788
4789
4790
4791 start = round_up(offset, 1 << blkbits);
4792 end = round_down((offset + len), 1 << blkbits);
4793
4794 if (start < offset || end > offset + len)
4795 return -EINVAL;
4796 partial_begin = offset & ((1 << blkbits) - 1);
4797 partial_end = (offset + len) & ((1 << blkbits) - 1);
4798
4799 lblk = start >> blkbits;
4800 max_blocks = (end >> blkbits);
4801 if (max_blocks < lblk)
4802 max_blocks = 0;
4803 else
4804 max_blocks -= lblk;
4805
4806 inode_lock(inode);
4807
4808
4809
4810
4811 if (!(ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS))) {
4812 ret = -EOPNOTSUPP;
4813 goto out_mutex;
4814 }
4815
4816 if (!(mode & FALLOC_FL_KEEP_SIZE) &&
4817 offset + len > i_size_read(inode)) {
4818 new_size = offset + len;
4819 ret = inode_newsize_ok(inode, new_size);
4820 if (ret)
4821 goto out_mutex;
4822 }
4823
4824 flags = EXT4_GET_BLOCKS_CREATE_UNWRIT_EXT;
4825 if (mode & FALLOC_FL_KEEP_SIZE)
4826 flags |= EXT4_GET_BLOCKS_KEEP_SIZE;
4827
4828
4829 ext4_inode_block_unlocked_dio(inode);
4830 inode_dio_wait(inode);
4831
4832
4833 if (partial_begin || partial_end) {
4834 ret = ext4_alloc_file_blocks(file,
4835 round_down(offset, 1 << blkbits) >> blkbits,
4836 (round_up((offset + len), 1 << blkbits) -
4837 round_down(offset, 1 << blkbits)) >> blkbits,
4838 new_size, flags, mode);
4839 if (ret)
4840 goto out_dio;
4841
4842 }
4843
4844
4845 if (max_blocks > 0) {
4846 flags |= (EXT4_GET_BLOCKS_CONVERT_UNWRITTEN |
4847 EXT4_EX_NOCACHE);
4848
4849
4850
4851
4852
4853 down_write(&EXT4_I(inode)->i_mmap_sem);
4854 ret = ext4_update_disksize_before_punch(inode, offset, len);
4855 if (ret) {
4856 up_write(&EXT4_I(inode)->i_mmap_sem);
4857 goto out_dio;
4858 }
4859
4860 truncate_pagecache_range(inode, start, end - 1);
4861 inode->i_mtime = inode->i_ctime = ext4_current_time(inode);
4862
4863 ret = ext4_alloc_file_blocks(file, lblk, max_blocks, new_size,
4864 flags, mode);
4865 up_write(&EXT4_I(inode)->i_mmap_sem);
4866 if (ret)
4867 goto out_dio;
4868 }
4869 if (!partial_begin && !partial_end)
4870 goto out_dio;
4871
4872
4873
4874
4875
4876 credits = (2 * ext4_ext_index_trans_blocks(inode, 2)) + 1;
4877 if (ext4_should_journal_data(inode))
4878 credits += 2;
4879 handle = ext4_journal_start(inode, EXT4_HT_MISC, credits);
4880 if (IS_ERR(handle)) {
4881 ret = PTR_ERR(handle);
4882 ext4_std_error(inode->i_sb, ret);
4883 goto out_dio;
4884 }
4885
4886 inode->i_mtime = inode->i_ctime = ext4_current_time(inode);
4887 if (new_size) {
4888 ext4_update_inode_size(inode, new_size);
4889 } else {
4890
4891
4892
4893
4894 if ((offset + len) > i_size_read(inode))
4895 ext4_set_inode_flag(inode, EXT4_INODE_EOFBLOCKS);
4896 }
4897 ext4_mark_inode_dirty(handle, inode);
4898
4899
4900 ret = ext4_zero_partial_blocks(handle, inode, offset, len);
4901
4902 if (file->f_flags & O_SYNC)
4903 ext4_handle_sync(handle);
4904
4905 ext4_journal_stop(handle);
4906out_dio:
4907 ext4_inode_resume_unlocked_dio(inode);
4908out_mutex:
4909 inode_unlock(inode);
4910 return ret;
4911}
4912
4913
4914
4915
4916
4917
4918
4919
4920long ext4_fallocate(struct file *file, int mode, loff_t offset, loff_t len)
4921{
4922 struct inode *inode = file_inode(file);
4923 loff_t new_size = 0;
4924 unsigned int max_blocks;
4925 int ret = 0;
4926 int flags;
4927 ext4_lblk_t lblk;
4928 unsigned int blkbits = inode->i_blkbits;
4929
4930
4931
4932
4933
4934
4935
4936
4937
4938
4939
4940 if (ext4_encrypted_inode(inode) &&
4941 (mode & (FALLOC_FL_COLLAPSE_RANGE | FALLOC_FL_INSERT_RANGE |
4942 FALLOC_FL_ZERO_RANGE)))
4943 return -EOPNOTSUPP;
4944
4945
4946 if (mode & ~(FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE |
4947 FALLOC_FL_COLLAPSE_RANGE | FALLOC_FL_ZERO_RANGE |
4948 FALLOC_FL_INSERT_RANGE))
4949 return -EOPNOTSUPP;
4950
4951 if (mode & FALLOC_FL_PUNCH_HOLE)
4952 return ext4_punch_hole(inode, offset, len);
4953
4954 ret = ext4_convert_inline_data(inode);
4955 if (ret)
4956 return ret;
4957
4958 if (mode & FALLOC_FL_COLLAPSE_RANGE)
4959 return ext4_collapse_range(inode, offset, len);
4960
4961 if (mode & FALLOC_FL_INSERT_RANGE)
4962 return ext4_insert_range(inode, offset, len);
4963
4964 if (mode & FALLOC_FL_ZERO_RANGE)
4965 return ext4_zero_range(file, offset, len, mode);
4966
4967 trace_ext4_fallocate_enter(inode, offset, len, mode);
4968 lblk = offset >> blkbits;
4969
4970
4971
4972
4973 max_blocks = (EXT4_BLOCK_ALIGN(len + offset, blkbits) >> blkbits)
4974 - lblk;
4975
4976 flags = EXT4_GET_BLOCKS_CREATE_UNWRIT_EXT;
4977 if (mode & FALLOC_FL_KEEP_SIZE)
4978 flags |= EXT4_GET_BLOCKS_KEEP_SIZE;
4979
4980 inode_lock(inode);
4981
4982
4983
4984
4985 if (!(ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS))) {
4986 ret = -EOPNOTSUPP;
4987 goto out;
4988 }
4989
4990 if (!(mode & FALLOC_FL_KEEP_SIZE) &&
4991 offset + len > i_size_read(inode)) {
4992 new_size = offset + len;
4993 ret = inode_newsize_ok(inode, new_size);
4994 if (ret)
4995 goto out;
4996 }
4997
4998
4999 ext4_inode_block_unlocked_dio(inode);
5000 inode_dio_wait(inode);
5001
5002 ret = ext4_alloc_file_blocks(file, lblk, max_blocks, new_size,
5003 flags, mode);
5004 ext4_inode_resume_unlocked_dio(inode);
5005 if (ret)
5006 goto out;
5007
5008 if (file->f_flags & O_SYNC && EXT4_SB(inode->i_sb)->s_journal) {
5009 ret = jbd2_complete_transaction(EXT4_SB(inode->i_sb)->s_journal,
5010 EXT4_I(inode)->i_sync_tid);
5011 }
5012out:
5013 inode_unlock(inode);
5014 trace_ext4_fallocate_exit(inode, offset, max_blocks, ret);
5015 return ret;
5016}
5017
5018
5019
5020
5021
5022
5023
5024
5025
5026
5027
5028int ext4_convert_unwritten_extents(handle_t *handle, struct inode *inode,
5029 loff_t offset, ssize_t len)
5030{
5031 unsigned int max_blocks;
5032 int ret = 0;
5033 int ret2 = 0;
5034 struct ext4_map_blocks map;
5035 unsigned int credits, blkbits = inode->i_blkbits;
5036
5037 map.m_lblk = offset >> blkbits;
5038
5039
5040
5041
5042 max_blocks = ((EXT4_BLOCK_ALIGN(len + offset, blkbits) >> blkbits) -
5043 map.m_lblk);
5044
5045
5046
5047
5048
5049 if (handle) {
5050 handle = ext4_journal_start_reserved(handle,
5051 EXT4_HT_EXT_CONVERT);
5052 if (IS_ERR(handle))
5053 return PTR_ERR(handle);
5054 credits = 0;
5055 } else {
5056
5057
5058
5059 credits = ext4_chunk_trans_blocks(inode, max_blocks);
5060 }
5061 while (ret >= 0 && ret < max_blocks) {
5062 map.m_lblk += ret;
5063 map.m_len = (max_blocks -= ret);
5064 if (credits) {
5065 handle = ext4_journal_start(inode, EXT4_HT_MAP_BLOCKS,
5066 credits);
5067 if (IS_ERR(handle)) {
5068 ret = PTR_ERR(handle);
5069 break;
5070 }
5071 }
5072 ret = ext4_map_blocks(handle, inode, &map,
5073 EXT4_GET_BLOCKS_IO_CONVERT_EXT);
5074 if (ret <= 0)
5075 ext4_warning(inode->i_sb,
5076 "inode #%lu: block %u: len %u: "
5077 "ext4_ext_map_blocks returned %d",
5078 inode->i_ino, map.m_lblk,
5079 map.m_len, ret);
5080 ext4_mark_inode_dirty(handle, inode);
5081 if (credits)
5082 ret2 = ext4_journal_stop(handle);
5083 if (ret <= 0 || ret2)
5084 break;
5085 }
5086 if (!credits)
5087 ret2 = ext4_journal_stop(handle);
5088 return ret > 0 ? ret2 : ret;
5089}
5090
5091
5092
5093
5094
5095
5096
5097
5098
5099
5100static int ext4_find_delayed_extent(struct inode *inode,
5101 struct extent_status *newes)
5102{
5103 struct extent_status es;
5104 ext4_lblk_t block, next_del;
5105
5106 if (newes->es_pblk == 0) {
5107 ext4_es_find_delayed_extent_range(inode, newes->es_lblk,
5108 newes->es_lblk + newes->es_len - 1, &es);
5109
5110
5111
5112
5113
5114 if (es.es_len == 0)
5115
5116 return 0;
5117
5118 if (es.es_lblk > newes->es_lblk) {
5119
5120 newes->es_len = min(es.es_lblk - newes->es_lblk,
5121 newes->es_len);
5122 return 0;
5123 }
5124
5125 newes->es_len = es.es_lblk + es.es_len - newes->es_lblk;
5126 }
5127
5128 block = newes->es_lblk + newes->es_len;
5129 ext4_es_find_delayed_extent_range(inode, block, EXT_MAX_BLOCKS, &es);
5130 if (es.es_len == 0)
5131 next_del = EXT_MAX_BLOCKS;
5132 else
5133 next_del = es.es_lblk;
5134
5135 return next_del;
5136}
5137
5138#define EXT4_FIEMAP_FLAGS (FIEMAP_FLAG_SYNC|FIEMAP_FLAG_XATTR)
5139
5140static int ext4_xattr_fiemap(struct inode *inode,
5141 struct fiemap_extent_info *fieinfo)
5142{
5143 __u64 physical = 0;
5144 __u64 length;
5145 __u32 flags = FIEMAP_EXTENT_LAST;
5146 int blockbits = inode->i_sb->s_blocksize_bits;
5147 int error = 0;
5148
5149
5150 if (ext4_test_inode_state(inode, EXT4_STATE_XATTR)) {
5151 struct ext4_iloc iloc;
5152 int offset;
5153
5154 error = ext4_get_inode_loc(inode, &iloc);
5155 if (error)
5156 return error;
5157 physical = (__u64)iloc.bh->b_blocknr << blockbits;
5158 offset = EXT4_GOOD_OLD_INODE_SIZE +
5159 EXT4_I(inode)->i_extra_isize;
5160 physical += offset;
5161 length = EXT4_SB(inode->i_sb)->s_inode_size - offset;
5162 flags |= FIEMAP_EXTENT_DATA_INLINE;
5163 brelse(iloc.bh);
5164 } else {
5165 physical = (__u64)EXT4_I(inode)->i_file_acl << blockbits;
5166 length = inode->i_sb->s_blocksize;
5167 }
5168
5169 if (physical)
5170 error = fiemap_fill_next_extent(fieinfo, 0, physical,
5171 length, flags);
5172 return (error < 0 ? error : 0);
5173}
5174
5175int ext4_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo,
5176 __u64 start, __u64 len)
5177{
5178 ext4_lblk_t start_blk;
5179 int error = 0;
5180
5181 if (ext4_has_inline_data(inode)) {
5182 int has_inline = 1;
5183
5184 error = ext4_inline_data_fiemap(inode, fieinfo, &has_inline,
5185 start, len);
5186
5187 if (has_inline)
5188 return error;
5189 }
5190
5191 if (fieinfo->fi_flags & FIEMAP_FLAG_CACHE) {
5192 error = ext4_ext_precache(inode);
5193 if (error)
5194 return error;
5195 }
5196
5197
5198 if (!(ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS)))
5199 return generic_block_fiemap(inode, fieinfo, start, len,
5200 ext4_get_block);
5201
5202 if (fiemap_check_flags(fieinfo, EXT4_FIEMAP_FLAGS))
5203 return -EBADR;
5204
5205 if (fieinfo->fi_flags & FIEMAP_FLAG_XATTR) {
5206 error = ext4_xattr_fiemap(inode, fieinfo);
5207 } else {
5208 ext4_lblk_t len_blks;
5209 __u64 last_blk;
5210
5211 start_blk = start >> inode->i_sb->s_blocksize_bits;
5212 last_blk = (start + len - 1) >> inode->i_sb->s_blocksize_bits;
5213 if (last_blk >= EXT_MAX_BLOCKS)
5214 last_blk = EXT_MAX_BLOCKS-1;
5215 len_blks = ((ext4_lblk_t) last_blk) - start_blk + 1;
5216
5217
5218
5219
5220
5221 error = ext4_fill_fiemap_extents(inode, start_blk,
5222 len_blks, fieinfo);
5223 }
5224 return error;
5225}
5226
5227
5228
5229
5230
5231
5232
5233static int
5234ext4_access_path(handle_t *handle, struct inode *inode,
5235 struct ext4_ext_path *path)
5236{
5237 int credits, err;
5238
5239 if (!ext4_handle_valid(handle))
5240 return 0;
5241
5242
5243
5244
5245
5246
5247
5248 if (handle->h_buffer_credits < 7) {
5249 credits = ext4_writepage_trans_blocks(inode);
5250 err = ext4_ext_truncate_extend_restart(handle, inode, credits);
5251
5252 if (err && err != -EAGAIN)
5253 return err;
5254 }
5255
5256 err = ext4_ext_get_access(handle, inode, path);
5257 return err;
5258}
5259
5260
5261
5262
5263
5264
5265
5266static int
5267ext4_ext_shift_path_extents(struct ext4_ext_path *path, ext4_lblk_t shift,
5268 struct inode *inode, handle_t *handle,
5269 enum SHIFT_DIRECTION SHIFT)
5270{
5271 int depth, err = 0;
5272 struct ext4_extent *ex_start, *ex_last;
5273 bool update = 0;
5274 depth = path->p_depth;
5275
5276 while (depth >= 0) {
5277 if (depth == path->p_depth) {
5278 ex_start = path[depth].p_ext;
5279 if (!ex_start)
5280 return -EFSCORRUPTED;
5281
5282 ex_last = EXT_LAST_EXTENT(path[depth].p_hdr);
5283
5284 err = ext4_access_path(handle, inode, path + depth);
5285 if (err)
5286 goto out;
5287
5288 if (ex_start == EXT_FIRST_EXTENT(path[depth].p_hdr))
5289 update = 1;
5290
5291 while (ex_start <= ex_last) {
5292 if (SHIFT == SHIFT_LEFT) {
5293 le32_add_cpu(&ex_start->ee_block,
5294 -shift);
5295
5296 if ((ex_start >
5297 EXT_FIRST_EXTENT(path[depth].p_hdr))
5298 &&
5299 ext4_ext_try_to_merge_right(inode,
5300 path, ex_start - 1))
5301 ex_last--;
5302 else
5303 ex_start++;
5304 } else {
5305 le32_add_cpu(&ex_last->ee_block, shift);
5306 ext4_ext_try_to_merge_right(inode, path,
5307 ex_last);
5308 ex_last--;
5309 }
5310 }
5311 err = ext4_ext_dirty(handle, inode, path + depth);
5312 if (err)
5313 goto out;
5314
5315 if (--depth < 0 || !update)
5316 break;
5317 }
5318
5319
5320 err = ext4_access_path(handle, inode, path + depth);
5321 if (err)
5322 goto out;
5323
5324 if (SHIFT == SHIFT_LEFT)
5325 le32_add_cpu(&path[depth].p_idx->ei_block, -shift);
5326 else
5327 le32_add_cpu(&path[depth].p_idx->ei_block, shift);
5328 err = ext4_ext_dirty(handle, inode, path + depth);
5329 if (err)
5330 goto out;
5331
5332
5333 if (path[depth].p_idx != EXT_FIRST_INDEX(path[depth].p_hdr))
5334 break;
5335
5336 depth--;
5337 }
5338
5339out:
5340 return err;
5341}
5342
5343
5344
5345
5346
5347
5348
5349
5350static int
5351ext4_ext_shift_extents(struct inode *inode, handle_t *handle,
5352 ext4_lblk_t start, ext4_lblk_t shift,
5353 enum SHIFT_DIRECTION SHIFT)
5354{
5355 struct ext4_ext_path *path;
5356 int ret = 0, depth;
5357 struct ext4_extent *extent;
5358 ext4_lblk_t stop, *iterator, ex_start, ex_end;
5359
5360
5361 path = ext4_find_extent(inode, EXT_MAX_BLOCKS - 1, NULL, 0);
5362 if (IS_ERR(path))
5363 return PTR_ERR(path);
5364
5365 depth = path->p_depth;
5366 extent = path[depth].p_ext;
5367 if (!extent)
5368 goto out;
5369
5370 stop = le32_to_cpu(extent->ee_block) +
5371 ext4_ext_get_actual_len(extent);
5372
5373
5374
5375
5376
5377 if (SHIFT == SHIFT_LEFT) {
5378 path = ext4_find_extent(inode, start - 1, &path, 0);
5379 if (IS_ERR(path))
5380 return PTR_ERR(path);
5381 depth = path->p_depth;
5382 extent = path[depth].p_ext;
5383 if (extent) {
5384 ex_start = le32_to_cpu(extent->ee_block);
5385 ex_end = le32_to_cpu(extent->ee_block) +
5386 ext4_ext_get_actual_len(extent);
5387 } else {
5388 ex_start = 0;
5389 ex_end = 0;
5390 }
5391
5392 if ((start == ex_start && shift > ex_start) ||
5393 (shift > start - ex_end)) {
5394 ext4_ext_drop_refs(path);
5395 kfree(path);
5396 return -EINVAL;
5397 }
5398 }
5399
5400
5401
5402
5403
5404
5405 if (SHIFT == SHIFT_LEFT)
5406 iterator = &start;
5407 else
5408 iterator = &stop;
5409
5410
5411 while (start < stop) {
5412 path = ext4_find_extent(inode, *iterator, &path, 0);
5413 if (IS_ERR(path))
5414 return PTR_ERR(path);
5415 depth = path->p_depth;
5416 extent = path[depth].p_ext;
5417 if (!extent) {
5418 EXT4_ERROR_INODE(inode, "unexpected hole at %lu",
5419 (unsigned long) *iterator);
5420 return -EFSCORRUPTED;
5421 }
5422 if (SHIFT == SHIFT_LEFT && *iterator >
5423 le32_to_cpu(extent->ee_block)) {
5424
5425 if (extent < EXT_LAST_EXTENT(path[depth].p_hdr)) {
5426 path[depth].p_ext++;
5427 } else {
5428 *iterator = ext4_ext_next_allocated_block(path);
5429 continue;
5430 }
5431 }
5432
5433 if (SHIFT == SHIFT_LEFT) {
5434 extent = EXT_LAST_EXTENT(path[depth].p_hdr);
5435 *iterator = le32_to_cpu(extent->ee_block) +
5436 ext4_ext_get_actual_len(extent);
5437 } else {
5438 extent = EXT_FIRST_EXTENT(path[depth].p_hdr);
5439 *iterator = le32_to_cpu(extent->ee_block) > 0 ?
5440 le32_to_cpu(extent->ee_block) - 1 : 0;
5441
5442 while (le32_to_cpu(extent->ee_block) < start)
5443 extent++;
5444 path[depth].p_ext = extent;
5445 }
5446 ret = ext4_ext_shift_path_extents(path, shift, inode,
5447 handle, SHIFT);
5448 if (ret)
5449 break;
5450 }
5451out:
5452 ext4_ext_drop_refs(path);
5453 kfree(path);
5454 return ret;
5455}
5456
5457
5458
5459
5460
5461
5462int ext4_collapse_range(struct inode *inode, loff_t offset, loff_t len)
5463{
5464 struct super_block *sb = inode->i_sb;
5465 ext4_lblk_t punch_start, punch_stop;
5466 handle_t *handle;
5467 unsigned int credits;
5468 loff_t new_size, ioffset;
5469 int ret;
5470
5471
5472
5473
5474
5475
5476 if (!ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS))
5477 return -EOPNOTSUPP;
5478
5479
5480 if (offset & (EXT4_CLUSTER_SIZE(sb) - 1) ||
5481 len & (EXT4_CLUSTER_SIZE(sb) - 1))
5482 return -EINVAL;
5483
5484 if (!S_ISREG(inode->i_mode))
5485 return -EINVAL;
5486
5487 trace_ext4_collapse_range(inode, offset, len);
5488
5489 punch_start = offset >> EXT4_BLOCK_SIZE_BITS(sb);
5490 punch_stop = (offset + len) >> EXT4_BLOCK_SIZE_BITS(sb);
5491
5492
5493 if (ext4_should_journal_data(inode)) {
5494 ret = ext4_force_commit(inode->i_sb);
5495 if (ret)
5496 return ret;
5497 }
5498
5499 inode_lock(inode);
5500
5501
5502
5503
5504 if (offset + len >= i_size_read(inode)) {
5505 ret = -EINVAL;
5506 goto out_mutex;
5507 }
5508
5509
5510 if (!ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS)) {
5511 ret = -EOPNOTSUPP;
5512 goto out_mutex;
5513 }
5514
5515
5516 ext4_inode_block_unlocked_dio(inode);
5517 inode_dio_wait(inode);
5518
5519
5520
5521
5522
5523 down_write(&EXT4_I(inode)->i_mmap_sem);
5524
5525
5526
5527
5528 ioffset = round_down(offset, PAGE_SIZE);
5529
5530
5531
5532
5533 ret = filemap_write_and_wait_range(inode->i_mapping, ioffset, offset);
5534 if (ret)
5535 goto out_mmap;
5536
5537
5538
5539
5540
5541 ret = filemap_write_and_wait_range(inode->i_mapping, offset + len,
5542 LLONG_MAX);
5543 if (ret)
5544 goto out_mmap;
5545 truncate_pagecache(inode, ioffset);
5546
5547 credits = ext4_writepage_trans_blocks(inode);
5548 handle = ext4_journal_start(inode, EXT4_HT_TRUNCATE, credits);
5549 if (IS_ERR(handle)) {
5550 ret = PTR_ERR(handle);
5551 goto out_mmap;
5552 }
5553
5554 down_write(&EXT4_I(inode)->i_data_sem);
5555 ext4_discard_preallocations(inode);
5556
5557 ret = ext4_es_remove_extent(inode, punch_start,
5558 EXT_MAX_BLOCKS - punch_start);
5559 if (ret) {
5560 up_write(&EXT4_I(inode)->i_data_sem);
5561 goto out_stop;
5562 }
5563
5564 ret = ext4_ext_remove_space(inode, punch_start, punch_stop - 1);
5565 if (ret) {
5566 up_write(&EXT4_I(inode)->i_data_sem);
5567 goto out_stop;
5568 }
5569 ext4_discard_preallocations(inode);
5570
5571 ret = ext4_ext_shift_extents(inode, handle, punch_stop,
5572 punch_stop - punch_start, SHIFT_LEFT);
5573 if (ret) {
5574 up_write(&EXT4_I(inode)->i_data_sem);
5575 goto out_stop;
5576 }
5577
5578 new_size = i_size_read(inode) - len;
5579 i_size_write(inode, new_size);
5580 EXT4_I(inode)->i_disksize = new_size;
5581
5582 up_write(&EXT4_I(inode)->i_data_sem);
5583 if (IS_SYNC(inode))
5584 ext4_handle_sync(handle);
5585 inode->i_mtime = inode->i_ctime = ext4_current_time(inode);
5586 ext4_mark_inode_dirty(handle, inode);
5587
5588out_stop:
5589 ext4_journal_stop(handle);
5590out_mmap:
5591 up_write(&EXT4_I(inode)->i_mmap_sem);
5592 ext4_inode_resume_unlocked_dio(inode);
5593out_mutex:
5594 inode_unlock(inode);
5595 return ret;
5596}
5597
5598
5599
5600
5601
5602
5603
5604
5605
5606int ext4_insert_range(struct inode *inode, loff_t offset, loff_t len)
5607{
5608 struct super_block *sb = inode->i_sb;
5609 handle_t *handle;
5610 struct ext4_ext_path *path;
5611 struct ext4_extent *extent;
5612 ext4_lblk_t offset_lblk, len_lblk, ee_start_lblk = 0;
5613 unsigned int credits, ee_len;
5614 int ret = 0, depth, split_flag = 0;
5615 loff_t ioffset;
5616
5617
5618
5619
5620
5621
5622 if (!ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS))
5623 return -EOPNOTSUPP;
5624
5625
5626 if (offset & (EXT4_CLUSTER_SIZE(sb) - 1) ||
5627 len & (EXT4_CLUSTER_SIZE(sb) - 1))
5628 return -EINVAL;
5629
5630 if (!S_ISREG(inode->i_mode))
5631 return -EOPNOTSUPP;
5632
5633 trace_ext4_insert_range(inode, offset, len);
5634
5635 offset_lblk = offset >> EXT4_BLOCK_SIZE_BITS(sb);
5636 len_lblk = len >> EXT4_BLOCK_SIZE_BITS(sb);
5637
5638
5639 if (ext4_should_journal_data(inode)) {
5640 ret = ext4_force_commit(inode->i_sb);
5641 if (ret)
5642 return ret;
5643 }
5644
5645 inode_lock(inode);
5646
5647 if (!ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS)) {
5648 ret = -EOPNOTSUPP;
5649 goto out_mutex;
5650 }
5651
5652
5653 if (inode->i_size + len > inode->i_sb->s_maxbytes) {
5654 ret = -EFBIG;
5655 goto out_mutex;
5656 }
5657
5658
5659 if (offset >= i_size_read(inode)) {
5660 ret = -EINVAL;
5661 goto out_mutex;
5662 }
5663
5664
5665 ext4_inode_block_unlocked_dio(inode);
5666 inode_dio_wait(inode);
5667
5668
5669
5670
5671
5672 down_write(&EXT4_I(inode)->i_mmap_sem);
5673
5674
5675
5676
5677 ioffset = round_down(offset, PAGE_SIZE);
5678
5679 ret = filemap_write_and_wait_range(inode->i_mapping, ioffset,
5680 LLONG_MAX);
5681 if (ret)
5682 goto out_mmap;
5683 truncate_pagecache(inode, ioffset);
5684
5685 credits = ext4_writepage_trans_blocks(inode);
5686 handle = ext4_journal_start(inode, EXT4_HT_TRUNCATE, credits);
5687 if (IS_ERR(handle)) {
5688 ret = PTR_ERR(handle);
5689 goto out_mmap;
5690 }
5691
5692
5693 inode->i_size += len;
5694 EXT4_I(inode)->i_disksize += len;
5695 inode->i_mtime = inode->i_ctime = ext4_current_time(inode);
5696 ret = ext4_mark_inode_dirty(handle, inode);
5697 if (ret)
5698 goto out_stop;
5699
5700 down_write(&EXT4_I(inode)->i_data_sem);
5701 ext4_discard_preallocations(inode);
5702
5703 path = ext4_find_extent(inode, offset_lblk, NULL, 0);
5704 if (IS_ERR(path)) {
5705 up_write(&EXT4_I(inode)->i_data_sem);
5706 goto out_stop;
5707 }
5708
5709 depth = ext_depth(inode);
5710 extent = path[depth].p_ext;
5711 if (extent) {
5712 ee_start_lblk = le32_to_cpu(extent->ee_block);
5713 ee_len = ext4_ext_get_actual_len(extent);
5714
5715
5716
5717
5718
5719 if ((offset_lblk > ee_start_lblk) &&
5720 (offset_lblk < (ee_start_lblk + ee_len))) {
5721 if (ext4_ext_is_unwritten(extent))
5722 split_flag = EXT4_EXT_MARK_UNWRIT1 |
5723 EXT4_EXT_MARK_UNWRIT2;
5724 ret = ext4_split_extent_at(handle, inode, &path,
5725 offset_lblk, split_flag,
5726 EXT4_EX_NOCACHE |
5727 EXT4_GET_BLOCKS_PRE_IO |
5728 EXT4_GET_BLOCKS_METADATA_NOFAIL);
5729 }
5730
5731 ext4_ext_drop_refs(path);
5732 kfree(path);
5733 if (ret < 0) {
5734 up_write(&EXT4_I(inode)->i_data_sem);
5735 goto out_stop;
5736 }
5737 }
5738
5739 ret = ext4_es_remove_extent(inode, offset_lblk,
5740 EXT_MAX_BLOCKS - offset_lblk);
5741 if (ret) {
5742 up_write(&EXT4_I(inode)->i_data_sem);
5743 goto out_stop;
5744 }
5745
5746
5747
5748
5749
5750 ret = ext4_ext_shift_extents(inode, handle,
5751 ee_start_lblk > offset_lblk ? ee_start_lblk : offset_lblk,
5752 len_lblk, SHIFT_RIGHT);
5753
5754 up_write(&EXT4_I(inode)->i_data_sem);
5755 if (IS_SYNC(inode))
5756 ext4_handle_sync(handle);
5757
5758out_stop:
5759 ext4_journal_stop(handle);
5760out_mmap:
5761 up_write(&EXT4_I(inode)->i_mmap_sem);
5762 ext4_inode_resume_unlocked_dio(inode);
5763out_mutex:
5764 inode_unlock(inode);
5765 return ret;
5766}
5767
5768
5769
5770
5771
5772
5773
5774
5775
5776
5777
5778
5779
5780
5781
5782
5783
5784
5785
5786
5787
5788int
5789ext4_swap_extents(handle_t *handle, struct inode *inode1,
5790 struct inode *inode2, ext4_lblk_t lblk1, ext4_lblk_t lblk2,
5791 ext4_lblk_t count, int unwritten, int *erp)
5792{
5793 struct ext4_ext_path *path1 = NULL;
5794 struct ext4_ext_path *path2 = NULL;
5795 int replaced_count = 0;
5796
5797 BUG_ON(!rwsem_is_locked(&EXT4_I(inode1)->i_data_sem));
5798 BUG_ON(!rwsem_is_locked(&EXT4_I(inode2)->i_data_sem));
5799 BUG_ON(!inode_is_locked(inode1));
5800 BUG_ON(!inode_is_locked(inode2));
5801
5802 *erp = ext4_es_remove_extent(inode1, lblk1, count);
5803 if (unlikely(*erp))
5804 return 0;
5805 *erp = ext4_es_remove_extent(inode2, lblk2, count);
5806 if (unlikely(*erp))
5807 return 0;
5808
5809 while (count) {
5810 struct ext4_extent *ex1, *ex2, tmp_ex;
5811 ext4_lblk_t e1_blk, e2_blk;
5812 int e1_len, e2_len, len;
5813 int split = 0;
5814
5815 path1 = ext4_find_extent(inode1, lblk1, NULL, EXT4_EX_NOCACHE);
5816 if (IS_ERR(path1)) {
5817 *erp = PTR_ERR(path1);
5818 path1 = NULL;
5819 finish:
5820 count = 0;
5821 goto repeat;
5822 }
5823 path2 = ext4_find_extent(inode2, lblk2, NULL, EXT4_EX_NOCACHE);
5824 if (IS_ERR(path2)) {
5825 *erp = PTR_ERR(path2);
5826 path2 = NULL;
5827 goto finish;
5828 }
5829 ex1 = path1[path1->p_depth].p_ext;
5830 ex2 = path2[path2->p_depth].p_ext;
5831
5832 if (unlikely(!ex2 || !ex1))
5833 goto finish;
5834
5835 e1_blk = le32_to_cpu(ex1->ee_block);
5836 e2_blk = le32_to_cpu(ex2->ee_block);
5837 e1_len = ext4_ext_get_actual_len(ex1);
5838 e2_len = ext4_ext_get_actual_len(ex2);
5839
5840
5841 if (!in_range(lblk1, e1_blk, e1_len) ||
5842 !in_range(lblk2, e2_blk, e2_len)) {
5843 ext4_lblk_t next1, next2;
5844
5845
5846 next1 = ext4_ext_next_allocated_block(path1);
5847 next2 = ext4_ext_next_allocated_block(path2);
5848
5849 if (e1_blk > lblk1)
5850 next1 = e1_blk;
5851 if (e2_blk > lblk2)
5852 next2 = e1_blk;
5853
5854 if (next1 == EXT_MAX_BLOCKS || next2 == EXT_MAX_BLOCKS)
5855 goto finish;
5856
5857 len = next1 - lblk1;
5858 if (len < next2 - lblk2)
5859 len = next2 - lblk2;
5860 if (len > count)
5861 len = count;
5862 lblk1 += len;
5863 lblk2 += len;
5864 count -= len;
5865 goto repeat;
5866 }
5867
5868
5869 if (e1_blk < lblk1) {
5870 split = 1;
5871 *erp = ext4_force_split_extent_at(handle, inode1,
5872 &path1, lblk1, 0);
5873 if (unlikely(*erp))
5874 goto finish;
5875 }
5876 if (e2_blk < lblk2) {
5877 split = 1;
5878 *erp = ext4_force_split_extent_at(handle, inode2,
5879 &path2, lblk2, 0);
5880 if (unlikely(*erp))
5881 goto finish;
5882 }
5883
5884
5885 if (split)
5886 goto repeat;
5887
5888
5889 len = count;
5890 if (len > e1_blk + e1_len - lblk1)
5891 len = e1_blk + e1_len - lblk1;
5892 if (len > e2_blk + e2_len - lblk2)
5893 len = e2_blk + e2_len - lblk2;
5894
5895 if (len != e1_len) {
5896 split = 1;
5897 *erp = ext4_force_split_extent_at(handle, inode1,
5898 &path1, lblk1 + len, 0);
5899 if (unlikely(*erp))
5900 goto finish;
5901 }
5902 if (len != e2_len) {
5903 split = 1;
5904 *erp = ext4_force_split_extent_at(handle, inode2,
5905 &path2, lblk2 + len, 0);
5906 if (*erp)
5907 goto finish;
5908 }
5909
5910
5911 if (split)
5912 goto repeat;
5913
5914 BUG_ON(e2_len != e1_len);
5915 *erp = ext4_ext_get_access(handle, inode1, path1 + path1->p_depth);
5916 if (unlikely(*erp))
5917 goto finish;
5918 *erp = ext4_ext_get_access(handle, inode2, path2 + path2->p_depth);
5919 if (unlikely(*erp))
5920 goto finish;
5921
5922
5923 tmp_ex = *ex1;
5924 ext4_ext_store_pblock(ex1, ext4_ext_pblock(ex2));
5925 ext4_ext_store_pblock(ex2, ext4_ext_pblock(&tmp_ex));
5926 ex1->ee_len = cpu_to_le16(e2_len);
5927 ex2->ee_len = cpu_to_le16(e1_len);
5928 if (unwritten)
5929 ext4_ext_mark_unwritten(ex2);
5930 if (ext4_ext_is_unwritten(&tmp_ex))
5931 ext4_ext_mark_unwritten(ex1);
5932
5933 ext4_ext_try_to_merge(handle, inode2, path2, ex2);
5934 ext4_ext_try_to_merge(handle, inode1, path1, ex1);
5935 *erp = ext4_ext_dirty(handle, inode2, path2 +
5936 path2->p_depth);
5937 if (unlikely(*erp))
5938 goto finish;
5939 *erp = ext4_ext_dirty(handle, inode1, path1 +
5940 path1->p_depth);
5941
5942
5943
5944
5945
5946
5947 if (unlikely(*erp))
5948 goto finish;
5949 lblk1 += len;
5950 lblk2 += len;
5951 replaced_count += len;
5952 count -= len;
5953
5954 repeat:
5955 ext4_ext_drop_refs(path1);
5956 kfree(path1);
5957 ext4_ext_drop_refs(path2);
5958 kfree(path2);
5959 path1 = path2 = NULL;
5960 }
5961 return replaced_count;
5962}
5963