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};
795
796const struct address_space_operations ext2_aops_xip = {
797 .bmap = ext2_bmap,
798 .get_xip_mem = ext2_get_xip_mem,
799};
800
801const struct address_space_operations ext2_nobh_aops = {
802 .readpage = ext2_readpage,
803 .readpages = ext2_readpages,
804 .writepage = ext2_nobh_writepage,
805 .sync_page = block_sync_page,
806 .write_begin = ext2_nobh_write_begin,
807 .write_end = nobh_write_end,
808 .bmap = ext2_bmap,
809 .direct_IO = ext2_direct_IO,
810 .writepages = ext2_writepages,
811 .migratepage = buffer_migrate_page,
812};
813
814
815
816
817
818
819static inline int all_zeroes(__le32 *p, __le32 *q)
820{
821 while (p < q)
822 if (*p++)
823 return 0;
824 return 1;
825}
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
861static Indirect *ext2_find_shared(struct inode *inode,
862 int depth,
863 int offsets[4],
864 Indirect chain[4],
865 __le32 *top)
866{
867 Indirect *partial, *p;
868 int k, err;
869
870 *top = 0;
871 for (k = depth; k > 1 && !offsets[k-1]; k--)
872 ;
873 partial = ext2_get_branch(inode, k, offsets, chain, &err);
874 if (!partial)
875 partial = chain + k-1;
876
877
878
879
880 write_lock(&EXT2_I(inode)->i_meta_lock);
881 if (!partial->key && *partial->p) {
882 write_unlock(&EXT2_I(inode)->i_meta_lock);
883 goto no_top;
884 }
885 for (p=partial; p>chain && all_zeroes((__le32*)p->bh->b_data,p->p); p--)
886 ;
887
888
889
890
891
892
893 if (p == chain + k - 1 && p > chain) {
894 p->p--;
895 } else {
896 *top = *p->p;
897 *p->p = 0;
898 }
899 write_unlock(&EXT2_I(inode)->i_meta_lock);
900
901 while(partial > p)
902 {
903 brelse(partial->bh);
904 partial--;
905 }
906no_top:
907 return partial;
908}
909
910
911
912
913
914
915
916
917
918
919
920static inline void ext2_free_data(struct inode *inode, __le32 *p, __le32 *q)
921{
922 unsigned long block_to_free = 0, count = 0;
923 unsigned long nr;
924
925 for ( ; p < q ; p++) {
926 nr = le32_to_cpu(*p);
927 if (nr) {
928 *p = 0;
929
930 if (count == 0)
931 goto free_this;
932 else if (block_to_free == nr - count)
933 count++;
934 else {
935 mark_inode_dirty(inode);
936 ext2_free_blocks (inode, block_to_free, count);
937 free_this:
938 block_to_free = nr;
939 count = 1;
940 }
941 }
942 }
943 if (count > 0) {
944 mark_inode_dirty(inode);
945 ext2_free_blocks (inode, block_to_free, count);
946 }
947}
948
949
950
951
952
953
954
955
956
957
958
959
960static void ext2_free_branches(struct inode *inode, __le32 *p, __le32 *q, int depth)
961{
962 struct buffer_head * bh;
963 unsigned long nr;
964
965 if (depth--) {
966 int addr_per_block = EXT2_ADDR_PER_BLOCK(inode->i_sb);
967 for ( ; p < q ; p++) {
968 nr = le32_to_cpu(*p);
969 if (!nr)
970 continue;
971 *p = 0;
972 bh = sb_bread(inode->i_sb, nr);
973
974
975
976
977 if (!bh) {
978 ext2_error(inode->i_sb, "ext2_free_branches",
979 "Read failure, inode=%ld, block=%ld",
980 inode->i_ino, nr);
981 continue;
982 }
983 ext2_free_branches(inode,
984 (__le32*)bh->b_data,
985 (__le32*)bh->b_data + addr_per_block,
986 depth);
987 bforget(bh);
988 ext2_free_blocks(inode, nr, 1);
989 mark_inode_dirty(inode);
990 }
991 } else
992 ext2_free_data(inode, p, q);
993}
994
995void ext2_truncate(struct inode *inode)
996{
997 __le32 *i_data = EXT2_I(inode)->i_data;
998 struct ext2_inode_info *ei = EXT2_I(inode);
999 int addr_per_block = EXT2_ADDR_PER_BLOCK(inode->i_sb);
1000 int offsets[4];
1001 Indirect chain[4];
1002 Indirect *partial;
1003 __le32 nr = 0;
1004 int n;
1005 long iblock;
1006 unsigned blocksize;
1007
1008 if (!(S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode) ||
1009 S_ISLNK(inode->i_mode)))
1010 return;
1011 if (ext2_inode_is_fast_symlink(inode))
1012 return;
1013 if (IS_APPEND(inode) || IS_IMMUTABLE(inode))
1014 return;
1015
1016 blocksize = inode->i_sb->s_blocksize;
1017 iblock = (inode->i_size + blocksize-1)
1018 >> EXT2_BLOCK_SIZE_BITS(inode->i_sb);
1019
1020 if (mapping_is_xip(inode->i_mapping))
1021 xip_truncate_page(inode->i_mapping, inode->i_size);
1022 else if (test_opt(inode->i_sb, NOBH))
1023 nobh_truncate_page(inode->i_mapping,
1024 inode->i_size, ext2_get_block);
1025 else
1026 block_truncate_page(inode->i_mapping,
1027 inode->i_size, ext2_get_block);
1028
1029 n = ext2_block_to_path(inode, iblock, offsets, NULL);
1030 if (n == 0)
1031 return;
1032
1033
1034
1035
1036
1037 mutex_lock(&ei->truncate_mutex);
1038
1039 if (n == 1) {
1040 ext2_free_data(inode, i_data+offsets[0],
1041 i_data + EXT2_NDIR_BLOCKS);
1042 goto do_indirects;
1043 }
1044
1045 partial = ext2_find_shared(inode, n, offsets, chain, &nr);
1046
1047 if (nr) {
1048 if (partial == chain)
1049 mark_inode_dirty(inode);
1050 else
1051 mark_buffer_dirty_inode(partial->bh, inode);
1052 ext2_free_branches(inode, &nr, &nr+1, (chain+n-1) - partial);
1053 }
1054
1055 while (partial > chain) {
1056 ext2_free_branches(inode,
1057 partial->p + 1,
1058 (__le32*)partial->bh->b_data+addr_per_block,
1059 (chain+n-1) - partial);
1060 mark_buffer_dirty_inode(partial->bh, inode);
1061 brelse (partial->bh);
1062 partial--;
1063 }
1064do_indirects:
1065
1066 switch (offsets[0]) {
1067 default:
1068 nr = i_data[EXT2_IND_BLOCK];
1069 if (nr) {
1070 i_data[EXT2_IND_BLOCK] = 0;
1071 mark_inode_dirty(inode);
1072 ext2_free_branches(inode, &nr, &nr+1, 1);
1073 }
1074 case EXT2_IND_BLOCK:
1075 nr = i_data[EXT2_DIND_BLOCK];
1076 if (nr) {
1077 i_data[EXT2_DIND_BLOCK] = 0;
1078 mark_inode_dirty(inode);
1079 ext2_free_branches(inode, &nr, &nr+1, 2);
1080 }
1081 case EXT2_DIND_BLOCK:
1082 nr = i_data[EXT2_TIND_BLOCK];
1083 if (nr) {
1084 i_data[EXT2_TIND_BLOCK] = 0;
1085 mark_inode_dirty(inode);
1086 ext2_free_branches(inode, &nr, &nr+1, 3);
1087 }
1088 case EXT2_TIND_BLOCK:
1089 ;
1090 }
1091
1092 ext2_discard_reservation(inode);
1093
1094 mutex_unlock(&ei->truncate_mutex);
1095 inode->i_mtime = inode->i_ctime = CURRENT_TIME_SEC;
1096 if (inode_needs_sync(inode)) {
1097 sync_mapping_buffers(inode->i_mapping);
1098 ext2_sync_inode (inode);
1099 } else {
1100 mark_inode_dirty(inode);
1101 }
1102}
1103
1104static struct ext2_inode *ext2_get_inode(struct super_block *sb, ino_t ino,
1105 struct buffer_head **p)
1106{
1107 struct buffer_head * bh;
1108 unsigned long block_group;
1109 unsigned long block;
1110 unsigned long offset;
1111 struct ext2_group_desc * gdp;
1112
1113 *p = NULL;
1114 if ((ino != EXT2_ROOT_INO && ino < EXT2_FIRST_INO(sb)) ||
1115 ino > le32_to_cpu(EXT2_SB(sb)->s_es->s_inodes_count))
1116 goto Einval;
1117
1118 block_group = (ino - 1) / EXT2_INODES_PER_GROUP(sb);
1119 gdp = ext2_get_group_desc(sb, block_group, NULL);
1120 if (!gdp)
1121 goto Egdp;
1122
1123
1124
1125 offset = ((ino - 1) % EXT2_INODES_PER_GROUP(sb)) * EXT2_INODE_SIZE(sb);
1126 block = le32_to_cpu(gdp->bg_inode_table) +
1127 (offset >> EXT2_BLOCK_SIZE_BITS(sb));
1128 if (!(bh = sb_bread(sb, block)))
1129 goto Eio;
1130
1131 *p = bh;
1132 offset &= (EXT2_BLOCK_SIZE(sb) - 1);
1133 return (struct ext2_inode *) (bh->b_data + offset);
1134
1135Einval:
1136 ext2_error(sb, "ext2_get_inode", "bad inode number: %lu",
1137 (unsigned long) ino);
1138 return ERR_PTR(-EINVAL);
1139Eio:
1140 ext2_error(sb, "ext2_get_inode",
1141 "unable to read inode block - inode=%lu, block=%lu",
1142 (unsigned long) ino, block);
1143Egdp:
1144 return ERR_PTR(-EIO);
1145}
1146
1147void ext2_set_inode_flags(struct inode *inode)
1148{
1149 unsigned int flags = EXT2_I(inode)->i_flags;
1150
1151 inode->i_flags &= ~(S_SYNC|S_APPEND|S_IMMUTABLE|S_NOATIME|S_DIRSYNC);
1152 if (flags & EXT2_SYNC_FL)
1153 inode->i_flags |= S_SYNC;
1154 if (flags & EXT2_APPEND_FL)
1155 inode->i_flags |= S_APPEND;
1156 if (flags & EXT2_IMMUTABLE_FL)
1157 inode->i_flags |= S_IMMUTABLE;
1158 if (flags & EXT2_NOATIME_FL)
1159 inode->i_flags |= S_NOATIME;
1160 if (flags & EXT2_DIRSYNC_FL)
1161 inode->i_flags |= S_DIRSYNC;
1162}
1163
1164
1165void ext2_get_inode_flags(struct ext2_inode_info *ei)
1166{
1167 unsigned int flags = ei->vfs_inode.i_flags;
1168
1169 ei->i_flags &= ~(EXT2_SYNC_FL|EXT2_APPEND_FL|
1170 EXT2_IMMUTABLE_FL|EXT2_NOATIME_FL|EXT2_DIRSYNC_FL);
1171 if (flags & S_SYNC)
1172 ei->i_flags |= EXT2_SYNC_FL;
1173 if (flags & S_APPEND)
1174 ei->i_flags |= EXT2_APPEND_FL;
1175 if (flags & S_IMMUTABLE)
1176 ei->i_flags |= EXT2_IMMUTABLE_FL;
1177 if (flags & S_NOATIME)
1178 ei->i_flags |= EXT2_NOATIME_FL;
1179 if (flags & S_DIRSYNC)
1180 ei->i_flags |= EXT2_DIRSYNC_FL;
1181}
1182
1183struct inode *ext2_iget (struct super_block *sb, unsigned long ino)
1184{
1185 struct ext2_inode_info *ei;
1186 struct buffer_head * bh;
1187 struct ext2_inode *raw_inode;
1188 struct inode *inode;
1189 long ret = -EIO;
1190 int n;
1191
1192 inode = iget_locked(sb, ino);
1193 if (!inode)
1194 return ERR_PTR(-ENOMEM);
1195 if (!(inode->i_state & I_NEW))
1196 return inode;
1197
1198 ei = EXT2_I(inode);
1199#ifdef CONFIG_EXT2_FS_POSIX_ACL
1200 ei->i_acl = EXT2_ACL_NOT_CACHED;
1201 ei->i_default_acl = EXT2_ACL_NOT_CACHED;
1202#endif
1203 ei->i_block_alloc_info = NULL;
1204
1205 raw_inode = ext2_get_inode(inode->i_sb, ino, &bh);
1206 if (IS_ERR(raw_inode)) {
1207 ret = PTR_ERR(raw_inode);
1208 goto bad_inode;
1209 }
1210
1211 inode->i_mode = le16_to_cpu(raw_inode->i_mode);
1212 inode->i_uid = (uid_t)le16_to_cpu(raw_inode->i_uid_low);
1213 inode->i_gid = (gid_t)le16_to_cpu(raw_inode->i_gid_low);
1214 if (!(test_opt (inode->i_sb, NO_UID32))) {
1215 inode->i_uid |= le16_to_cpu(raw_inode->i_uid_high) << 16;
1216 inode->i_gid |= le16_to_cpu(raw_inode->i_gid_high) << 16;
1217 }
1218 inode->i_nlink = le16_to_cpu(raw_inode->i_links_count);
1219 inode->i_size = le32_to_cpu(raw_inode->i_size);
1220 inode->i_atime.tv_sec = (signed)le32_to_cpu(raw_inode->i_atime);
1221 inode->i_ctime.tv_sec = (signed)le32_to_cpu(raw_inode->i_ctime);
1222 inode->i_mtime.tv_sec = (signed)le32_to_cpu(raw_inode->i_mtime);
1223 inode->i_atime.tv_nsec = inode->i_mtime.tv_nsec = inode->i_ctime.tv_nsec = 0;
1224 ei->i_dtime = le32_to_cpu(raw_inode->i_dtime);
1225
1226
1227
1228
1229
1230 if (inode->i_nlink == 0 && (inode->i_mode == 0 || ei->i_dtime)) {
1231
1232 brelse (bh);
1233 ret = -ESTALE;
1234 goto bad_inode;
1235 }
1236 inode->i_blocks = le32_to_cpu(raw_inode->i_blocks);
1237 ei->i_flags = le32_to_cpu(raw_inode->i_flags);
1238 ei->i_faddr = le32_to_cpu(raw_inode->i_faddr);
1239 ei->i_frag_no = raw_inode->i_frag;
1240 ei->i_frag_size = raw_inode->i_fsize;
1241 ei->i_file_acl = le32_to_cpu(raw_inode->i_file_acl);
1242 ei->i_dir_acl = 0;
1243 if (S_ISREG(inode->i_mode))
1244 inode->i_size |= ((__u64)le32_to_cpu(raw_inode->i_size_high)) << 32;
1245 else
1246 ei->i_dir_acl = le32_to_cpu(raw_inode->i_dir_acl);
1247 ei->i_dtime = 0;
1248 inode->i_generation = le32_to_cpu(raw_inode->i_generation);
1249 ei->i_state = 0;
1250 ei->i_block_group = (ino - 1) / EXT2_INODES_PER_GROUP(inode->i_sb);
1251 ei->i_dir_start_lookup = 0;
1252
1253
1254
1255
1256
1257 for (n = 0; n < EXT2_N_BLOCKS; n++)
1258 ei->i_data[n] = raw_inode->i_block[n];
1259
1260 if (S_ISREG(inode->i_mode)) {
1261 inode->i_op = &ext2_file_inode_operations;
1262 if (ext2_use_xip(inode->i_sb)) {
1263 inode->i_mapping->a_ops = &ext2_aops_xip;
1264 inode->i_fop = &ext2_xip_file_operations;
1265 } else if (test_opt(inode->i_sb, NOBH)) {
1266 inode->i_mapping->a_ops = &ext2_nobh_aops;
1267 inode->i_fop = &ext2_file_operations;
1268 } else {
1269 inode->i_mapping->a_ops = &ext2_aops;
1270 inode->i_fop = &ext2_file_operations;
1271 }
1272 } else if (S_ISDIR(inode->i_mode)) {
1273 inode->i_op = &ext2_dir_inode_operations;
1274 inode->i_fop = &ext2_dir_operations;
1275 if (test_opt(inode->i_sb, NOBH))
1276 inode->i_mapping->a_ops = &ext2_nobh_aops;
1277 else
1278 inode->i_mapping->a_ops = &ext2_aops;
1279 } else if (S_ISLNK(inode->i_mode)) {
1280 if (ext2_inode_is_fast_symlink(inode))
1281 inode->i_op = &ext2_fast_symlink_inode_operations;
1282 else {
1283 inode->i_op = &ext2_symlink_inode_operations;
1284 if (test_opt(inode->i_sb, NOBH))
1285 inode->i_mapping->a_ops = &ext2_nobh_aops;
1286 else
1287 inode->i_mapping->a_ops = &ext2_aops;
1288 }
1289 } else {
1290 inode->i_op = &ext2_special_inode_operations;
1291 if (raw_inode->i_block[0])
1292 init_special_inode(inode, inode->i_mode,
1293 old_decode_dev(le32_to_cpu(raw_inode->i_block[0])));
1294 else
1295 init_special_inode(inode, inode->i_mode,
1296 new_decode_dev(le32_to_cpu(raw_inode->i_block[1])));
1297 }
1298 brelse (bh);
1299 ext2_set_inode_flags(inode);
1300 unlock_new_inode(inode);
1301 return inode;
1302
1303bad_inode:
1304 iget_failed(inode);
1305 return ERR_PTR(ret);
1306}
1307
1308static int ext2_update_inode(struct inode * inode, int do_sync)
1309{
1310 struct ext2_inode_info *ei = EXT2_I(inode);
1311 struct super_block *sb = inode->i_sb;
1312 ino_t ino = inode->i_ino;
1313 uid_t uid = inode->i_uid;
1314 gid_t gid = inode->i_gid;
1315 struct buffer_head * bh;
1316 struct ext2_inode * raw_inode = ext2_get_inode(sb, ino, &bh);
1317 int n;
1318 int err = 0;
1319
1320 if (IS_ERR(raw_inode))
1321 return -EIO;
1322
1323
1324
1325 if (ei->i_state & EXT2_STATE_NEW)
1326 memset(raw_inode, 0, EXT2_SB(sb)->s_inode_size);
1327
1328 ext2_get_inode_flags(ei);
1329 raw_inode->i_mode = cpu_to_le16(inode->i_mode);
1330 if (!(test_opt(sb, NO_UID32))) {
1331 raw_inode->i_uid_low = cpu_to_le16(low_16_bits(uid));
1332 raw_inode->i_gid_low = cpu_to_le16(low_16_bits(gid));
1333
1334
1335
1336
1337 if (!ei->i_dtime) {
1338 raw_inode->i_uid_high = cpu_to_le16(high_16_bits(uid));
1339 raw_inode->i_gid_high = cpu_to_le16(high_16_bits(gid));
1340 } else {
1341 raw_inode->i_uid_high = 0;
1342 raw_inode->i_gid_high = 0;
1343 }
1344 } else {
1345 raw_inode->i_uid_low = cpu_to_le16(fs_high2lowuid(uid));
1346 raw_inode->i_gid_low = cpu_to_le16(fs_high2lowgid(gid));
1347 raw_inode->i_uid_high = 0;
1348 raw_inode->i_gid_high = 0;
1349 }
1350 raw_inode->i_links_count = cpu_to_le16(inode->i_nlink);
1351 raw_inode->i_size = cpu_to_le32(inode->i_size);
1352 raw_inode->i_atime = cpu_to_le32(inode->i_atime.tv_sec);
1353 raw_inode->i_ctime = cpu_to_le32(inode->i_ctime.tv_sec);
1354 raw_inode->i_mtime = cpu_to_le32(inode->i_mtime.tv_sec);
1355
1356 raw_inode->i_blocks = cpu_to_le32(inode->i_blocks);
1357 raw_inode->i_dtime = cpu_to_le32(ei->i_dtime);
1358 raw_inode->i_flags = cpu_to_le32(ei->i_flags);
1359 raw_inode->i_faddr = cpu_to_le32(ei->i_faddr);
1360 raw_inode->i_frag = ei->i_frag_no;
1361 raw_inode->i_fsize = ei->i_frag_size;
1362 raw_inode->i_file_acl = cpu_to_le32(ei->i_file_acl);
1363 if (!S_ISREG(inode->i_mode))
1364 raw_inode->i_dir_acl = cpu_to_le32(ei->i_dir_acl);
1365 else {
1366 raw_inode->i_size_high = cpu_to_le32(inode->i_size >> 32);
1367 if (inode->i_size > 0x7fffffffULL) {
1368 if (!EXT2_HAS_RO_COMPAT_FEATURE(sb,
1369 EXT2_FEATURE_RO_COMPAT_LARGE_FILE) ||
1370 EXT2_SB(sb)->s_es->s_rev_level ==
1371 cpu_to_le32(EXT2_GOOD_OLD_REV)) {
1372
1373
1374
1375 lock_kernel();
1376 ext2_update_dynamic_rev(sb);
1377 EXT2_SET_RO_COMPAT_FEATURE(sb,
1378 EXT2_FEATURE_RO_COMPAT_LARGE_FILE);
1379 unlock_kernel();
1380 ext2_write_super(sb);
1381 }
1382 }
1383 }
1384
1385 raw_inode->i_generation = cpu_to_le32(inode->i_generation);
1386 if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode)) {
1387 if (old_valid_dev(inode->i_rdev)) {
1388 raw_inode->i_block[0] =
1389 cpu_to_le32(old_encode_dev(inode->i_rdev));
1390 raw_inode->i_block[1] = 0;
1391 } else {
1392 raw_inode->i_block[0] = 0;
1393 raw_inode->i_block[1] =
1394 cpu_to_le32(new_encode_dev(inode->i_rdev));
1395 raw_inode->i_block[2] = 0;
1396 }
1397 } else for (n = 0; n < EXT2_N_BLOCKS; n++)
1398 raw_inode->i_block[n] = ei->i_data[n];
1399 mark_buffer_dirty(bh);
1400 if (do_sync) {
1401 sync_dirty_buffer(bh);
1402 if (buffer_req(bh) && !buffer_uptodate(bh)) {
1403 printk ("IO error syncing ext2 inode [%s:%08lx]\n",
1404 sb->s_id, (unsigned long) ino);
1405 err = -EIO;
1406 }
1407 }
1408 ei->i_state &= ~EXT2_STATE_NEW;
1409 brelse (bh);
1410 return err;
1411}
1412
1413int ext2_write_inode(struct inode *inode, int wait)
1414{
1415 return ext2_update_inode(inode, wait);
1416}
1417
1418int ext2_sync_inode(struct inode *inode)
1419{
1420 struct writeback_control wbc = {
1421 .sync_mode = WB_SYNC_ALL,
1422 .nr_to_write = 0,
1423 };
1424 return sync_inode(inode, &wbc);
1425}
1426
1427int ext2_setattr(struct dentry *dentry, struct iattr *iattr)
1428{
1429 struct inode *inode = dentry->d_inode;
1430 int error;
1431
1432 error = inode_change_ok(inode, iattr);
1433 if (error)
1434 return error;
1435 if ((iattr->ia_valid & ATTR_UID && iattr->ia_uid != inode->i_uid) ||
1436 (iattr->ia_valid & ATTR_GID && iattr->ia_gid != inode->i_gid)) {
1437 error = DQUOT_TRANSFER(inode, iattr) ? -EDQUOT : 0;
1438 if (error)
1439 return error;
1440 }
1441 error = inode_setattr(inode, iattr);
1442 if (!error && (iattr->ia_valid & ATTR_MODE))
1443 error = ext2_acl_chmod(inode);
1444 return error;
1445}
1446