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#include <linux/smp_lock.h>
26#include <linux/time.h>
27#include <linux/highuid.h>
28#include <linux/pagemap.h>
29#include <linux/quotaops.h>
30#include <linux/module.h>
31#include <linux/writeback.h>
32#include <linux/buffer_head.h>
33#include <linux/mpage.h>
34#include "ext2.h"
35#include "acl.h"
36#include "xip.h"
37
38MODULE_AUTHOR("Remy Card and others");
39MODULE_DESCRIPTION("Second Extended Filesystem");
40MODULE_LICENSE("GPL");
41
42static int ext2_update_inode(struct inode * inode, int do_sync);
43
44
45
46
47static inline int ext2_inode_is_fast_symlink(struct inode *inode)
48{
49 int ea_blocks = EXT2_I(inode)->i_file_acl ?
50 (inode->i_sb->s_blocksize >> 9) : 0;
51
52 return (S_ISLNK(inode->i_mode) &&
53 inode->i_blocks - ea_blocks == 0);
54}
55
56
57
58
59void ext2_delete_inode (struct inode * inode)
60{
61 truncate_inode_pages(&inode->i_data, 0);
62
63 if (is_bad_inode(inode))
64 goto no_delete;
65 EXT2_I(inode)->i_dtime = get_seconds();
66 mark_inode_dirty(inode);
67 ext2_update_inode(inode, inode_needs_sync(inode));
68
69 inode->i_size = 0;
70 if (inode->i_blocks)
71 ext2_truncate (inode);
72 ext2_free_inode (inode);
73
74 return;
75no_delete:
76 clear_inode(inode);
77}
78
79typedef struct {
80 __le32 *p;
81 __le32 key;
82 struct buffer_head *bh;
83} Indirect;
84
85static inline void add_chain(Indirect *p, struct buffer_head *bh, __le32 *v)
86{
87 p->key = *(p->p = v);
88 p->bh = bh;
89}
90
91static inline int verify_chain(Indirect *from, Indirect *to)
92{
93 while (from <= to && from->key == *from->p)
94 from++;
95 return (from > to);
96}
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128static int ext2_block_to_path(struct inode *inode,
129 long i_block, int offsets[4], int *boundary)
130{
131 int ptrs = EXT2_ADDR_PER_BLOCK(inode->i_sb);
132 int ptrs_bits = EXT2_ADDR_PER_BLOCK_BITS(inode->i_sb);
133 const long direct_blocks = EXT2_NDIR_BLOCKS,
134 indirect_blocks = ptrs,
135 double_blocks = (1 << (ptrs_bits * 2));
136 int n = 0;
137 int final = 0;
138
139 if (i_block < 0) {
140 ext2_warning (inode->i_sb, "ext2_block_to_path", "block < 0");
141 } else if (i_block < direct_blocks) {
142 offsets[n++] = i_block;
143 final = direct_blocks;
144 } else if ( (i_block -= direct_blocks) < indirect_blocks) {
145 offsets[n++] = EXT2_IND_BLOCK;
146 offsets[n++] = i_block;
147 final = ptrs;
148 } else if ((i_block -= indirect_blocks) < double_blocks) {
149 offsets[n++] = EXT2_DIND_BLOCK;
150 offsets[n++] = i_block >> ptrs_bits;
151 offsets[n++] = i_block & (ptrs - 1);
152 final = ptrs;
153 } else if (((i_block -= double_blocks) >> (ptrs_bits * 2)) < ptrs) {
154 offsets[n++] = EXT2_TIND_BLOCK;
155 offsets[n++] = i_block >> (ptrs_bits * 2);
156 offsets[n++] = (i_block >> ptrs_bits) & (ptrs - 1);
157 offsets[n++] = i_block & (ptrs - 1);
158 final = ptrs;
159 } else {
160 ext2_warning (inode->i_sb, "ext2_block_to_path", "block > big");
161 }
162 if (boundary)
163 *boundary = final - 1 - (i_block & (ptrs - 1));
164
165 return n;
166}
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197static Indirect *ext2_get_branch(struct inode *inode,
198 int depth,
199 int *offsets,
200 Indirect chain[4],
201 int *err)
202{
203 struct super_block *sb = inode->i_sb;
204 Indirect *p = chain;
205 struct buffer_head *bh;
206
207 *err = 0;
208
209 add_chain (chain, NULL, EXT2_I(inode)->i_data + *offsets);
210 if (!p->key)
211 goto no_block;
212 while (--depth) {
213 bh = sb_bread(sb, le32_to_cpu(p->key));
214 if (!bh)
215 goto failure;
216 read_lock(&EXT2_I(inode)->i_meta_lock);
217 if (!verify_chain(chain, p))
218 goto changed;
219 add_chain(++p, bh, (__le32*)bh->b_data + *++offsets);
220 read_unlock(&EXT2_I(inode)->i_meta_lock);
221 if (!p->key)
222 goto no_block;
223 }
224 return NULL;
225
226changed:
227 read_unlock(&EXT2_I(inode)->i_meta_lock);
228 brelse(bh);
229 *err = -EAGAIN;
230 goto no_block;
231failure:
232 *err = -EIO;
233no_block:
234 return p;
235}
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257static ext2_fsblk_t ext2_find_near(struct inode *inode, Indirect *ind)
258{
259 struct ext2_inode_info *ei = EXT2_I(inode);
260 __le32 *start = ind->bh ? (__le32 *) ind->bh->b_data : ei->i_data;
261 __le32 *p;
262 ext2_fsblk_t bg_start;
263 ext2_fsblk_t colour;
264
265
266 for (p = ind->p - 1; p >= start; p--)
267 if (*p)
268 return le32_to_cpu(*p);
269
270
271 if (ind->bh)
272 return ind->bh->b_blocknr;
273
274
275
276
277
278 bg_start = ext2_group_first_block_no(inode->i_sb, ei->i_block_group);
279 colour = (current->pid % 16) *
280 (EXT2_BLOCKS_PER_GROUP(inode->i_sb) / 16);
281 return bg_start + colour;
282}
283
284
285
286
287
288
289
290
291
292
293static inline ext2_fsblk_t ext2_find_goal(struct inode *inode, long block,
294 Indirect *partial)
295{
296 struct ext2_block_alloc_info *block_i;
297
298 block_i = EXT2_I(inode)->i_block_alloc_info;
299
300
301
302
303
304 if (block_i && (block == block_i->last_alloc_logical_block + 1)
305 && (block_i->last_alloc_physical_block != 0)) {
306 return block_i->last_alloc_physical_block + 1;
307 }
308
309 return ext2_find_near(inode, partial);
310}
311
312
313
314
315
316
317
318
319
320
321
322
323
324static int
325ext2_blks_to_allocate(Indirect * branch, int k, unsigned long blks,
326 int blocks_to_boundary)
327{
328 unsigned long count = 0;
329
330
331
332
333
334 if (k > 0) {
335
336 if (blks < blocks_to_boundary + 1)
337 count += blks;
338 else
339 count += blocks_to_boundary + 1;
340 return count;
341 }
342
343 count++;
344 while (count < blks && count <= blocks_to_boundary
345 && le32_to_cpu(*(branch[0].p + count)) == 0) {
346 count++;
347 }
348 return count;
349}
350
351
352
353
354
355
356
357
358
359
360
361static int ext2_alloc_blocks(struct inode *inode,
362 ext2_fsblk_t goal, int indirect_blks, int blks,
363 ext2_fsblk_t new_blocks[4], int *err)
364{
365 int target, i;
366 unsigned long count = 0;
367 int index = 0;
368 ext2_fsblk_t current_block = 0;
369 int ret = 0;
370
371
372
373
374
375
376
377
378
379 target = blks + indirect_blks;
380
381 while (1) {
382 count = target;
383
384 current_block = ext2_new_blocks(inode,goal,&count,err);
385 if (*err)
386 goto failed_out;
387
388 target -= count;
389
390 while (index < indirect_blks && count) {
391 new_blocks[index++] = current_block++;
392 count--;
393 }
394
395 if (count > 0)
396 break;
397 }
398
399
400 new_blocks[index] = current_block;
401
402
403 ret = count;
404 *err = 0;
405 return ret;
406failed_out:
407 for (i = 0; i <index; i++)
408 ext2_free_blocks(inode, new_blocks[i], 1);
409 return ret;
410}
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437static int ext2_alloc_branch(struct inode *inode,
438 int indirect_blks, int *blks, ext2_fsblk_t goal,
439 int *offsets, Indirect *branch)
440{
441 int blocksize = inode->i_sb->s_blocksize;
442 int i, n = 0;
443 int err = 0;
444 struct buffer_head *bh;
445 int num;
446 ext2_fsblk_t new_blocks[4];
447 ext2_fsblk_t current_block;
448
449 num = ext2_alloc_blocks(inode, goal, indirect_blks,
450 *blks, new_blocks, &err);
451 if (err)
452 return err;
453
454 branch[0].key = cpu_to_le32(new_blocks[0]);
455
456
457
458 for (n = 1; n <= indirect_blks; n++) {
459
460
461
462
463
464 bh = sb_getblk(inode->i_sb, new_blocks[n-1]);
465 branch[n].bh = bh;
466 lock_buffer(bh);
467 memset(bh->b_data, 0, blocksize);
468 branch[n].p = (__le32 *) bh->b_data + offsets[n];
469 branch[n].key = cpu_to_le32(new_blocks[n]);
470 *branch[n].p = branch[n].key;
471 if ( n == indirect_blks) {
472 current_block = new_blocks[n];
473
474
475
476
477
478 for (i=1; i < num; i++)
479 *(branch[n].p + i) = cpu_to_le32(++current_block);
480 }
481 set_buffer_uptodate(bh);
482 unlock_buffer(bh);
483 mark_buffer_dirty_inode(bh, inode);
484
485
486
487
488 if (S_ISDIR(inode->i_mode) && IS_DIRSYNC(inode))
489 sync_dirty_buffer(bh);
490 }
491 *blks = num;
492 return err;
493}
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509static void ext2_splice_branch(struct inode *inode,
510 long block, Indirect *where, int num, int blks)
511{
512 int i;
513 struct ext2_block_alloc_info *block_i;
514 ext2_fsblk_t current_block;
515
516 block_i = EXT2_I(inode)->i_block_alloc_info;
517
518
519
520
521 *where->p = where->key;
522
523
524
525
526
527 if (num == 0 && blks > 1) {
528 current_block = le32_to_cpu(where->key) + 1;
529 for (i = 1; i < blks; i++)
530 *(where->p + i ) = cpu_to_le32(current_block++);
531 }
532
533
534
535
536
537
538 if (block_i) {
539 block_i->last_alloc_logical_block = block + blks - 1;
540 block_i->last_alloc_physical_block =
541 le32_to_cpu(where[num].key) + blks - 1;
542 }
543
544
545
546
547 if (where->bh)
548 mark_buffer_dirty_inode(where->bh, inode);
549
550 inode->i_ctime = CURRENT_TIME_SEC;
551 mark_inode_dirty(inode);
552}
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572static int ext2_get_blocks(struct inode *inode,
573 sector_t iblock, unsigned long maxblocks,
574 struct buffer_head *bh_result,
575 int create)
576{
577 int err = -EIO;
578 int offsets[4];
579 Indirect chain[4];
580 Indirect *partial;
581 ext2_fsblk_t goal;
582 int indirect_blks;
583 int blocks_to_boundary = 0;
584 int depth;
585 struct ext2_inode_info *ei = EXT2_I(inode);
586 int count = 0;
587 ext2_fsblk_t first_block = 0;
588
589 depth = ext2_block_to_path(inode,iblock,offsets,&blocks_to_boundary);
590
591 if (depth == 0)
592 return (err);
593reread:
594 partial = ext2_get_branch(inode, depth, offsets, chain, &err);
595
596
597 if (!partial) {
598 first_block = le32_to_cpu(chain[depth - 1].key);
599 clear_buffer_new(bh_result);
600 count++;
601
602 while (count < maxblocks && count <= blocks_to_boundary) {
603 ext2_fsblk_t blk;
604
605 if (!verify_chain(chain, partial)) {
606
607
608
609
610
611
612 count = 0;
613 goto changed;
614 }
615 blk = le32_to_cpu(*(chain[depth-1].p + count));
616 if (blk == first_block + count)
617 count++;
618 else
619 break;
620 }
621 goto got_it;
622 }
623
624
625 if (!create || err == -EIO)
626 goto cleanup;
627
628 mutex_lock(&ei->truncate_mutex);
629
630
631
632
633
634 if (S_ISREG(inode->i_mode) && (!ei->i_block_alloc_info))
635 ext2_init_block_alloc_info(inode);
636
637 goal = ext2_find_goal(inode, iblock, partial);
638
639
640 indirect_blks = (chain + depth) - partial - 1;
641
642
643
644
645 count = ext2_blks_to_allocate(partial, indirect_blks,
646 maxblocks, blocks_to_boundary);
647
648
649
650 err = ext2_alloc_branch(inode, indirect_blks, &count, goal,
651 offsets + (partial - chain), partial);
652
653 if (err) {
654 mutex_unlock(&ei->truncate_mutex);
655 goto cleanup;
656 }
657
658 if (ext2_use_xip(inode->i_sb)) {
659
660
661
662 err = ext2_clear_xip_target (inode,
663 le32_to_cpu(chain[depth-1].key));
664 if (err) {
665 mutex_unlock(&ei->truncate_mutex);
666 goto cleanup;
667 }
668 }
669
670 ext2_splice_branch(inode, iblock, partial, indirect_blks, count);
671 mutex_unlock(&ei->truncate_mutex);
672 set_buffer_new(bh_result);
673got_it:
674 map_bh(bh_result, inode->i_sb, le32_to_cpu(chain[depth-1].key));
675 if (count > blocks_to_boundary)
676 set_buffer_boundary(bh_result);
677 err = count;
678
679 partial = chain + depth - 1;
680cleanup:
681 while (partial > chain) {
682 brelse(partial->bh);
683 partial--;
684 }
685 return err;
686changed:
687 while (partial > chain) {
688 brelse(partial->bh);
689 partial--;
690 }
691 goto reread;
692}
693
694int ext2_get_block(struct inode *inode, sector_t iblock, struct buffer_head *bh_result, int create)
695{
696 unsigned max_blocks = bh_result->b_size >> inode->i_blkbits;
697 int ret = ext2_get_blocks(inode, iblock, max_blocks,
698 bh_result, create);
699 if (ret > 0) {
700 bh_result->b_size = (ret << inode->i_blkbits);
701 ret = 0;
702 }
703 return ret;
704
705}
706
707static int ext2_writepage(struct page *page, struct writeback_control *wbc)
708{
709 return block_write_full_page(page, ext2_get_block, wbc);
710}
711
712static int ext2_readpage(struct file *file, struct page *page)
713{
714 return mpage_readpage(page, ext2_get_block);
715}
716
717static int
718ext2_readpages(struct file *file, struct address_space *mapping,
719 struct list_head *pages, unsigned nr_pages)
720{
721 return mpage_readpages(mapping, pages, nr_pages, ext2_get_block);
722}
723
724int __ext2_write_begin(struct file *file, struct address_space *mapping,
725 loff_t pos, unsigned len, unsigned flags,
726 struct page **pagep, void **fsdata)
727{
728 return block_write_begin(file, mapping, pos, len, flags, pagep, fsdata,
729 ext2_get_block);
730}
731
732static int
733ext2_write_begin(struct file *file, struct address_space *mapping,
734 loff_t pos, unsigned len, unsigned flags,
735 struct page **pagep, void **fsdata)
736{
737 *pagep = NULL;
738 return __ext2_write_begin(file, mapping, pos, len, flags, pagep,fsdata);
739}
740
741static int
742ext2_nobh_write_begin(struct file *file, struct address_space *mapping,
743 loff_t pos, unsigned len, unsigned flags,
744 struct page **pagep, void **fsdata)
745{
746
747
748
749
750
751 return nobh_write_begin(file, mapping, pos, len, flags, pagep, fsdata,
752 ext2_get_block);
753}
754
755static int ext2_nobh_writepage(struct page *page,
756 struct writeback_control *wbc)
757{
758 return nobh_writepage(page, ext2_get_block, wbc);
759}
760
761static sector_t ext2_bmap(struct address_space *mapping, sector_t block)
762{
763 return generic_block_bmap(mapping,block,ext2_get_block);
764}
765
766static ssize_t
767ext2_direct_IO(int rw, struct kiocb *iocb, const struct iovec *iov,
768 loff_t offset, unsigned long nr_segs)
769{
770 struct file *file = iocb->ki_filp;
771 struct inode *inode = file->f_mapping->host;
772
773 return blockdev_direct_IO(rw, iocb, inode, inode->i_sb->s_bdev, iov,
774 offset, nr_segs, ext2_get_block, NULL);
775}
776
777static int
778ext2_writepages(struct address_space *mapping, struct writeback_control *wbc)
779{
780 return mpage_writepages(mapping, wbc, ext2_get_block);
781}
782
783const struct address_space_operations ext2_aops = {
784 .readpage = ext2_readpage,
785 .readpages = ext2_readpages,
786 .writepage = ext2_writepage,
787 .sync_page = block_sync_page,
788 .write_begin = ext2_write_begin,
789 .write_end = generic_write_end,
790 .bmap = ext2_bmap,
791 .direct_IO = ext2_direct_IO,
792 .writepages = ext2_writepages,
793 .migratepage = buffer_migrate_page,
794 .is_partially_uptodate = block_is_partially_uptodate,
795};
796
797const struct address_space_operations ext2_aops_xip = {
798 .bmap = ext2_bmap,
799 .get_xip_mem = ext2_get_xip_mem,
800};
801
802const struct address_space_operations ext2_nobh_aops = {
803 .readpage = ext2_readpage,
804 .readpages = ext2_readpages,
805 .writepage = ext2_nobh_writepage,
806 .sync_page = block_sync_page,
807 .write_begin = ext2_nobh_write_begin,
808 .write_end = nobh_write_end,
809 .bmap = ext2_bmap,
810 .direct_IO = ext2_direct_IO,
811 .writepages = ext2_writepages,
812 .migratepage = buffer_migrate_page,
813};
814
815
816
817
818
819
820static inline int all_zeroes(__le32 *p, __le32 *q)
821{
822 while (p < q)
823 if (*p++)
824 return 0;
825 return 1;
826}
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862static Indirect *ext2_find_shared(struct inode *inode,
863 int depth,
864 int offsets[4],
865 Indirect chain[4],
866 __le32 *top)
867{
868 Indirect *partial, *p;
869 int k, err;
870
871 *top = 0;
872 for (k = depth; k > 1 && !offsets[k-1]; k--)
873 ;
874 partial = ext2_get_branch(inode, k, offsets, chain, &err);
875 if (!partial)
876 partial = chain + k-1;
877
878
879
880
881 write_lock(&EXT2_I(inode)->i_meta_lock);
882 if (!partial->key && *partial->p) {
883 write_unlock(&EXT2_I(inode)->i_meta_lock);
884 goto no_top;
885 }
886 for (p=partial; p>chain && all_zeroes((__le32*)p->bh->b_data,p->p); p--)
887 ;
888
889
890
891
892
893
894 if (p == chain + k - 1 && p > chain) {
895 p->p--;
896 } else {
897 *top = *p->p;
898 *p->p = 0;
899 }
900 write_unlock(&EXT2_I(inode)->i_meta_lock);
901
902 while(partial > p)
903 {
904 brelse(partial->bh);
905 partial--;
906 }
907no_top:
908 return partial;
909}
910
911
912
913
914
915
916
917
918
919
920
921static inline void ext2_free_data(struct inode *inode, __le32 *p, __le32 *q)
922{
923 unsigned long block_to_free = 0, count = 0;
924 unsigned long nr;
925
926 for ( ; p < q ; p++) {
927 nr = le32_to_cpu(*p);
928 if (nr) {
929 *p = 0;
930
931 if (count == 0)
932 goto free_this;
933 else if (block_to_free == nr - count)
934 count++;
935 else {
936 mark_inode_dirty(inode);
937 ext2_free_blocks (inode, block_to_free, count);
938 free_this:
939 block_to_free = nr;
940 count = 1;
941 }
942 }
943 }
944 if (count > 0) {
945 mark_inode_dirty(inode);
946 ext2_free_blocks (inode, block_to_free, count);
947 }
948}
949
950
951
952
953
954
955
956
957
958
959
960
961static void ext2_free_branches(struct inode *inode, __le32 *p, __le32 *q, int depth)
962{
963 struct buffer_head * bh;
964 unsigned long nr;
965
966 if (depth--) {
967 int addr_per_block = EXT2_ADDR_PER_BLOCK(inode->i_sb);
968 for ( ; p < q ; p++) {
969 nr = le32_to_cpu(*p);
970 if (!nr)
971 continue;
972 *p = 0;
973 bh = sb_bread(inode->i_sb, nr);
974
975
976
977
978 if (!bh) {
979 ext2_error(inode->i_sb, "ext2_free_branches",
980 "Read failure, inode=%ld, block=%ld",
981 inode->i_ino, nr);
982 continue;
983 }
984 ext2_free_branches(inode,
985 (__le32*)bh->b_data,
986 (__le32*)bh->b_data + addr_per_block,
987 depth);
988 bforget(bh);
989 ext2_free_blocks(inode, nr, 1);
990 mark_inode_dirty(inode);
991 }
992 } else
993 ext2_free_data(inode, p, q);
994}
995
996void ext2_truncate(struct inode *inode)
997{
998 __le32 *i_data = EXT2_I(inode)->i_data;
999 struct ext2_inode_info *ei = EXT2_I(inode);
1000 int addr_per_block = EXT2_ADDR_PER_BLOCK(inode->i_sb);
1001 int offsets[4];
1002 Indirect chain[4];
1003 Indirect *partial;
1004 __le32 nr = 0;
1005 int n;
1006 long iblock;
1007 unsigned blocksize;
1008
1009 if (!(S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode) ||
1010 S_ISLNK(inode->i_mode)))
1011 return;
1012 if (ext2_inode_is_fast_symlink(inode))
1013 return;
1014 if (IS_APPEND(inode) || IS_IMMUTABLE(inode))
1015 return;
1016
1017 blocksize = inode->i_sb->s_blocksize;
1018 iblock = (inode->i_size + blocksize-1)
1019 >> EXT2_BLOCK_SIZE_BITS(inode->i_sb);
1020
1021 if (mapping_is_xip(inode->i_mapping))
1022 xip_truncate_page(inode->i_mapping, inode->i_size);
1023 else if (test_opt(inode->i_sb, NOBH))
1024 nobh_truncate_page(inode->i_mapping,
1025 inode->i_size, ext2_get_block);
1026 else
1027 block_truncate_page(inode->i_mapping,
1028 inode->i_size, ext2_get_block);
1029
1030 n = ext2_block_to_path(inode, iblock, offsets, NULL);
1031 if (n == 0)
1032 return;
1033
1034
1035
1036
1037
1038 mutex_lock(&ei->truncate_mutex);
1039
1040 if (n == 1) {
1041 ext2_free_data(inode, i_data+offsets[0],
1042 i_data + EXT2_NDIR_BLOCKS);
1043 goto do_indirects;
1044 }
1045
1046 partial = ext2_find_shared(inode, n, offsets, chain, &nr);
1047
1048 if (nr) {
1049 if (partial == chain)
1050 mark_inode_dirty(inode);
1051 else
1052 mark_buffer_dirty_inode(partial->bh, inode);
1053 ext2_free_branches(inode, &nr, &nr+1, (chain+n-1) - partial);
1054 }
1055
1056 while (partial > chain) {
1057 ext2_free_branches(inode,
1058 partial->p + 1,
1059 (__le32*)partial->bh->b_data+addr_per_block,
1060 (chain+n-1) - partial);
1061 mark_buffer_dirty_inode(partial->bh, inode);
1062 brelse (partial->bh);
1063 partial--;
1064 }
1065do_indirects:
1066
1067 switch (offsets[0]) {
1068 default:
1069 nr = i_data[EXT2_IND_BLOCK];
1070 if (nr) {
1071 i_data[EXT2_IND_BLOCK] = 0;
1072 mark_inode_dirty(inode);
1073 ext2_free_branches(inode, &nr, &nr+1, 1);
1074 }
1075 case EXT2_IND_BLOCK:
1076 nr = i_data[EXT2_DIND_BLOCK];
1077 if (nr) {
1078 i_data[EXT2_DIND_BLOCK] = 0;
1079 mark_inode_dirty(inode);
1080 ext2_free_branches(inode, &nr, &nr+1, 2);
1081 }
1082 case EXT2_DIND_BLOCK:
1083 nr = i_data[EXT2_TIND_BLOCK];
1084 if (nr) {
1085 i_data[EXT2_TIND_BLOCK] = 0;
1086 mark_inode_dirty(inode);
1087 ext2_free_branches(inode, &nr, &nr+1, 3);
1088 }
1089 case EXT2_TIND_BLOCK:
1090 ;
1091 }
1092
1093 ext2_discard_reservation(inode);
1094
1095 mutex_unlock(&ei->truncate_mutex);
1096 inode->i_mtime = inode->i_ctime = CURRENT_TIME_SEC;
1097 if (inode_needs_sync(inode)) {
1098 sync_mapping_buffers(inode->i_mapping);
1099 ext2_sync_inode (inode);
1100 } else {
1101 mark_inode_dirty(inode);
1102 }
1103}
1104
1105static struct ext2_inode *ext2_get_inode(struct super_block *sb, ino_t ino,
1106 struct buffer_head **p)
1107{
1108 struct buffer_head * bh;
1109 unsigned long block_group;
1110 unsigned long block;
1111 unsigned long offset;
1112 struct ext2_group_desc * gdp;
1113
1114 *p = NULL;
1115 if ((ino != EXT2_ROOT_INO && ino < EXT2_FIRST_INO(sb)) ||
1116 ino > le32_to_cpu(EXT2_SB(sb)->s_es->s_inodes_count))
1117 goto Einval;
1118
1119 block_group = (ino - 1) / EXT2_INODES_PER_GROUP(sb);
1120 gdp = ext2_get_group_desc(sb, block_group, NULL);
1121 if (!gdp)
1122 goto Egdp;
1123
1124
1125
1126 offset = ((ino - 1) % EXT2_INODES_PER_GROUP(sb)) * EXT2_INODE_SIZE(sb);
1127 block = le32_to_cpu(gdp->bg_inode_table) +
1128 (offset >> EXT2_BLOCK_SIZE_BITS(sb));
1129 if (!(bh = sb_bread(sb, block)))
1130 goto Eio;
1131
1132 *p = bh;
1133 offset &= (EXT2_BLOCK_SIZE(sb) - 1);
1134 return (struct ext2_inode *) (bh->b_data + offset);
1135
1136Einval:
1137 ext2_error(sb, "ext2_get_inode", "bad inode number: %lu",
1138 (unsigned long) ino);
1139 return ERR_PTR(-EINVAL);
1140Eio:
1141 ext2_error(sb, "ext2_get_inode",
1142 "unable to read inode block - inode=%lu, block=%lu",
1143 (unsigned long) ino, block);
1144Egdp:
1145 return ERR_PTR(-EIO);
1146}
1147
1148void ext2_set_inode_flags(struct inode *inode)
1149{
1150 unsigned int flags = EXT2_I(inode)->i_flags;
1151
1152 inode->i_flags &= ~(S_SYNC|S_APPEND|S_IMMUTABLE|S_NOATIME|S_DIRSYNC);
1153 if (flags & EXT2_SYNC_FL)
1154 inode->i_flags |= S_SYNC;
1155 if (flags & EXT2_APPEND_FL)
1156 inode->i_flags |= S_APPEND;
1157 if (flags & EXT2_IMMUTABLE_FL)
1158 inode->i_flags |= S_IMMUTABLE;
1159 if (flags & EXT2_NOATIME_FL)
1160 inode->i_flags |= S_NOATIME;
1161 if (flags & EXT2_DIRSYNC_FL)
1162 inode->i_flags |= S_DIRSYNC;
1163}
1164
1165
1166void ext2_get_inode_flags(struct ext2_inode_info *ei)
1167{
1168 unsigned int flags = ei->vfs_inode.i_flags;
1169
1170 ei->i_flags &= ~(EXT2_SYNC_FL|EXT2_APPEND_FL|
1171 EXT2_IMMUTABLE_FL|EXT2_NOATIME_FL|EXT2_DIRSYNC_FL);
1172 if (flags & S_SYNC)
1173 ei->i_flags |= EXT2_SYNC_FL;
1174 if (flags & S_APPEND)
1175 ei->i_flags |= EXT2_APPEND_FL;
1176 if (flags & S_IMMUTABLE)
1177 ei->i_flags |= EXT2_IMMUTABLE_FL;
1178 if (flags & S_NOATIME)
1179 ei->i_flags |= EXT2_NOATIME_FL;
1180 if (flags & S_DIRSYNC)
1181 ei->i_flags |= EXT2_DIRSYNC_FL;
1182}
1183
1184struct inode *ext2_iget (struct super_block *sb, unsigned long ino)
1185{
1186 struct ext2_inode_info *ei;
1187 struct buffer_head * bh;
1188 struct ext2_inode *raw_inode;
1189 struct inode *inode;
1190 long ret = -EIO;
1191 int n;
1192
1193 inode = iget_locked(sb, ino);
1194 if (!inode)
1195 return ERR_PTR(-ENOMEM);
1196 if (!(inode->i_state & I_NEW))
1197 return inode;
1198
1199 ei = EXT2_I(inode);
1200#ifdef CONFIG_EXT2_FS_POSIX_ACL
1201 ei->i_acl = EXT2_ACL_NOT_CACHED;
1202 ei->i_default_acl = EXT2_ACL_NOT_CACHED;
1203#endif
1204 ei->i_block_alloc_info = NULL;
1205
1206 raw_inode = ext2_get_inode(inode->i_sb, ino, &bh);
1207 if (IS_ERR(raw_inode)) {
1208 ret = PTR_ERR(raw_inode);
1209 goto bad_inode;
1210 }
1211
1212 inode->i_mode = le16_to_cpu(raw_inode->i_mode);
1213 inode->i_uid = (uid_t)le16_to_cpu(raw_inode->i_uid_low);
1214 inode->i_gid = (gid_t)le16_to_cpu(raw_inode->i_gid_low);
1215 if (!(test_opt (inode->i_sb, NO_UID32))) {
1216 inode->i_uid |= le16_to_cpu(raw_inode->i_uid_high) << 16;
1217 inode->i_gid |= le16_to_cpu(raw_inode->i_gid_high) << 16;
1218 }
1219 inode->i_nlink = le16_to_cpu(raw_inode->i_links_count);
1220 inode->i_size = le32_to_cpu(raw_inode->i_size);
1221 inode->i_atime.tv_sec = (signed)le32_to_cpu(raw_inode->i_atime);
1222 inode->i_ctime.tv_sec = (signed)le32_to_cpu(raw_inode->i_ctime);
1223 inode->i_mtime.tv_sec = (signed)le32_to_cpu(raw_inode->i_mtime);
1224 inode->i_atime.tv_nsec = inode->i_mtime.tv_nsec = inode->i_ctime.tv_nsec = 0;
1225 ei->i_dtime = le32_to_cpu(raw_inode->i_dtime);
1226
1227
1228
1229
1230
1231 if (inode->i_nlink == 0 && (inode->i_mode == 0 || ei->i_dtime)) {
1232
1233 brelse (bh);
1234 ret = -ESTALE;
1235 goto bad_inode;
1236 }
1237 inode->i_blocks = le32_to_cpu(raw_inode->i_blocks);
1238 ei->i_flags = le32_to_cpu(raw_inode->i_flags);
1239 ei->i_faddr = le32_to_cpu(raw_inode->i_faddr);
1240 ei->i_frag_no = raw_inode->i_frag;
1241 ei->i_frag_size = raw_inode->i_fsize;
1242 ei->i_file_acl = le32_to_cpu(raw_inode->i_file_acl);
1243 ei->i_dir_acl = 0;
1244 if (S_ISREG(inode->i_mode))
1245 inode->i_size |= ((__u64)le32_to_cpu(raw_inode->i_size_high)) << 32;
1246 else
1247 ei->i_dir_acl = le32_to_cpu(raw_inode->i_dir_acl);
1248 ei->i_dtime = 0;
1249 inode->i_generation = le32_to_cpu(raw_inode->i_generation);
1250 ei->i_state = 0;
1251 ei->i_block_group = (ino - 1) / EXT2_INODES_PER_GROUP(inode->i_sb);
1252 ei->i_dir_start_lookup = 0;
1253
1254
1255
1256
1257
1258 for (n = 0; n < EXT2_N_BLOCKS; n++)
1259 ei->i_data[n] = raw_inode->i_block[n];
1260
1261 if (S_ISREG(inode->i_mode)) {
1262 inode->i_op = &ext2_file_inode_operations;
1263 if (ext2_use_xip(inode->i_sb)) {
1264 inode->i_mapping->a_ops = &ext2_aops_xip;
1265 inode->i_fop = &ext2_xip_file_operations;
1266 } else if (test_opt(inode->i_sb, NOBH)) {
1267 inode->i_mapping->a_ops = &ext2_nobh_aops;
1268 inode->i_fop = &ext2_file_operations;
1269 } else {
1270 inode->i_mapping->a_ops = &ext2_aops;
1271 inode->i_fop = &ext2_file_operations;
1272 }
1273 } else if (S_ISDIR(inode->i_mode)) {
1274 inode->i_op = &ext2_dir_inode_operations;
1275 inode->i_fop = &ext2_dir_operations;
1276 if (test_opt(inode->i_sb, NOBH))
1277 inode->i_mapping->a_ops = &ext2_nobh_aops;
1278 else
1279 inode->i_mapping->a_ops = &ext2_aops;
1280 } else if (S_ISLNK(inode->i_mode)) {
1281 if (ext2_inode_is_fast_symlink(inode))
1282 inode->i_op = &ext2_fast_symlink_inode_operations;
1283 else {
1284 inode->i_op = &ext2_symlink_inode_operations;
1285 if (test_opt(inode->i_sb, NOBH))
1286 inode->i_mapping->a_ops = &ext2_nobh_aops;
1287 else
1288 inode->i_mapping->a_ops = &ext2_aops;
1289 }
1290 } else {
1291 inode->i_op = &ext2_special_inode_operations;
1292 if (raw_inode->i_block[0])
1293 init_special_inode(inode, inode->i_mode,
1294 old_decode_dev(le32_to_cpu(raw_inode->i_block[0])));
1295 else
1296 init_special_inode(inode, inode->i_mode,
1297 new_decode_dev(le32_to_cpu(raw_inode->i_block[1])));
1298 }
1299 brelse (bh);
1300 ext2_set_inode_flags(inode);
1301 unlock_new_inode(inode);
1302 return inode;
1303
1304bad_inode:
1305 iget_failed(inode);
1306 return ERR_PTR(ret);
1307}
1308
1309static int ext2_update_inode(struct inode * inode, int do_sync)
1310{
1311 struct ext2_inode_info *ei = EXT2_I(inode);
1312 struct super_block *sb = inode->i_sb;
1313 ino_t ino = inode->i_ino;
1314 uid_t uid = inode->i_uid;
1315 gid_t gid = inode->i_gid;
1316 struct buffer_head * bh;
1317 struct ext2_inode * raw_inode = ext2_get_inode(sb, ino, &bh);
1318 int n;
1319 int err = 0;
1320
1321 if (IS_ERR(raw_inode))
1322 return -EIO;
1323
1324
1325
1326 if (ei->i_state & EXT2_STATE_NEW)
1327 memset(raw_inode, 0, EXT2_SB(sb)->s_inode_size);
1328
1329 ext2_get_inode_flags(ei);
1330 raw_inode->i_mode = cpu_to_le16(inode->i_mode);
1331 if (!(test_opt(sb, NO_UID32))) {
1332 raw_inode->i_uid_low = cpu_to_le16(low_16_bits(uid));
1333 raw_inode->i_gid_low = cpu_to_le16(low_16_bits(gid));
1334
1335
1336
1337
1338 if (!ei->i_dtime) {
1339 raw_inode->i_uid_high = cpu_to_le16(high_16_bits(uid));
1340 raw_inode->i_gid_high = cpu_to_le16(high_16_bits(gid));
1341 } else {
1342 raw_inode->i_uid_high = 0;
1343 raw_inode->i_gid_high = 0;
1344 }
1345 } else {
1346 raw_inode->i_uid_low = cpu_to_le16(fs_high2lowuid(uid));
1347 raw_inode->i_gid_low = cpu_to_le16(fs_high2lowgid(gid));
1348 raw_inode->i_uid_high = 0;
1349 raw_inode->i_gid_high = 0;
1350 }
1351 raw_inode->i_links_count = cpu_to_le16(inode->i_nlink);
1352 raw_inode->i_size = cpu_to_le32(inode->i_size);
1353 raw_inode->i_atime = cpu_to_le32(inode->i_atime.tv_sec);
1354 raw_inode->i_ctime = cpu_to_le32(inode->i_ctime.tv_sec);
1355 raw_inode->i_mtime = cpu_to_le32(inode->i_mtime.tv_sec);
1356
1357 raw_inode->i_blocks = cpu_to_le32(inode->i_blocks);
1358 raw_inode->i_dtime = cpu_to_le32(ei->i_dtime);
1359 raw_inode->i_flags = cpu_to_le32(ei->i_flags);
1360 raw_inode->i_faddr = cpu_to_le32(ei->i_faddr);
1361 raw_inode->i_frag = ei->i_frag_no;
1362 raw_inode->i_fsize = ei->i_frag_size;
1363 raw_inode->i_file_acl = cpu_to_le32(ei->i_file_acl);
1364 if (!S_ISREG(inode->i_mode))
1365 raw_inode->i_dir_acl = cpu_to_le32(ei->i_dir_acl);
1366 else {
1367 raw_inode->i_size_high = cpu_to_le32(inode->i_size >> 32);
1368 if (inode->i_size > 0x7fffffffULL) {
1369 if (!EXT2_HAS_RO_COMPAT_FEATURE(sb,
1370 EXT2_FEATURE_RO_COMPAT_LARGE_FILE) ||
1371 EXT2_SB(sb)->s_es->s_rev_level ==
1372 cpu_to_le32(EXT2_GOOD_OLD_REV)) {
1373
1374
1375
1376 lock_kernel();
1377 ext2_update_dynamic_rev(sb);
1378 EXT2_SET_RO_COMPAT_FEATURE(sb,
1379 EXT2_FEATURE_RO_COMPAT_LARGE_FILE);
1380 unlock_kernel();
1381 ext2_write_super(sb);
1382 }
1383 }
1384 }
1385
1386 raw_inode->i_generation = cpu_to_le32(inode->i_generation);
1387 if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode)) {
1388 if (old_valid_dev(inode->i_rdev)) {
1389 raw_inode->i_block[0] =
1390 cpu_to_le32(old_encode_dev(inode->i_rdev));
1391 raw_inode->i_block[1] = 0;
1392 } else {
1393 raw_inode->i_block[0] = 0;
1394 raw_inode->i_block[1] =
1395 cpu_to_le32(new_encode_dev(inode->i_rdev));
1396 raw_inode->i_block[2] = 0;
1397 }
1398 } else for (n = 0; n < EXT2_N_BLOCKS; n++)
1399 raw_inode->i_block[n] = ei->i_data[n];
1400 mark_buffer_dirty(bh);
1401 if (do_sync) {
1402 sync_dirty_buffer(bh);
1403 if (buffer_req(bh) && !buffer_uptodate(bh)) {
1404 printk ("IO error syncing ext2 inode [%s:%08lx]\n",
1405 sb->s_id, (unsigned long) ino);
1406 err = -EIO;
1407 }
1408 }
1409 ei->i_state &= ~EXT2_STATE_NEW;
1410 brelse (bh);
1411 return err;
1412}
1413
1414int ext2_write_inode(struct inode *inode, int wait)
1415{
1416 return ext2_update_inode(inode, wait);
1417}
1418
1419int ext2_sync_inode(struct inode *inode)
1420{
1421 struct writeback_control wbc = {
1422 .sync_mode = WB_SYNC_ALL,
1423 .nr_to_write = 0,
1424 };
1425 return sync_inode(inode, &wbc);
1426}
1427
1428int ext2_setattr(struct dentry *dentry, struct iattr *iattr)
1429{
1430 struct inode *inode = dentry->d_inode;
1431 int error;
1432
1433 error = inode_change_ok(inode, iattr);
1434 if (error)
1435 return error;
1436 if ((iattr->ia_valid & ATTR_UID && iattr->ia_uid != inode->i_uid) ||
1437 (iattr->ia_valid & ATTR_GID && iattr->ia_gid != inode->i_gid)) {
1438 error = DQUOT_TRANSFER(inode, iattr) ? -EDQUOT : 0;
1439 if (error)
1440 return error;
1441 }
1442 error = inode_setattr(inode, iattr);
1443 if (!error && (iattr->ia_valid & ATTR_MODE))
1444 error = ext2_acl_chmod(inode);
1445 return error;
1446}
1447