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(atomic_read(&EXT4_I(inode)->i_unwritten))) {
811 mutex_lock(&inode->i_mutex);
812 ext4_flush_unwritten_io(inode);
813 mutex_unlock(&inode->i_mutex);
814 }
815
816
817
818
819
820 atomic_inc(&inode->i_dio_count);
821 smp_mb();
822 if (unlikely(ext4_test_inode_state(inode,
823 EXT4_STATE_DIOREAD_LOCK))) {
824 inode_dio_done(inode);
825 goto locked;
826 }
827 ret = __blockdev_direct_IO(rw, iocb, inode,
828 inode->i_sb->s_bdev, iov,
829 offset, nr_segs,
830 ext4_get_block, NULL, NULL, 0);
831 inode_dio_done(inode);
832 } else {
833locked:
834 ret = blockdev_direct_IO(rw, iocb, inode, iov,
835 offset, nr_segs, ext4_get_block);
836
837 if (unlikely((rw & WRITE) && ret < 0)) {
838 loff_t isize = i_size_read(inode);
839 loff_t end = offset + iov_length(iov, nr_segs);
840
841 if (end > isize)
842 ext4_truncate_failed_write(inode);
843 }
844 }
845 if (ret == -ENOSPC && ext4_should_retry_alloc(inode->i_sb, &retries))
846 goto retry;
847
848 if (orphan) {
849 int err;
850
851
852 handle = ext4_journal_start(inode, 2);
853 if (IS_ERR(handle)) {
854
855
856
857 ret = PTR_ERR(handle);
858 if (inode->i_nlink)
859 ext4_orphan_del(NULL, inode);
860
861 goto out;
862 }
863 if (inode->i_nlink)
864 ext4_orphan_del(handle, inode);
865 if (ret > 0) {
866 loff_t end = offset + ret;
867 if (end > inode->i_size) {
868 ei->i_disksize = end;
869 i_size_write(inode, end);
870
871
872
873
874
875
876
877 ext4_mark_inode_dirty(handle, inode);
878 }
879 }
880 err = ext4_journal_stop(handle);
881 if (ret == 0)
882 ret = err;
883 }
884out:
885 return ret;
886}
887
888
889
890
891
892int ext4_ind_calc_metadata_amount(struct inode *inode, sector_t lblock)
893{
894 struct ext4_inode_info *ei = EXT4_I(inode);
895 sector_t dind_mask = ~((sector_t)EXT4_ADDR_PER_BLOCK(inode->i_sb) - 1);
896 int blk_bits;
897
898 if (lblock < EXT4_NDIR_BLOCKS)
899 return 0;
900
901 lblock -= EXT4_NDIR_BLOCKS;
902
903 if (ei->i_da_metadata_calc_len &&
904 (lblock & dind_mask) == ei->i_da_metadata_calc_last_lblock) {
905 ei->i_da_metadata_calc_len++;
906 return 0;
907 }
908 ei->i_da_metadata_calc_last_lblock = lblock & dind_mask;
909 ei->i_da_metadata_calc_len = 1;
910 blk_bits = order_base_2(lblock);
911 return (blk_bits / EXT4_ADDR_PER_BLOCK_BITS(inode->i_sb)) + 1;
912}
913
914int ext4_ind_trans_blocks(struct inode *inode, int nrblocks, int chunk)
915{
916 int indirects;
917
918
919 if (chunk) {
920
921
922
923
924
925 return DIV_ROUND_UP(nrblocks,
926 EXT4_ADDR_PER_BLOCK(inode->i_sb)) + 4;
927 }
928
929
930
931
932
933 indirects = nrblocks * 2 + 1;
934 return indirects;
935}
936
937
938
939
940
941
942
943
944
945
946
947static handle_t *start_transaction(struct inode *inode)
948{
949 handle_t *result;
950
951 result = ext4_journal_start(inode, ext4_blocks_for_truncate(inode));
952 if (!IS_ERR(result))
953 return result;
954
955 ext4_std_error(inode->i_sb, PTR_ERR(result));
956 return result;
957}
958
959
960
961
962
963
964
965static int try_to_extend_transaction(handle_t *handle, struct inode *inode)
966{
967 if (!ext4_handle_valid(handle))
968 return 0;
969 if (ext4_handle_has_enough_credits(handle, EXT4_RESERVE_TRANS_BLOCKS+1))
970 return 0;
971 if (!ext4_journal_extend(handle, ext4_blocks_for_truncate(inode)))
972 return 0;
973 return 1;
974}
975
976
977
978
979
980
981static inline int all_zeroes(__le32 *p, __le32 *q)
982{
983 while (p < q)
984 if (*p++)
985 return 0;
986 return 1;
987}
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024static Indirect *ext4_find_shared(struct inode *inode, int depth,
1025 ext4_lblk_t offsets[4], Indirect chain[4],
1026 __le32 *top)
1027{
1028 Indirect *partial, *p;
1029 int k, err;
1030
1031 *top = 0;
1032
1033 for (k = depth; k > 1 && !offsets[k-1]; k--)
1034 ;
1035 partial = ext4_get_branch(inode, k, offsets, chain, &err);
1036
1037 if (!partial)
1038 partial = chain + k-1;
1039
1040
1041
1042
1043 if (!partial->key && *partial->p)
1044
1045 goto no_top;
1046 for (p = partial; (p > chain) && all_zeroes((__le32 *) p->bh->b_data, p->p); p--)
1047 ;
1048
1049
1050
1051
1052
1053
1054 if (p == chain + k - 1 && p > chain) {
1055 p->p--;
1056 } else {
1057 *top = *p->p;
1058
1059#if 0
1060 *p->p = 0;
1061#endif
1062 }
1063
1064
1065 while (partial > p) {
1066 brelse(partial->bh);
1067 partial--;
1068 }
1069no_top:
1070 return partial;
1071}
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084static int ext4_clear_blocks(handle_t *handle, struct inode *inode,
1085 struct buffer_head *bh,
1086 ext4_fsblk_t block_to_free,
1087 unsigned long count, __le32 *first,
1088 __le32 *last)
1089{
1090 __le32 *p;
1091 int flags = EXT4_FREE_BLOCKS_FORGET | EXT4_FREE_BLOCKS_VALIDATED;
1092 int err;
1093
1094 if (S_ISDIR(inode->i_mode) || S_ISLNK(inode->i_mode))
1095 flags |= EXT4_FREE_BLOCKS_METADATA;
1096
1097 if (!ext4_data_block_valid(EXT4_SB(inode->i_sb), block_to_free,
1098 count)) {
1099 EXT4_ERROR_INODE(inode, "attempt to clear invalid "
1100 "blocks %llu len %lu",
1101 (unsigned long long) block_to_free, count);
1102 return 1;
1103 }
1104
1105 if (try_to_extend_transaction(handle, inode)) {
1106 if (bh) {
1107 BUFFER_TRACE(bh, "call ext4_handle_dirty_metadata");
1108 err = ext4_handle_dirty_metadata(handle, inode, bh);
1109 if (unlikely(err))
1110 goto out_err;
1111 }
1112 err = ext4_mark_inode_dirty(handle, inode);
1113 if (unlikely(err))
1114 goto out_err;
1115 err = ext4_truncate_restart_trans(handle, inode,
1116 ext4_blocks_for_truncate(inode));
1117 if (unlikely(err))
1118 goto out_err;
1119 if (bh) {
1120 BUFFER_TRACE(bh, "retaking write access");
1121 err = ext4_journal_get_write_access(handle, bh);
1122 if (unlikely(err))
1123 goto out_err;
1124 }
1125 }
1126
1127 for (p = first; p < last; p++)
1128 *p = 0;
1129
1130 ext4_free_blocks(handle, inode, NULL, block_to_free, count, flags);
1131 return 0;
1132out_err:
1133 ext4_std_error(inode->i_sb, err);
1134 return err;
1135}
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156static void ext4_free_data(handle_t *handle, struct inode *inode,
1157 struct buffer_head *this_bh,
1158 __le32 *first, __le32 *last)
1159{
1160 ext4_fsblk_t block_to_free = 0;
1161 unsigned long count = 0;
1162 __le32 *block_to_free_p = NULL;
1163
1164
1165 ext4_fsblk_t nr;
1166 __le32 *p;
1167
1168 int err = 0;
1169
1170 if (this_bh) {
1171 BUFFER_TRACE(this_bh, "get_write_access");
1172 err = ext4_journal_get_write_access(handle, this_bh);
1173
1174
1175 if (err)
1176 return;
1177 }
1178
1179 for (p = first; p < last; p++) {
1180 nr = le32_to_cpu(*p);
1181 if (nr) {
1182
1183 if (count == 0) {
1184 block_to_free = nr;
1185 block_to_free_p = p;
1186 count = 1;
1187 } else if (nr == block_to_free + count) {
1188 count++;
1189 } else {
1190 err = ext4_clear_blocks(handle, inode, this_bh,
1191 block_to_free, count,
1192 block_to_free_p, p);
1193 if (err)
1194 break;
1195 block_to_free = nr;
1196 block_to_free_p = p;
1197 count = 1;
1198 }
1199 }
1200 }
1201
1202 if (!err && count > 0)
1203 err = ext4_clear_blocks(handle, inode, this_bh, block_to_free,
1204 count, block_to_free_p, p);
1205 if (err < 0)
1206
1207 return;
1208
1209 if (this_bh) {
1210 BUFFER_TRACE(this_bh, "call ext4_handle_dirty_metadata");
1211
1212
1213
1214
1215
1216
1217
1218 if ((EXT4_JOURNAL(inode) == NULL) || bh2jh(this_bh))
1219 ext4_handle_dirty_metadata(handle, inode, this_bh);
1220 else
1221 EXT4_ERROR_INODE(inode,
1222 "circular indirect block detected at "
1223 "block %llu",
1224 (unsigned long long) this_bh->b_blocknr);
1225 }
1226}
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241static void ext4_free_branches(handle_t *handle, struct inode *inode,
1242 struct buffer_head *parent_bh,
1243 __le32 *first, __le32 *last, int depth)
1244{
1245 ext4_fsblk_t nr;
1246 __le32 *p;
1247
1248 if (ext4_handle_is_aborted(handle))
1249 return;
1250
1251 if (depth--) {
1252 struct buffer_head *bh;
1253 int addr_per_block = EXT4_ADDR_PER_BLOCK(inode->i_sb);
1254 p = last;
1255 while (--p >= first) {
1256 nr = le32_to_cpu(*p);
1257 if (!nr)
1258 continue;
1259
1260 if (!ext4_data_block_valid(EXT4_SB(inode->i_sb),
1261 nr, 1)) {
1262 EXT4_ERROR_INODE(inode,
1263 "invalid indirect mapped "
1264 "block %lu (level %d)",
1265 (unsigned long) nr, depth);
1266 break;
1267 }
1268
1269
1270 bh = sb_bread(inode->i_sb, nr);
1271
1272
1273
1274
1275
1276 if (!bh) {
1277 EXT4_ERROR_INODE_BLOCK(inode, nr,
1278 "Read failure");
1279 continue;
1280 }
1281
1282
1283 BUFFER_TRACE(bh, "free child branches");
1284 ext4_free_branches(handle, inode, bh,
1285 (__le32 *) bh->b_data,
1286 (__le32 *) bh->b_data + addr_per_block,
1287 depth);
1288 brelse(bh);
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306 if (ext4_handle_is_aborted(handle))
1307 return;
1308 if (try_to_extend_transaction(handle, inode)) {
1309 ext4_mark_inode_dirty(handle, inode);
1310 ext4_truncate_restart_trans(handle, inode,
1311 ext4_blocks_for_truncate(inode));
1312 }
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325 ext4_free_blocks(handle, inode, NULL, nr, 1,
1326 EXT4_FREE_BLOCKS_METADATA|
1327 EXT4_FREE_BLOCKS_FORGET);
1328
1329 if (parent_bh) {
1330
1331
1332
1333
1334 BUFFER_TRACE(parent_bh, "get_write_access");
1335 if (!ext4_journal_get_write_access(handle,
1336 parent_bh)){
1337 *p = 0;
1338 BUFFER_TRACE(parent_bh,
1339 "call ext4_handle_dirty_metadata");
1340 ext4_handle_dirty_metadata(handle,
1341 inode,
1342 parent_bh);
1343 }
1344 }
1345 }
1346 } else {
1347
1348 BUFFER_TRACE(parent_bh, "free data blocks");
1349 ext4_free_data(handle, inode, parent_bh, first, last);
1350 }
1351}
1352
1353void ext4_ind_truncate(struct inode *inode)
1354{
1355 handle_t *handle;
1356 struct ext4_inode_info *ei = EXT4_I(inode);
1357 __le32 *i_data = ei->i_data;
1358 int addr_per_block = EXT4_ADDR_PER_BLOCK(inode->i_sb);
1359 struct address_space *mapping = inode->i_mapping;
1360 ext4_lblk_t offsets[4];
1361 Indirect chain[4];
1362 Indirect *partial;
1363 __le32 nr = 0;
1364 int n = 0;
1365 ext4_lblk_t last_block, max_block;
1366 loff_t page_len;
1367 unsigned blocksize = inode->i_sb->s_blocksize;
1368 int err;
1369
1370 handle = start_transaction(inode);
1371 if (IS_ERR(handle))
1372 return;
1373
1374 last_block = (inode->i_size + blocksize-1)
1375 >> EXT4_BLOCK_SIZE_BITS(inode->i_sb);
1376 max_block = (EXT4_SB(inode->i_sb)->s_bitmap_maxbytes + blocksize-1)
1377 >> EXT4_BLOCK_SIZE_BITS(inode->i_sb);
1378
1379 if (inode->i_size % PAGE_CACHE_SIZE != 0) {
1380 page_len = PAGE_CACHE_SIZE -
1381 (inode->i_size & (PAGE_CACHE_SIZE - 1));
1382
1383 err = ext4_discard_partial_page_buffers(handle,
1384 mapping, inode->i_size, page_len, 0);
1385
1386 if (err)
1387 goto out_stop;
1388 }
1389
1390 if (last_block != max_block) {
1391 n = ext4_block_to_path(inode, last_block, offsets, NULL);
1392 if (n == 0)
1393 goto out_stop;
1394 }
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405 if (ext4_orphan_add(handle, inode))
1406 goto out_stop;
1407
1408
1409
1410
1411
1412 down_write(&ei->i_data_sem);
1413
1414 ext4_discard_preallocations(inode);
1415
1416
1417
1418
1419
1420
1421
1422
1423 ei->i_disksize = inode->i_size;
1424
1425 if (last_block == max_block) {
1426
1427
1428
1429
1430 goto out_unlock;
1431 } else if (n == 1) {
1432 ext4_free_data(handle, inode, NULL, i_data+offsets[0],
1433 i_data + EXT4_NDIR_BLOCKS);
1434 goto do_indirects;
1435 }
1436
1437 partial = ext4_find_shared(inode, n, offsets, chain, &nr);
1438
1439 if (nr) {
1440 if (partial == chain) {
1441
1442 ext4_free_branches(handle, inode, NULL,
1443 &nr, &nr+1, (chain+n-1) - partial);
1444 *partial->p = 0;
1445
1446
1447
1448
1449 } else {
1450
1451 BUFFER_TRACE(partial->bh, "get_write_access");
1452 ext4_free_branches(handle, inode, partial->bh,
1453 partial->p,
1454 partial->p+1, (chain+n-1) - partial);
1455 }
1456 }
1457
1458 while (partial > chain) {
1459 ext4_free_branches(handle, inode, partial->bh, partial->p + 1,
1460 (__le32*)partial->bh->b_data+addr_per_block,
1461 (chain+n-1) - partial);
1462 BUFFER_TRACE(partial->bh, "call brelse");
1463 brelse(partial->bh);
1464 partial--;
1465 }
1466do_indirects:
1467
1468 switch (offsets[0]) {
1469 default:
1470 nr = i_data[EXT4_IND_BLOCK];
1471 if (nr) {
1472 ext4_free_branches(handle, inode, NULL, &nr, &nr+1, 1);
1473 i_data[EXT4_IND_BLOCK] = 0;
1474 }
1475 case EXT4_IND_BLOCK:
1476 nr = i_data[EXT4_DIND_BLOCK];
1477 if (nr) {
1478 ext4_free_branches(handle, inode, NULL, &nr, &nr+1, 2);
1479 i_data[EXT4_DIND_BLOCK] = 0;
1480 }
1481 case EXT4_DIND_BLOCK:
1482 nr = i_data[EXT4_TIND_BLOCK];
1483 if (nr) {
1484 ext4_free_branches(handle, inode, NULL, &nr, &nr+1, 3);
1485 i_data[EXT4_TIND_BLOCK] = 0;
1486 }
1487 case EXT4_TIND_BLOCK:
1488 ;
1489 }
1490
1491out_unlock:
1492 up_write(&ei->i_data_sem);
1493 inode->i_mtime = inode->i_ctime = ext4_current_time(inode);
1494 ext4_mark_inode_dirty(handle, inode);
1495
1496
1497
1498
1499
1500 if (IS_SYNC(inode))
1501 ext4_handle_sync(handle);
1502out_stop:
1503
1504
1505
1506
1507
1508
1509
1510 if (inode->i_nlink)
1511 ext4_orphan_del(handle, inode);
1512
1513 ext4_journal_stop(handle);
1514 trace_ext4_truncate_exit(inode);
1515}
1516
1517