1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23#include "ext4_jbd2.h"
24#include "truncate.h"
25
26#include <trace/events/ext4.h>
27
28typedef struct {
29 __le32 *p;
30 __le32 key;
31 struct buffer_head *bh;
32} Indirect;
33
34static inline void add_chain(Indirect *p, struct buffer_head *bh, __le32 *v)
35{
36 p->key = *(p->p = v);
37 p->bh = bh;
38}
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71static int ext4_block_to_path(struct inode *inode,
72 ext4_lblk_t i_block,
73 ext4_lblk_t offsets[4], int *boundary)
74{
75 int ptrs = EXT4_ADDR_PER_BLOCK(inode->i_sb);
76 int ptrs_bits = EXT4_ADDR_PER_BLOCK_BITS(inode->i_sb);
77 const long direct_blocks = EXT4_NDIR_BLOCKS,
78 indirect_blocks = ptrs,
79 double_blocks = (1 << (ptrs_bits * 2));
80 int n = 0;
81 int final = 0;
82
83 if (i_block < direct_blocks) {
84 offsets[n++] = i_block;
85 final = direct_blocks;
86 } else if ((i_block -= direct_blocks) < indirect_blocks) {
87 offsets[n++] = EXT4_IND_BLOCK;
88 offsets[n++] = i_block;
89 final = ptrs;
90 } else if ((i_block -= indirect_blocks) < double_blocks) {
91 offsets[n++] = EXT4_DIND_BLOCK;
92 offsets[n++] = i_block >> ptrs_bits;
93 offsets[n++] = i_block & (ptrs - 1);
94 final = ptrs;
95 } else if (((i_block -= double_blocks) >> (ptrs_bits * 2)) < ptrs) {
96 offsets[n++] = EXT4_TIND_BLOCK;
97 offsets[n++] = i_block >> (ptrs_bits * 2);
98 offsets[n++] = (i_block >> ptrs_bits) & (ptrs - 1);
99 offsets[n++] = i_block & (ptrs - 1);
100 final = ptrs;
101 } else {
102 ext4_warning(inode->i_sb, "block %lu > max in inode %lu",
103 i_block + direct_blocks +
104 indirect_blocks + double_blocks, inode->i_ino);
105 }
106 if (boundary)
107 *boundary = final - 1 - (i_block & (ptrs - 1));
108 return n;
109}
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141static Indirect *ext4_get_branch(struct inode *inode, int depth,
142 ext4_lblk_t *offsets,
143 Indirect chain[4], int *err)
144{
145 struct super_block *sb = inode->i_sb;
146 Indirect *p = chain;
147 struct buffer_head *bh;
148
149 *err = 0;
150
151 add_chain(chain, NULL, EXT4_I(inode)->i_data + *offsets);
152 if (!p->key)
153 goto no_block;
154 while (--depth) {
155 bh = sb_getblk(sb, le32_to_cpu(p->key));
156 if (unlikely(!bh))
157 goto failure;
158
159 if (!bh_uptodate_or_lock(bh)) {
160 if (bh_submit_read(bh) < 0) {
161 put_bh(bh);
162 goto failure;
163 }
164
165 if (ext4_check_indirect_blockref(inode, bh)) {
166 put_bh(bh);
167 goto failure;
168 }
169 }
170
171 add_chain(++p, bh, (__le32 *)bh->b_data + *++offsets);
172
173 if (!p->key)
174 goto no_block;
175 }
176 return NULL;
177
178failure:
179 *err = -EIO;
180no_block:
181 return p;
182}
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204static ext4_fsblk_t ext4_find_near(struct inode *inode, Indirect *ind)
205{
206 struct ext4_inode_info *ei = EXT4_I(inode);
207 __le32 *start = ind->bh ? (__le32 *) ind->bh->b_data : ei->i_data;
208 __le32 *p;
209
210
211 for (p = ind->p - 1; p >= start; p--) {
212 if (*p)
213 return le32_to_cpu(*p);
214 }
215
216
217 if (ind->bh)
218 return ind->bh->b_blocknr;
219
220
221
222
223
224 return ext4_inode_to_goal_block(inode);
225}
226
227
228
229
230
231
232
233
234
235
236
237
238static ext4_fsblk_t ext4_find_goal(struct inode *inode, ext4_lblk_t block,
239 Indirect *partial)
240{
241 ext4_fsblk_t goal;
242
243
244
245
246
247 goal = ext4_find_near(inode, partial);
248 goal = goal & EXT4_MAX_BLOCK_FILE_PHYS;
249 return goal;
250}
251
252
253
254
255
256
257
258
259
260
261
262
263
264static int ext4_blks_to_allocate(Indirect *branch, int k, unsigned int blks,
265 int blocks_to_boundary)
266{
267 unsigned int count = 0;
268
269
270
271
272
273 if (k > 0) {
274
275 if (blks < blocks_to_boundary + 1)
276 count += blks;
277 else
278 count += blocks_to_boundary + 1;
279 return count;
280 }
281
282 count++;
283 while (count < blks && count <= blocks_to_boundary &&
284 le32_to_cpu(*(branch[0].p + count)) == 0) {
285 count++;
286 }
287 return count;
288}
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306static int ext4_alloc_blocks(handle_t *handle, struct inode *inode,
307 ext4_lblk_t iblock, ext4_fsblk_t goal,
308 int indirect_blks, int blks,
309 ext4_fsblk_t new_blocks[4], int *err)
310{
311 struct ext4_allocation_request ar;
312 int target, i;
313 unsigned long count = 0, blk_allocated = 0;
314 int index = 0;
315 ext4_fsblk_t current_block = 0;
316 int ret = 0;
317
318
319
320
321
322
323
324
325
326
327 target = indirect_blks;
328 while (target > 0) {
329 count = target;
330
331 current_block = ext4_new_meta_blocks(handle, inode, goal,
332 0, &count, err);
333 if (*err)
334 goto failed_out;
335
336 if (unlikely(current_block + count > EXT4_MAX_BLOCK_FILE_PHYS)) {
337 EXT4_ERROR_INODE(inode,
338 "current_block %llu + count %lu > %d!",
339 current_block, count,
340 EXT4_MAX_BLOCK_FILE_PHYS);
341 *err = -EIO;
342 goto failed_out;
343 }
344
345 target -= count;
346
347 while (index < indirect_blks && count) {
348 new_blocks[index++] = current_block++;
349 count--;
350 }
351 if (count > 0) {
352
353
354
355
356 new_blocks[index] = current_block;
357 printk(KERN_INFO "%s returned more blocks than "
358 "requested\n", __func__);
359 WARN_ON(1);
360 break;
361 }
362 }
363
364 target = blks - count ;
365 blk_allocated = count;
366 if (!target)
367 goto allocated;
368
369 memset(&ar, 0, sizeof(ar));
370 ar.inode = inode;
371 ar.goal = goal;
372 ar.len = target;
373 ar.logical = iblock;
374 if (S_ISREG(inode->i_mode))
375
376 ar.flags = EXT4_MB_HINT_DATA;
377
378 current_block = ext4_mb_new_blocks(handle, &ar, err);
379 if (unlikely(current_block + ar.len > EXT4_MAX_BLOCK_FILE_PHYS)) {
380 EXT4_ERROR_INODE(inode,
381 "current_block %llu + ar.len %d > %d!",
382 current_block, ar.len,
383 EXT4_MAX_BLOCK_FILE_PHYS);
384 *err = -EIO;
385 goto failed_out;
386 }
387
388 if (*err && (target == blks)) {
389
390
391
392
393 goto failed_out;
394 }
395 if (!*err) {
396 if (target == blks) {
397
398
399
400
401 new_blocks[index] = current_block;
402 }
403 blk_allocated += ar.len;
404 }
405allocated:
406
407 ret = blk_allocated;
408 *err = 0;
409 return ret;
410failed_out:
411 for (i = 0; i < index; i++)
412 ext4_free_blocks(handle, inode, NULL, new_blocks[i], 1, 0);
413 return ret;
414}
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443static int ext4_alloc_branch(handle_t *handle, struct inode *inode,
444 ext4_lblk_t iblock, int indirect_blks,
445 int *blks, ext4_fsblk_t goal,
446 ext4_lblk_t *offsets, Indirect *branch)
447{
448 int blocksize = inode->i_sb->s_blocksize;
449 int i, n = 0;
450 int err = 0;
451 struct buffer_head *bh;
452 int num;
453 ext4_fsblk_t new_blocks[4];
454 ext4_fsblk_t current_block;
455
456 num = ext4_alloc_blocks(handle, inode, iblock, goal, indirect_blks,
457 *blks, new_blocks, &err);
458 if (err)
459 return err;
460
461 branch[0].key = cpu_to_le32(new_blocks[0]);
462
463
464
465 for (n = 1; n <= indirect_blks; n++) {
466
467
468
469
470
471 bh = sb_getblk(inode->i_sb, new_blocks[n-1]);
472 if (unlikely(!bh)) {
473 err = -EIO;
474 goto failed;
475 }
476
477 branch[n].bh = bh;
478 lock_buffer(bh);
479 BUFFER_TRACE(bh, "call get_create_access");
480 err = ext4_journal_get_create_access(handle, bh);
481 if (err) {
482
483
484 unlock_buffer(bh);
485 goto failed;
486 }
487
488 memset(bh->b_data, 0, blocksize);
489 branch[n].p = (__le32 *) bh->b_data + offsets[n];
490 branch[n].key = cpu_to_le32(new_blocks[n]);
491 *branch[n].p = branch[n].key;
492 if (n == indirect_blks) {
493 current_block = new_blocks[n];
494
495
496
497
498
499 for (i = 1; i < num; i++)
500 *(branch[n].p + i) = cpu_to_le32(++current_block);
501 }
502 BUFFER_TRACE(bh, "marking uptodate");
503 set_buffer_uptodate(bh);
504 unlock_buffer(bh);
505
506 BUFFER_TRACE(bh, "call ext4_handle_dirty_metadata");
507 err = ext4_handle_dirty_metadata(handle, inode, bh);
508 if (err)
509 goto failed;
510 }
511 *blks = num;
512 return err;
513failed:
514
515 ext4_free_blocks(handle, inode, NULL, new_blocks[0], 1, 0);
516 for (i = 1; i <= n ; i++) {
517
518
519
520
521
522 ext4_free_blocks(handle, inode, NULL, new_blocks[i], 1,
523 EXT4_FREE_BLOCKS_FORGET);
524 }
525 for (i = n+1; i < indirect_blks; i++)
526 ext4_free_blocks(handle, inode, NULL, new_blocks[i], 1, 0);
527
528 ext4_free_blocks(handle, inode, NULL, new_blocks[i], num, 0);
529
530 return err;
531}
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548static int ext4_splice_branch(handle_t *handle, struct inode *inode,
549 ext4_lblk_t block, Indirect *where, int num,
550 int blks)
551{
552 int i;
553 int err = 0;
554 ext4_fsblk_t current_block;
555
556
557
558
559
560
561 if (where->bh) {
562 BUFFER_TRACE(where->bh, "get_write_access");
563 err = ext4_journal_get_write_access(handle, where->bh);
564 if (err)
565 goto err_out;
566 }
567
568
569 *where->p = where->key;
570
571
572
573
574
575 if (num == 0 && blks > 1) {
576 current_block = le32_to_cpu(where->key) + 1;
577 for (i = 1; i < blks; i++)
578 *(where->p + i) = cpu_to_le32(current_block++);
579 }
580
581
582
583 if (where->bh) {
584
585
586
587
588
589
590
591
592 jbd_debug(5, "splicing indirect only\n");
593 BUFFER_TRACE(where->bh, "call ext4_handle_dirty_metadata");
594 err = ext4_handle_dirty_metadata(handle, inode, where->bh);
595 if (err)
596 goto err_out;
597 } else {
598
599
600
601 ext4_mark_inode_dirty(handle, inode);
602 jbd_debug(5, "splicing direct\n");
603 }
604 return err;
605
606err_out:
607 for (i = 1; i <= num; i++) {
608
609
610
611
612
613 ext4_free_blocks(handle, inode, where[i].bh, 0, 1,
614 EXT4_FREE_BLOCKS_FORGET);
615 }
616 ext4_free_blocks(handle, inode, NULL, le32_to_cpu(where[num].key),
617 blks, 0);
618
619 return err;
620}
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650int ext4_ind_map_blocks(handle_t *handle, struct inode *inode,
651 struct ext4_map_blocks *map,
652 int flags)
653{
654 int err = -EIO;
655 ext4_lblk_t offsets[4];
656 Indirect chain[4];
657 Indirect *partial;
658 ext4_fsblk_t goal;
659 int indirect_blks;
660 int blocks_to_boundary = 0;
661 int depth;
662 int count = 0;
663 ext4_fsblk_t first_block = 0;
664
665 trace_ext4_ind_map_blocks_enter(inode, map->m_lblk, map->m_len, flags);
666 J_ASSERT(!(ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS)));
667 J_ASSERT(handle != NULL || (flags & EXT4_GET_BLOCKS_CREATE) == 0);
668 depth = ext4_block_to_path(inode, map->m_lblk, offsets,
669 &blocks_to_boundary);
670
671 if (depth == 0)
672 goto out;
673
674 partial = ext4_get_branch(inode, depth, offsets, chain, &err);
675
676
677 if (!partial) {
678 first_block = le32_to_cpu(chain[depth - 1].key);
679 count++;
680
681 while (count < map->m_len && count <= blocks_to_boundary) {
682 ext4_fsblk_t blk;
683
684 blk = le32_to_cpu(*(chain[depth-1].p + count));
685
686 if (blk == first_block + count)
687 count++;
688 else
689 break;
690 }
691 goto got_it;
692 }
693
694
695 if ((flags & EXT4_GET_BLOCKS_CREATE) == 0 || err == -EIO)
696 goto cleanup;
697
698
699
700
701 if (EXT4_HAS_RO_COMPAT_FEATURE(inode->i_sb,
702 EXT4_FEATURE_RO_COMPAT_BIGALLOC)) {
703 EXT4_ERROR_INODE(inode, "Can't allocate blocks for "
704 "non-extent mapped inodes with bigalloc");
705 return -ENOSPC;
706 }
707
708 goal = ext4_find_goal(inode, map->m_lblk, partial);
709
710
711 indirect_blks = (chain + depth) - partial - 1;
712
713
714
715
716
717 count = ext4_blks_to_allocate(partial, indirect_blks,
718 map->m_len, blocks_to_boundary);
719
720
721
722 err = ext4_alloc_branch(handle, inode, map->m_lblk, indirect_blks,
723 &count, goal,
724 offsets + (partial - chain), partial);
725
726
727
728
729
730
731
732
733 if (!err)
734 err = ext4_splice_branch(handle, inode, map->m_lblk,
735 partial, indirect_blks, count);
736 if (err)
737 goto cleanup;
738
739 map->m_flags |= EXT4_MAP_NEW;
740
741 ext4_update_inode_fsync_trans(handle, inode, 1);
742got_it:
743 map->m_flags |= EXT4_MAP_MAPPED;
744 map->m_pblk = le32_to_cpu(chain[depth-1].key);
745 map->m_len = count;
746 if (count > blocks_to_boundary)
747 map->m_flags |= EXT4_MAP_BOUNDARY;
748 err = count;
749
750 partial = chain + depth - 1;
751cleanup:
752 while (partial > chain) {
753 BUFFER_TRACE(partial->bh, "call brelse");
754 brelse(partial->bh);
755 partial--;
756 }
757out:
758 trace_ext4_ind_map_blocks_exit(inode, map->m_lblk,
759 map->m_pblk, map->m_len, err);
760 return err;
761}
762
763
764
765
766
767
768
769
770
771
772
773
774ssize_t ext4_ind_direct_IO(int rw, struct kiocb *iocb,
775 const struct iovec *iov, loff_t offset,
776 unsigned long nr_segs)
777{
778 struct file *file = iocb->ki_filp;
779 struct inode *inode = file->f_mapping->host;
780 struct ext4_inode_info *ei = EXT4_I(inode);
781 handle_t *handle;
782 ssize_t ret;
783 int orphan = 0;
784 size_t count = iov_length(iov, nr_segs);
785 int retries = 0;
786
787 if (rw == WRITE) {
788 loff_t final_size = offset + count;
789
790 if (final_size > inode->i_size) {
791
792 handle = ext4_journal_start(inode, 2);
793 if (IS_ERR(handle)) {
794 ret = PTR_ERR(handle);
795 goto out;
796 }
797 ret = ext4_orphan_add(handle, inode);
798 if (ret) {
799 ext4_journal_stop(handle);
800 goto out;
801 }
802 orphan = 1;
803 ei->i_disksize = inode->i_size;
804 ext4_journal_stop(handle);
805 }
806 }
807
808retry:
809 if (rw == READ && ext4_should_dioread_nolock(inode)) {
810 if (unlikely(!list_empty(&ei->i_completed_io_list))) {
811 mutex_lock(&inode->i_mutex);
812 ext4_flush_completed_IO(inode);
813 mutex_unlock(&inode->i_mutex);
814 }
815 ret = __blockdev_direct_IO(rw, iocb, inode,
816 inode->i_sb->s_bdev, iov,
817 offset, nr_segs,
818 ext4_get_block, NULL, NULL, 0);
819 } else {
820 ret = blockdev_direct_IO(rw, iocb, inode, iov,
821 offset, nr_segs, ext4_get_block);
822
823 if (unlikely((rw & WRITE) && ret < 0)) {
824 loff_t isize = i_size_read(inode);
825 loff_t end = offset + iov_length(iov, nr_segs);
826
827 if (end > isize)
828 ext4_truncate_failed_write(inode);
829 }
830 }
831 if (ret == -ENOSPC && ext4_should_retry_alloc(inode->i_sb, &retries))
832 goto retry;
833
834 if (orphan) {
835 int err;
836
837
838 handle = ext4_journal_start(inode, 2);
839 if (IS_ERR(handle)) {
840
841
842
843 ret = PTR_ERR(handle);
844 if (inode->i_nlink)
845 ext4_orphan_del(NULL, inode);
846
847 goto out;
848 }
849 if (inode->i_nlink)
850 ext4_orphan_del(handle, inode);
851 if (ret > 0) {
852 loff_t end = offset + ret;
853 if (end > inode->i_size) {
854 ei->i_disksize = end;
855 i_size_write(inode, end);
856
857
858
859
860
861
862
863 ext4_mark_inode_dirty(handle, inode);
864 }
865 }
866 err = ext4_journal_stop(handle);
867 if (ret == 0)
868 ret = err;
869 }
870out:
871 return ret;
872}
873
874
875
876
877
878int ext4_ind_calc_metadata_amount(struct inode *inode, sector_t lblock)
879{
880 struct ext4_inode_info *ei = EXT4_I(inode);
881 sector_t dind_mask = ~((sector_t)EXT4_ADDR_PER_BLOCK(inode->i_sb) - 1);
882 int blk_bits;
883
884 if (lblock < EXT4_NDIR_BLOCKS)
885 return 0;
886
887 lblock -= EXT4_NDIR_BLOCKS;
888
889 if (ei->i_da_metadata_calc_len &&
890 (lblock & dind_mask) == ei->i_da_metadata_calc_last_lblock) {
891 ei->i_da_metadata_calc_len++;
892 return 0;
893 }
894 ei->i_da_metadata_calc_last_lblock = lblock & dind_mask;
895 ei->i_da_metadata_calc_len = 1;
896 blk_bits = order_base_2(lblock);
897 return (blk_bits / EXT4_ADDR_PER_BLOCK_BITS(inode->i_sb)) + 1;
898}
899
900int ext4_ind_trans_blocks(struct inode *inode, int nrblocks, int chunk)
901{
902 int indirects;
903
904
905 if (chunk) {
906
907
908
909
910
911 return DIV_ROUND_UP(nrblocks,
912 EXT4_ADDR_PER_BLOCK(inode->i_sb)) + 4;
913 }
914
915
916
917
918
919 indirects = nrblocks * 2 + 1;
920 return indirects;
921}
922
923
924
925
926
927
928
929
930
931
932
933static handle_t *start_transaction(struct inode *inode)
934{
935 handle_t *result;
936
937 result = ext4_journal_start(inode, ext4_blocks_for_truncate(inode));
938 if (!IS_ERR(result))
939 return result;
940
941 ext4_std_error(inode->i_sb, PTR_ERR(result));
942 return result;
943}
944
945
946
947
948
949
950
951static int try_to_extend_transaction(handle_t *handle, struct inode *inode)
952{
953 if (!ext4_handle_valid(handle))
954 return 0;
955 if (ext4_handle_has_enough_credits(handle, EXT4_RESERVE_TRANS_BLOCKS+1))
956 return 0;
957 if (!ext4_journal_extend(handle, ext4_blocks_for_truncate(inode)))
958 return 0;
959 return 1;
960}
961
962
963
964
965
966
967static inline int all_zeroes(__le32 *p, __le32 *q)
968{
969 while (p < q)
970 if (*p++)
971 return 0;
972 return 1;
973}
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010static Indirect *ext4_find_shared(struct inode *inode, int depth,
1011 ext4_lblk_t offsets[4], Indirect chain[4],
1012 __le32 *top)
1013{
1014 Indirect *partial, *p;
1015 int k, err;
1016
1017 *top = 0;
1018
1019 for (k = depth; k > 1 && !offsets[k-1]; k--)
1020 ;
1021 partial = ext4_get_branch(inode, k, offsets, chain, &err);
1022
1023 if (!partial)
1024 partial = chain + k-1;
1025
1026
1027
1028
1029 if (!partial->key && *partial->p)
1030
1031 goto no_top;
1032 for (p = partial; (p > chain) && all_zeroes((__le32 *) p->bh->b_data, p->p); p--)
1033 ;
1034
1035
1036
1037
1038
1039
1040 if (p == chain + k - 1 && p > chain) {
1041 p->p--;
1042 } else {
1043 *top = *p->p;
1044
1045#if 0
1046 *p->p = 0;
1047#endif
1048 }
1049
1050
1051 while (partial > p) {
1052 brelse(partial->bh);
1053 partial--;
1054 }
1055no_top:
1056 return partial;
1057}
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070static int ext4_clear_blocks(handle_t *handle, struct inode *inode,
1071 struct buffer_head *bh,
1072 ext4_fsblk_t block_to_free,
1073 unsigned long count, __le32 *first,
1074 __le32 *last)
1075{
1076 __le32 *p;
1077 int flags = EXT4_FREE_BLOCKS_FORGET | EXT4_FREE_BLOCKS_VALIDATED;
1078 int err;
1079
1080 if (S_ISDIR(inode->i_mode) || S_ISLNK(inode->i_mode))
1081 flags |= EXT4_FREE_BLOCKS_METADATA;
1082
1083 if (!ext4_data_block_valid(EXT4_SB(inode->i_sb), block_to_free,
1084 count)) {
1085 EXT4_ERROR_INODE(inode, "attempt to clear invalid "
1086 "blocks %llu len %lu",
1087 (unsigned long long) block_to_free, count);
1088 return 1;
1089 }
1090
1091 if (try_to_extend_transaction(handle, inode)) {
1092 if (bh) {
1093 BUFFER_TRACE(bh, "call ext4_handle_dirty_metadata");
1094 err = ext4_handle_dirty_metadata(handle, inode, bh);
1095 if (unlikely(err))
1096 goto out_err;
1097 }
1098 err = ext4_mark_inode_dirty(handle, inode);
1099 if (unlikely(err))
1100 goto out_err;
1101 err = ext4_truncate_restart_trans(handle, inode,
1102 ext4_blocks_for_truncate(inode));
1103 if (unlikely(err))
1104 goto out_err;
1105 if (bh) {
1106 BUFFER_TRACE(bh, "retaking write access");
1107 err = ext4_journal_get_write_access(handle, bh);
1108 if (unlikely(err))
1109 goto out_err;
1110 }
1111 }
1112
1113 for (p = first; p < last; p++)
1114 *p = 0;
1115
1116 ext4_free_blocks(handle, inode, NULL, block_to_free, count, flags);
1117 return 0;
1118out_err:
1119 ext4_std_error(inode->i_sb, err);
1120 return err;
1121}
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142static void ext4_free_data(handle_t *handle, struct inode *inode,
1143 struct buffer_head *this_bh,
1144 __le32 *first, __le32 *last)
1145{
1146 ext4_fsblk_t block_to_free = 0;
1147 unsigned long count = 0;
1148 __le32 *block_to_free_p = NULL;
1149
1150
1151 ext4_fsblk_t nr;
1152 __le32 *p;
1153
1154 int err = 0;
1155
1156 if (this_bh) {
1157 BUFFER_TRACE(this_bh, "get_write_access");
1158 err = ext4_journal_get_write_access(handle, this_bh);
1159
1160
1161 if (err)
1162 return;
1163 }
1164
1165 for (p = first; p < last; p++) {
1166 nr = le32_to_cpu(*p);
1167 if (nr) {
1168
1169 if (count == 0) {
1170 block_to_free = nr;
1171 block_to_free_p = p;
1172 count = 1;
1173 } else if (nr == block_to_free + count) {
1174 count++;
1175 } else {
1176 err = ext4_clear_blocks(handle, inode, this_bh,
1177 block_to_free, count,
1178 block_to_free_p, p);
1179 if (err)
1180 break;
1181 block_to_free = nr;
1182 block_to_free_p = p;
1183 count = 1;
1184 }
1185 }
1186 }
1187
1188 if (!err && count > 0)
1189 err = ext4_clear_blocks(handle, inode, this_bh, block_to_free,
1190 count, block_to_free_p, p);
1191 if (err < 0)
1192
1193 return;
1194
1195 if (this_bh) {
1196 BUFFER_TRACE(this_bh, "call ext4_handle_dirty_metadata");
1197
1198
1199
1200
1201
1202
1203
1204 if ((EXT4_JOURNAL(inode) == NULL) || bh2jh(this_bh))
1205 ext4_handle_dirty_metadata(handle, inode, this_bh);
1206 else
1207 EXT4_ERROR_INODE(inode,
1208 "circular indirect block detected at "
1209 "block %llu",
1210 (unsigned long long) this_bh->b_blocknr);
1211 }
1212}
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227static void ext4_free_branches(handle_t *handle, struct inode *inode,
1228 struct buffer_head *parent_bh,
1229 __le32 *first, __le32 *last, int depth)
1230{
1231 ext4_fsblk_t nr;
1232 __le32 *p;
1233
1234 if (ext4_handle_is_aborted(handle))
1235 return;
1236
1237 if (depth--) {
1238 struct buffer_head *bh;
1239 int addr_per_block = EXT4_ADDR_PER_BLOCK(inode->i_sb);
1240 p = last;
1241 while (--p >= first) {
1242 nr = le32_to_cpu(*p);
1243 if (!nr)
1244 continue;
1245
1246 if (!ext4_data_block_valid(EXT4_SB(inode->i_sb),
1247 nr, 1)) {
1248 EXT4_ERROR_INODE(inode,
1249 "invalid indirect mapped "
1250 "block %lu (level %d)",
1251 (unsigned long) nr, depth);
1252 break;
1253 }
1254
1255
1256 bh = sb_bread(inode->i_sb, nr);
1257
1258
1259
1260
1261
1262 if (!bh) {
1263 EXT4_ERROR_INODE_BLOCK(inode, nr,
1264 "Read failure");
1265 continue;
1266 }
1267
1268
1269 BUFFER_TRACE(bh, "free child branches");
1270 ext4_free_branches(handle, inode, bh,
1271 (__le32 *) bh->b_data,
1272 (__le32 *) bh->b_data + addr_per_block,
1273 depth);
1274 brelse(bh);
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292 if (ext4_handle_is_aborted(handle))
1293 return;
1294 if (try_to_extend_transaction(handle, inode)) {
1295 ext4_mark_inode_dirty(handle, inode);
1296 ext4_truncate_restart_trans(handle, inode,
1297 ext4_blocks_for_truncate(inode));
1298 }
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311 ext4_free_blocks(handle, inode, NULL, nr, 1,
1312 EXT4_FREE_BLOCKS_METADATA|
1313 EXT4_FREE_BLOCKS_FORGET);
1314
1315 if (parent_bh) {
1316
1317
1318
1319
1320 BUFFER_TRACE(parent_bh, "get_write_access");
1321 if (!ext4_journal_get_write_access(handle,
1322 parent_bh)){
1323 *p = 0;
1324 BUFFER_TRACE(parent_bh,
1325 "call ext4_handle_dirty_metadata");
1326 ext4_handle_dirty_metadata(handle,
1327 inode,
1328 parent_bh);
1329 }
1330 }
1331 }
1332 } else {
1333
1334 BUFFER_TRACE(parent_bh, "free data blocks");
1335 ext4_free_data(handle, inode, parent_bh, first, last);
1336 }
1337}
1338
1339void ext4_ind_truncate(struct inode *inode)
1340{
1341 handle_t *handle;
1342 struct ext4_inode_info *ei = EXT4_I(inode);
1343 __le32 *i_data = ei->i_data;
1344 int addr_per_block = EXT4_ADDR_PER_BLOCK(inode->i_sb);
1345 struct address_space *mapping = inode->i_mapping;
1346 ext4_lblk_t offsets[4];
1347 Indirect chain[4];
1348 Indirect *partial;
1349 __le32 nr = 0;
1350 int n = 0;
1351 ext4_lblk_t last_block, max_block;
1352 loff_t page_len;
1353 unsigned blocksize = inode->i_sb->s_blocksize;
1354 int err;
1355
1356 handle = start_transaction(inode);
1357 if (IS_ERR(handle))
1358 return;
1359
1360 last_block = (inode->i_size + blocksize-1)
1361 >> EXT4_BLOCK_SIZE_BITS(inode->i_sb);
1362 max_block = (EXT4_SB(inode->i_sb)->s_bitmap_maxbytes + blocksize-1)
1363 >> EXT4_BLOCK_SIZE_BITS(inode->i_sb);
1364
1365 if (inode->i_size % PAGE_CACHE_SIZE != 0) {
1366 page_len = PAGE_CACHE_SIZE -
1367 (inode->i_size & (PAGE_CACHE_SIZE - 1));
1368
1369 err = ext4_discard_partial_page_buffers(handle,
1370 mapping, inode->i_size, page_len, 0);
1371
1372 if (err)
1373 goto out_stop;
1374 }
1375
1376 if (last_block != max_block) {
1377 n = ext4_block_to_path(inode, last_block, offsets, NULL);
1378 if (n == 0)
1379 goto out_stop;
1380 }
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391 if (ext4_orphan_add(handle, inode))
1392 goto out_stop;
1393
1394
1395
1396
1397
1398 down_write(&ei->i_data_sem);
1399
1400 ext4_discard_preallocations(inode);
1401
1402
1403
1404
1405
1406
1407
1408
1409 ei->i_disksize = inode->i_size;
1410
1411 if (last_block == max_block) {
1412
1413
1414
1415
1416 goto out_unlock;
1417 } else if (n == 1) {
1418 ext4_free_data(handle, inode, NULL, i_data+offsets[0],
1419 i_data + EXT4_NDIR_BLOCKS);
1420 goto do_indirects;
1421 }
1422
1423 partial = ext4_find_shared(inode, n, offsets, chain, &nr);
1424
1425 if (nr) {
1426 if (partial == chain) {
1427
1428 ext4_free_branches(handle, inode, NULL,
1429 &nr, &nr+1, (chain+n-1) - partial);
1430 *partial->p = 0;
1431
1432
1433
1434
1435 } else {
1436
1437 BUFFER_TRACE(partial->bh, "get_write_access");
1438 ext4_free_branches(handle, inode, partial->bh,
1439 partial->p,
1440 partial->p+1, (chain+n-1) - partial);
1441 }
1442 }
1443
1444 while (partial > chain) {
1445 ext4_free_branches(handle, inode, partial->bh, partial->p + 1,
1446 (__le32*)partial->bh->b_data+addr_per_block,
1447 (chain+n-1) - partial);
1448 BUFFER_TRACE(partial->bh, "call brelse");
1449 brelse(partial->bh);
1450 partial--;
1451 }
1452do_indirects:
1453
1454 switch (offsets[0]) {
1455 default:
1456 nr = i_data[EXT4_IND_BLOCK];
1457 if (nr) {
1458 ext4_free_branches(handle, inode, NULL, &nr, &nr+1, 1);
1459 i_data[EXT4_IND_BLOCK] = 0;
1460 }
1461 case EXT4_IND_BLOCK:
1462 nr = i_data[EXT4_DIND_BLOCK];
1463 if (nr) {
1464 ext4_free_branches(handle, inode, NULL, &nr, &nr+1, 2);
1465 i_data[EXT4_DIND_BLOCK] = 0;
1466 }
1467 case EXT4_DIND_BLOCK:
1468 nr = i_data[EXT4_TIND_BLOCK];
1469 if (nr) {
1470 ext4_free_branches(handle, inode, NULL, &nr, &nr+1, 3);
1471 i_data[EXT4_TIND_BLOCK] = 0;
1472 }
1473 case EXT4_TIND_BLOCK:
1474 ;
1475 }
1476
1477out_unlock:
1478 up_write(&ei->i_data_sem);
1479 inode->i_mtime = inode->i_ctime = ext4_current_time(inode);
1480 ext4_mark_inode_dirty(handle, inode);
1481
1482
1483
1484
1485
1486 if (IS_SYNC(inode))
1487 ext4_handle_sync(handle);
1488out_stop:
1489
1490
1491
1492
1493
1494
1495
1496 if (inode->i_nlink)
1497 ext4_orphan_del(handle, inode);
1498
1499 ext4_journal_stop(handle);
1500 trace_ext4_truncate_exit(inode);
1501}
1502
1503