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 unsigned long 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 unsigned long bg_start;
263 unsigned long 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 = (ei->i_block_group * EXT2_BLOCKS_PER_GROUP(inode->i_sb)) +
279 le32_to_cpu(EXT2_SB(inode->i_sb)->s_es->s_first_data_block);
280 colour = (current->pid % 16) *
281 (EXT2_BLOCKS_PER_GROUP(inode->i_sb) / 16);
282 return bg_start + colour;
283}
284
285
286
287
288
289
290
291
292
293
294
295static inline int ext2_find_goal(struct inode *inode,
296 long block,
297 Indirect chain[4],
298 Indirect *partial)
299{
300 struct ext2_block_alloc_info *block_i;
301
302 block_i = EXT2_I(inode)->i_block_alloc_info;
303
304
305
306
307
308 if (block_i && (block == block_i->last_alloc_logical_block + 1)
309 && (block_i->last_alloc_physical_block != 0)) {
310 return block_i->last_alloc_physical_block + 1;
311 }
312
313 return ext2_find_near(inode, partial);
314}
315
316
317
318
319
320
321
322
323
324
325
326
327
328static int
329ext2_blks_to_allocate(Indirect * branch, int k, unsigned long blks,
330 int blocks_to_boundary)
331{
332 unsigned long count = 0;
333
334
335
336
337
338 if (k > 0) {
339
340 if (blks < blocks_to_boundary + 1)
341 count += blks;
342 else
343 count += blocks_to_boundary + 1;
344 return count;
345 }
346
347 count++;
348 while (count < blks && count <= blocks_to_boundary
349 && le32_to_cpu(*(branch[0].p + count)) == 0) {
350 count++;
351 }
352 return count;
353}
354
355
356
357
358
359
360
361
362
363
364
365static int ext2_alloc_blocks(struct inode *inode,
366 ext2_fsblk_t goal, int indirect_blks, int blks,
367 ext2_fsblk_t new_blocks[4], int *err)
368{
369 int target, i;
370 unsigned long count = 0;
371 int index = 0;
372 ext2_fsblk_t current_block = 0;
373 int ret = 0;
374
375
376
377
378
379
380
381
382
383 target = blks + indirect_blks;
384
385 while (1) {
386 count = target;
387
388 current_block = ext2_new_blocks(inode,goal,&count,err);
389 if (*err)
390 goto failed_out;
391
392 target -= count;
393
394 while (index < indirect_blks && count) {
395 new_blocks[index++] = current_block++;
396 count--;
397 }
398
399 if (count > 0)
400 break;
401 }
402
403
404 new_blocks[index] = current_block;
405
406
407 ret = count;
408 *err = 0;
409 return ret;
410failed_out:
411 for (i = 0; i <index; i++)
412 ext2_free_blocks(inode, new_blocks[i], 1);
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
441static int ext2_alloc_branch(struct inode *inode,
442 int indirect_blks, int *blks, ext2_fsblk_t goal,
443 int *offsets, Indirect *branch)
444{
445 int blocksize = inode->i_sb->s_blocksize;
446 int i, n = 0;
447 int err = 0;
448 struct buffer_head *bh;
449 int num;
450 ext2_fsblk_t new_blocks[4];
451 ext2_fsblk_t current_block;
452
453 num = ext2_alloc_blocks(inode, goal, indirect_blks,
454 *blks, new_blocks, &err);
455 if (err)
456 return err;
457
458 branch[0].key = cpu_to_le32(new_blocks[0]);
459
460
461
462 for (n = 1; n <= indirect_blks; n++) {
463
464
465
466
467
468 bh = sb_getblk(inode->i_sb, new_blocks[n-1]);
469 branch[n].bh = bh;
470 lock_buffer(bh);
471 memset(bh->b_data, 0, blocksize);
472 branch[n].p = (__le32 *) bh->b_data + offsets[n];
473 branch[n].key = cpu_to_le32(new_blocks[n]);
474 *branch[n].p = branch[n].key;
475 if ( n == indirect_blks) {
476 current_block = new_blocks[n];
477
478
479
480
481
482 for (i=1; i < num; i++)
483 *(branch[n].p + i) = cpu_to_le32(++current_block);
484 }
485 set_buffer_uptodate(bh);
486 unlock_buffer(bh);
487 mark_buffer_dirty_inode(bh, inode);
488
489
490
491
492 if (S_ISDIR(inode->i_mode) && IS_DIRSYNC(inode))
493 sync_dirty_buffer(bh);
494 }
495 *blks = num;
496 return err;
497}
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513static void ext2_splice_branch(struct inode *inode,
514 long block, Indirect *where, int num, int blks)
515{
516 int i;
517 struct ext2_block_alloc_info *block_i;
518 ext2_fsblk_t current_block;
519
520 block_i = EXT2_I(inode)->i_block_alloc_info;
521
522
523
524
525 *where->p = where->key;
526
527
528
529
530
531 if (num == 0 && blks > 1) {
532 current_block = le32_to_cpu(where->key) + 1;
533 for (i = 1; i < blks; i++)
534 *(where->p + i ) = cpu_to_le32(current_block++);
535 }
536
537
538
539
540
541
542 if (block_i) {
543 block_i->last_alloc_logical_block = block + blks - 1;
544 block_i->last_alloc_physical_block =
545 le32_to_cpu(where[num].key) + blks - 1;
546 }
547
548
549
550
551 if (where->bh)
552 mark_buffer_dirty_inode(where->bh, inode);
553
554 inode->i_ctime = CURRENT_TIME_SEC;
555 mark_inode_dirty(inode);
556}
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577static int ext2_get_blocks(struct inode *inode,
578 sector_t iblock, unsigned long maxblocks,
579 struct buffer_head *bh_result,
580 int create)
581{
582 int err = -EIO;
583 int offsets[4];
584 Indirect chain[4];
585 Indirect *partial;
586 ext2_fsblk_t goal;
587 int indirect_blks;
588 int blocks_to_boundary = 0;
589 int depth;
590 struct ext2_inode_info *ei = EXT2_I(inode);
591 int count = 0;
592 ext2_fsblk_t first_block = 0;
593
594 depth = ext2_block_to_path(inode,iblock,offsets,&blocks_to_boundary);
595
596 if (depth == 0)
597 return (err);
598reread:
599 partial = ext2_get_branch(inode, depth, offsets, chain, &err);
600
601
602 if (!partial) {
603 first_block = le32_to_cpu(chain[depth - 1].key);
604 clear_buffer_new(bh_result);
605 count++;
606
607 while (count < maxblocks && count <= blocks_to_boundary) {
608 ext2_fsblk_t blk;
609
610 if (!verify_chain(chain, partial)) {
611
612
613
614
615
616
617 count = 0;
618 goto changed;
619 }
620 blk = le32_to_cpu(*(chain[depth-1].p + count));
621 if (blk == first_block + count)
622 count++;
623 else
624 break;
625 }
626 goto got_it;
627 }
628
629
630 if (!create || err == -EIO)
631 goto cleanup;
632
633 mutex_lock(&ei->truncate_mutex);
634
635
636
637
638
639 if (S_ISREG(inode->i_mode) && (!ei->i_block_alloc_info))
640 ext2_init_block_alloc_info(inode);
641
642 goal = ext2_find_goal(inode, iblock, chain, partial);
643
644
645 indirect_blks = (chain + depth) - partial - 1;
646
647
648
649
650 count = ext2_blks_to_allocate(partial, indirect_blks,
651 maxblocks, blocks_to_boundary);
652
653
654
655 err = ext2_alloc_branch(inode, indirect_blks, &count, goal,
656 offsets + (partial - chain), partial);
657
658 if (err) {
659 mutex_unlock(&ei->truncate_mutex);
660 goto cleanup;
661 }
662
663 if (ext2_use_xip(inode->i_sb)) {
664
665
666
667 err = ext2_clear_xip_target (inode,
668 le32_to_cpu(chain[depth-1].key));
669 if (err) {
670 mutex_unlock(&ei->truncate_mutex);
671 goto cleanup;
672 }
673 }
674
675 ext2_splice_branch(inode, iblock, partial, indirect_blks, count);
676 mutex_unlock(&ei->truncate_mutex);
677 set_buffer_new(bh_result);
678got_it:
679 map_bh(bh_result, inode->i_sb, le32_to_cpu(chain[depth-1].key));
680 if (count > blocks_to_boundary)
681 set_buffer_boundary(bh_result);
682 err = count;
683
684 partial = chain + depth - 1;
685cleanup:
686 while (partial > chain) {
687 brelse(partial->bh);
688 partial--;
689 }
690 return err;
691changed:
692 while (partial > chain) {
693 brelse(partial->bh);
694 partial--;
695 }
696 goto reread;
697}
698
699int ext2_get_block(struct inode *inode, sector_t iblock, struct buffer_head *bh_result, int create)
700{
701 unsigned max_blocks = bh_result->b_size >> inode->i_blkbits;
702 int ret = ext2_get_blocks(inode, iblock, max_blocks,
703 bh_result, create);
704 if (ret > 0) {
705 bh_result->b_size = (ret << inode->i_blkbits);
706 ret = 0;
707 }
708 return ret;
709
710}
711
712static int ext2_writepage(struct page *page, struct writeback_control *wbc)
713{
714 return block_write_full_page(page, ext2_get_block, wbc);
715}
716
717static int ext2_readpage(struct file *file, struct page *page)
718{
719 return mpage_readpage(page, ext2_get_block);
720}
721
722static int
723ext2_readpages(struct file *file, struct address_space *mapping,
724 struct list_head *pages, unsigned nr_pages)
725{
726 return mpage_readpages(mapping, pages, nr_pages, ext2_get_block);
727}
728
729int __ext2_write_begin(struct file *file, struct address_space *mapping,
730 loff_t pos, unsigned len, unsigned flags,
731 struct page **pagep, void **fsdata)
732{
733 return block_write_begin(file, mapping, pos, len, flags, pagep, fsdata,
734 ext2_get_block);
735}
736
737static int
738ext2_write_begin(struct file *file, struct address_space *mapping,
739 loff_t pos, unsigned len, unsigned flags,
740 struct page **pagep, void **fsdata)
741{
742 *pagep = NULL;
743 return __ext2_write_begin(file, mapping, pos, len, flags, pagep,fsdata);
744}
745
746static int
747ext2_nobh_write_begin(struct file *file, struct address_space *mapping,
748 loff_t pos, unsigned len, unsigned flags,
749 struct page **pagep, void **fsdata)
750{
751
752
753
754
755
756 return nobh_write_begin(file, mapping, pos, len, flags, pagep, fsdata,
757 ext2_get_block);
758}
759
760static int ext2_nobh_writepage(struct page *page,
761 struct writeback_control *wbc)
762{
763 return nobh_writepage(page, ext2_get_block, wbc);
764}
765
766static sector_t ext2_bmap(struct address_space *mapping, sector_t block)
767{
768 return generic_block_bmap(mapping,block,ext2_get_block);
769}
770
771static ssize_t
772ext2_direct_IO(int rw, struct kiocb *iocb, const struct iovec *iov,
773 loff_t offset, unsigned long nr_segs)
774{
775 struct file *file = iocb->ki_filp;
776 struct inode *inode = file->f_mapping->host;
777
778 return blockdev_direct_IO(rw, iocb, inode, inode->i_sb->s_bdev, iov,
779 offset, nr_segs, ext2_get_block, NULL);
780}
781
782static int
783ext2_writepages(struct address_space *mapping, struct writeback_control *wbc)
784{
785 return mpage_writepages(mapping, wbc, ext2_get_block);
786}
787
788const struct address_space_operations ext2_aops = {
789 .readpage = ext2_readpage,
790 .readpages = ext2_readpages,
791 .writepage = ext2_writepage,
792 .sync_page = block_sync_page,
793 .write_begin = ext2_write_begin,
794 .write_end = generic_write_end,
795 .bmap = ext2_bmap,
796 .direct_IO = ext2_direct_IO,
797 .writepages = ext2_writepages,
798 .migratepage = buffer_migrate_page,
799};
800
801const struct address_space_operations ext2_aops_xip = {
802 .bmap = ext2_bmap,
803 .get_xip_page = ext2_get_xip_page,
804};
805
806const struct address_space_operations ext2_nobh_aops = {
807 .readpage = ext2_readpage,
808 .readpages = ext2_readpages,
809 .writepage = ext2_nobh_writepage,
810 .sync_page = block_sync_page,
811 .write_begin = ext2_nobh_write_begin,
812 .write_end = nobh_write_end,
813 .bmap = ext2_bmap,
814 .direct_IO = ext2_direct_IO,
815 .writepages = ext2_writepages,
816 .migratepage = buffer_migrate_page,
817};
818
819
820
821
822
823
824static inline int all_zeroes(__le32 *p, __le32 *q)
825{
826 while (p < q)
827 if (*p++)
828 return 0;
829 return 1;
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
862
863
864
865
866static Indirect *ext2_find_shared(struct inode *inode,
867 int depth,
868 int offsets[4],
869 Indirect chain[4],
870 __le32 *top)
871{
872 Indirect *partial, *p;
873 int k, err;
874
875 *top = 0;
876 for (k = depth; k > 1 && !offsets[k-1]; k--)
877 ;
878 partial = ext2_get_branch(inode, k, offsets, chain, &err);
879 if (!partial)
880 partial = chain + k-1;
881
882
883
884
885 write_lock(&EXT2_I(inode)->i_meta_lock);
886 if (!partial->key && *partial->p) {
887 write_unlock(&EXT2_I(inode)->i_meta_lock);
888 goto no_top;
889 }
890 for (p=partial; p>chain && all_zeroes((__le32*)p->bh->b_data,p->p); p--)
891 ;
892
893
894
895
896
897
898 if (p == chain + k - 1 && p > chain) {
899 p->p--;
900 } else {
901 *top = *p->p;
902 *p->p = 0;
903 }
904 write_unlock(&EXT2_I(inode)->i_meta_lock);
905
906 while(partial > p)
907 {
908 brelse(partial->bh);
909 partial--;
910 }
911no_top:
912 return partial;
913}
914
915
916
917
918
919
920
921
922
923
924
925static inline void ext2_free_data(struct inode *inode, __le32 *p, __le32 *q)
926{
927 unsigned long block_to_free = 0, count = 0;
928 unsigned long nr;
929
930 for ( ; p < q ; p++) {
931 nr = le32_to_cpu(*p);
932 if (nr) {
933 *p = 0;
934
935 if (count == 0)
936 goto free_this;
937 else if (block_to_free == nr - count)
938 count++;
939 else {
940 mark_inode_dirty(inode);
941 ext2_free_blocks (inode, block_to_free, count);
942 free_this:
943 block_to_free = nr;
944 count = 1;
945 }
946 }
947 }
948 if (count > 0) {
949 mark_inode_dirty(inode);
950 ext2_free_blocks (inode, block_to_free, count);
951 }
952}
953
954
955
956
957
958
959
960
961
962
963
964
965static void ext2_free_branches(struct inode *inode, __le32 *p, __le32 *q, int depth)
966{
967 struct buffer_head * bh;
968 unsigned long nr;
969
970 if (depth--) {
971 int addr_per_block = EXT2_ADDR_PER_BLOCK(inode->i_sb);
972 for ( ; p < q ; p++) {
973 nr = le32_to_cpu(*p);
974 if (!nr)
975 continue;
976 *p = 0;
977 bh = sb_bread(inode->i_sb, nr);
978
979
980
981
982 if (!bh) {
983 ext2_error(inode->i_sb, "ext2_free_branches",
984 "Read failure, inode=%ld, block=%ld",
985 inode->i_ino, nr);
986 continue;
987 }
988 ext2_free_branches(inode,
989 (__le32*)bh->b_data,
990 (__le32*)bh->b_data + addr_per_block,
991 depth);
992 bforget(bh);
993 ext2_free_blocks(inode, nr, 1);
994 mark_inode_dirty(inode);
995 }
996 } else
997 ext2_free_data(inode, p, q);
998}
999
1000void ext2_truncate(struct inode *inode)
1001{
1002 __le32 *i_data = EXT2_I(inode)->i_data;
1003 struct ext2_inode_info *ei = EXT2_I(inode);
1004 int addr_per_block = EXT2_ADDR_PER_BLOCK(inode->i_sb);
1005 int offsets[4];
1006 Indirect chain[4];
1007 Indirect *partial;
1008 __le32 nr = 0;
1009 int n;
1010 long iblock;
1011 unsigned blocksize;
1012
1013 if (!(S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode) ||
1014 S_ISLNK(inode->i_mode)))
1015 return;
1016 if (ext2_inode_is_fast_symlink(inode))
1017 return;
1018 if (IS_APPEND(inode) || IS_IMMUTABLE(inode))
1019 return;
1020
1021 blocksize = inode->i_sb->s_blocksize;
1022 iblock = (inode->i_size + blocksize-1)
1023 >> EXT2_BLOCK_SIZE_BITS(inode->i_sb);
1024
1025 if (mapping_is_xip(inode->i_mapping))
1026 xip_truncate_page(inode->i_mapping, inode->i_size);
1027 else if (test_opt(inode->i_sb, NOBH))
1028 nobh_truncate_page(inode->i_mapping,
1029 inode->i_size, ext2_get_block);
1030 else
1031 block_truncate_page(inode->i_mapping,
1032 inode->i_size, ext2_get_block);
1033
1034 n = ext2_block_to_path(inode, iblock, offsets, NULL);
1035 if (n == 0)
1036 return;
1037
1038
1039
1040
1041
1042 mutex_lock(&ei->truncate_mutex);
1043
1044 if (n == 1) {
1045 ext2_free_data(inode, i_data+offsets[0],
1046 i_data + EXT2_NDIR_BLOCKS);
1047 goto do_indirects;
1048 }
1049
1050 partial = ext2_find_shared(inode, n, offsets, chain, &nr);
1051
1052 if (nr) {
1053 if (partial == chain)
1054 mark_inode_dirty(inode);
1055 else
1056 mark_buffer_dirty_inode(partial->bh, inode);
1057 ext2_free_branches(inode, &nr, &nr+1, (chain+n-1) - partial);
1058 }
1059
1060 while (partial > chain) {
1061 ext2_free_branches(inode,
1062 partial->p + 1,
1063 (__le32*)partial->bh->b_data+addr_per_block,
1064 (chain+n-1) - partial);
1065 mark_buffer_dirty_inode(partial->bh, inode);
1066 brelse (partial->bh);
1067 partial--;
1068 }
1069do_indirects:
1070
1071 switch (offsets[0]) {
1072 default:
1073 nr = i_data[EXT2_IND_BLOCK];
1074 if (nr) {
1075 i_data[EXT2_IND_BLOCK] = 0;
1076 mark_inode_dirty(inode);
1077 ext2_free_branches(inode, &nr, &nr+1, 1);
1078 }
1079 case EXT2_IND_BLOCK:
1080 nr = i_data[EXT2_DIND_BLOCK];
1081 if (nr) {
1082 i_data[EXT2_DIND_BLOCK] = 0;
1083 mark_inode_dirty(inode);
1084 ext2_free_branches(inode, &nr, &nr+1, 2);
1085 }
1086 case EXT2_DIND_BLOCK:
1087 nr = i_data[EXT2_TIND_BLOCK];
1088 if (nr) {
1089 i_data[EXT2_TIND_BLOCK] = 0;
1090 mark_inode_dirty(inode);
1091 ext2_free_branches(inode, &nr, &nr+1, 3);
1092 }
1093 case EXT2_TIND_BLOCK:
1094 ;
1095 }
1096
1097 ext2_discard_reservation(inode);
1098
1099 mutex_unlock(&ei->truncate_mutex);
1100 inode->i_mtime = inode->i_ctime = CURRENT_TIME_SEC;
1101 if (inode_needs_sync(inode)) {
1102 sync_mapping_buffers(inode->i_mapping);
1103 ext2_sync_inode (inode);
1104 } else {
1105 mark_inode_dirty(inode);
1106 }
1107}
1108
1109static struct ext2_inode *ext2_get_inode(struct super_block *sb, ino_t ino,
1110 struct buffer_head **p)
1111{
1112 struct buffer_head * bh;
1113 unsigned long block_group;
1114 unsigned long block;
1115 unsigned long offset;
1116 struct ext2_group_desc * gdp;
1117
1118 *p = NULL;
1119 if ((ino != EXT2_ROOT_INO && ino < EXT2_FIRST_INO(sb)) ||
1120 ino > le32_to_cpu(EXT2_SB(sb)->s_es->s_inodes_count))
1121 goto Einval;
1122
1123 block_group = (ino - 1) / EXT2_INODES_PER_GROUP(sb);
1124 gdp = ext2_get_group_desc(sb, block_group, NULL);
1125 if (!gdp)
1126 goto Egdp;
1127
1128
1129
1130 offset = ((ino - 1) % EXT2_INODES_PER_GROUP(sb)) * EXT2_INODE_SIZE(sb);
1131 block = le32_to_cpu(gdp->bg_inode_table) +
1132 (offset >> EXT2_BLOCK_SIZE_BITS(sb));
1133 if (!(bh = sb_bread(sb, block)))
1134 goto Eio;
1135
1136 *p = bh;
1137 offset &= (EXT2_BLOCK_SIZE(sb) - 1);
1138 return (struct ext2_inode *) (bh->b_data + offset);
1139
1140Einval:
1141 ext2_error(sb, "ext2_get_inode", "bad inode number: %lu",
1142 (unsigned long) ino);
1143 return ERR_PTR(-EINVAL);
1144Eio:
1145 ext2_error(sb, "ext2_get_inode",
1146 "unable to read inode block - inode=%lu, block=%lu",
1147 (unsigned long) ino, block);
1148Egdp:
1149 return ERR_PTR(-EIO);
1150}
1151
1152void ext2_set_inode_flags(struct inode *inode)
1153{
1154 unsigned int flags = EXT2_I(inode)->i_flags;
1155
1156 inode->i_flags &= ~(S_SYNC|S_APPEND|S_IMMUTABLE|S_NOATIME|S_DIRSYNC);
1157 if (flags & EXT2_SYNC_FL)
1158 inode->i_flags |= S_SYNC;
1159 if (flags & EXT2_APPEND_FL)
1160 inode->i_flags |= S_APPEND;
1161 if (flags & EXT2_IMMUTABLE_FL)
1162 inode->i_flags |= S_IMMUTABLE;
1163 if (flags & EXT2_NOATIME_FL)
1164 inode->i_flags |= S_NOATIME;
1165 if (flags & EXT2_DIRSYNC_FL)
1166 inode->i_flags |= S_DIRSYNC;
1167}
1168
1169
1170void ext2_get_inode_flags(struct ext2_inode_info *ei)
1171{
1172 unsigned int flags = ei->vfs_inode.i_flags;
1173
1174 ei->i_flags &= ~(EXT2_SYNC_FL|EXT2_APPEND_FL|
1175 EXT2_IMMUTABLE_FL|EXT2_NOATIME_FL|EXT2_DIRSYNC_FL);
1176 if (flags & S_SYNC)
1177 ei->i_flags |= EXT2_SYNC_FL;
1178 if (flags & S_APPEND)
1179 ei->i_flags |= EXT2_APPEND_FL;
1180 if (flags & S_IMMUTABLE)
1181 ei->i_flags |= EXT2_IMMUTABLE_FL;
1182 if (flags & S_NOATIME)
1183 ei->i_flags |= EXT2_NOATIME_FL;
1184 if (flags & S_DIRSYNC)
1185 ei->i_flags |= EXT2_DIRSYNC_FL;
1186}
1187
1188void ext2_read_inode (struct inode * inode)
1189{
1190 struct ext2_inode_info *ei = EXT2_I(inode);
1191 ino_t ino = inode->i_ino;
1192 struct buffer_head * bh;
1193 struct ext2_inode * raw_inode = ext2_get_inode(inode->i_sb, ino, &bh);
1194 int n;
1195
1196#ifdef CONFIG_EXT2_FS_POSIX_ACL
1197 ei->i_acl = EXT2_ACL_NOT_CACHED;
1198 ei->i_default_acl = EXT2_ACL_NOT_CACHED;
1199#endif
1200 ei->i_block_alloc_info = NULL;
1201
1202 if (IS_ERR(raw_inode))
1203 goto bad_inode;
1204
1205 inode->i_mode = le16_to_cpu(raw_inode->i_mode);
1206 inode->i_uid = (uid_t)le16_to_cpu(raw_inode->i_uid_low);
1207 inode->i_gid = (gid_t)le16_to_cpu(raw_inode->i_gid_low);
1208 if (!(test_opt (inode->i_sb, NO_UID32))) {
1209 inode->i_uid |= le16_to_cpu(raw_inode->i_uid_high) << 16;
1210 inode->i_gid |= le16_to_cpu(raw_inode->i_gid_high) << 16;
1211 }
1212 inode->i_nlink = le16_to_cpu(raw_inode->i_links_count);
1213 inode->i_size = le32_to_cpu(raw_inode->i_size);
1214 inode->i_atime.tv_sec = (signed)le32_to_cpu(raw_inode->i_atime);
1215 inode->i_ctime.tv_sec = (signed)le32_to_cpu(raw_inode->i_ctime);
1216 inode->i_mtime.tv_sec = (signed)le32_to_cpu(raw_inode->i_mtime);
1217 inode->i_atime.tv_nsec = inode->i_mtime.tv_nsec = inode->i_ctime.tv_nsec = 0;
1218 ei->i_dtime = le32_to_cpu(raw_inode->i_dtime);
1219
1220
1221
1222
1223
1224 if (inode->i_nlink == 0 && (inode->i_mode == 0 || ei->i_dtime)) {
1225
1226 brelse (bh);
1227 goto bad_inode;
1228 }
1229 inode->i_blocks = le32_to_cpu(raw_inode->i_blocks);
1230 ei->i_flags = le32_to_cpu(raw_inode->i_flags);
1231 ei->i_faddr = le32_to_cpu(raw_inode->i_faddr);
1232 ei->i_frag_no = raw_inode->i_frag;
1233 ei->i_frag_size = raw_inode->i_fsize;
1234 ei->i_file_acl = le32_to_cpu(raw_inode->i_file_acl);
1235 ei->i_dir_acl = 0;
1236 if (S_ISREG(inode->i_mode))
1237 inode->i_size |= ((__u64)le32_to_cpu(raw_inode->i_size_high)) << 32;
1238 else
1239 ei->i_dir_acl = le32_to_cpu(raw_inode->i_dir_acl);
1240 ei->i_dtime = 0;
1241 inode->i_generation = le32_to_cpu(raw_inode->i_generation);
1242 ei->i_state = 0;
1243 ei->i_block_group = (ino - 1) / EXT2_INODES_PER_GROUP(inode->i_sb);
1244 ei->i_dir_start_lookup = 0;
1245
1246
1247
1248
1249
1250 for (n = 0; n < EXT2_N_BLOCKS; n++)
1251 ei->i_data[n] = raw_inode->i_block[n];
1252
1253 if (S_ISREG(inode->i_mode)) {
1254 inode->i_op = &ext2_file_inode_operations;
1255 if (ext2_use_xip(inode->i_sb)) {
1256 inode->i_mapping->a_ops = &ext2_aops_xip;
1257 inode->i_fop = &ext2_xip_file_operations;
1258 } else if (test_opt(inode->i_sb, NOBH)) {
1259 inode->i_mapping->a_ops = &ext2_nobh_aops;
1260 inode->i_fop = &ext2_file_operations;
1261 } else {
1262 inode->i_mapping->a_ops = &ext2_aops;
1263 inode->i_fop = &ext2_file_operations;
1264 }
1265 } else if (S_ISDIR(inode->i_mode)) {
1266 inode->i_op = &ext2_dir_inode_operations;
1267 inode->i_fop = &ext2_dir_operations;
1268 if (test_opt(inode->i_sb, NOBH))
1269 inode->i_mapping->a_ops = &ext2_nobh_aops;
1270 else
1271 inode->i_mapping->a_ops = &ext2_aops;
1272 } else if (S_ISLNK(inode->i_mode)) {
1273 if (ext2_inode_is_fast_symlink(inode))
1274 inode->i_op = &ext2_fast_symlink_inode_operations;
1275 else {
1276 inode->i_op = &ext2_symlink_inode_operations;
1277 if (test_opt(inode->i_sb, NOBH))
1278 inode->i_mapping->a_ops = &ext2_nobh_aops;
1279 else
1280 inode->i_mapping->a_ops = &ext2_aops;
1281 }
1282 } else {
1283 inode->i_op = &ext2_special_inode_operations;
1284 if (raw_inode->i_block[0])
1285 init_special_inode(inode, inode->i_mode,
1286 old_decode_dev(le32_to_cpu(raw_inode->i_block[0])));
1287 else
1288 init_special_inode(inode, inode->i_mode,
1289 new_decode_dev(le32_to_cpu(raw_inode->i_block[1])));
1290 }
1291 brelse (bh);
1292 ext2_set_inode_flags(inode);
1293 return;
1294
1295bad_inode:
1296 make_bad_inode(inode);
1297 return;
1298}
1299
1300static int ext2_update_inode(struct inode * inode, int do_sync)
1301{
1302 struct ext2_inode_info *ei = EXT2_I(inode);
1303 struct super_block *sb = inode->i_sb;
1304 ino_t ino = inode->i_ino;
1305 uid_t uid = inode->i_uid;
1306 gid_t gid = inode->i_gid;
1307 struct buffer_head * bh;
1308 struct ext2_inode * raw_inode = ext2_get_inode(sb, ino, &bh);
1309 int n;
1310 int err = 0;
1311
1312 if (IS_ERR(raw_inode))
1313 return -EIO;
1314
1315
1316
1317 if (ei->i_state & EXT2_STATE_NEW)
1318 memset(raw_inode, 0, EXT2_SB(sb)->s_inode_size);
1319
1320 ext2_get_inode_flags(ei);
1321 raw_inode->i_mode = cpu_to_le16(inode->i_mode);
1322 if (!(test_opt(sb, NO_UID32))) {
1323 raw_inode->i_uid_low = cpu_to_le16(low_16_bits(uid));
1324 raw_inode->i_gid_low = cpu_to_le16(low_16_bits(gid));
1325
1326
1327
1328
1329 if (!ei->i_dtime) {
1330 raw_inode->i_uid_high = cpu_to_le16(high_16_bits(uid));
1331 raw_inode->i_gid_high = cpu_to_le16(high_16_bits(gid));
1332 } else {
1333 raw_inode->i_uid_high = 0;
1334 raw_inode->i_gid_high = 0;
1335 }
1336 } else {
1337 raw_inode->i_uid_low = cpu_to_le16(fs_high2lowuid(uid));
1338 raw_inode->i_gid_low = cpu_to_le16(fs_high2lowgid(gid));
1339 raw_inode->i_uid_high = 0;
1340 raw_inode->i_gid_high = 0;
1341 }
1342 raw_inode->i_links_count = cpu_to_le16(inode->i_nlink);
1343 raw_inode->i_size = cpu_to_le32(inode->i_size);
1344 raw_inode->i_atime = cpu_to_le32(inode->i_atime.tv_sec);
1345 raw_inode->i_ctime = cpu_to_le32(inode->i_ctime.tv_sec);
1346 raw_inode->i_mtime = cpu_to_le32(inode->i_mtime.tv_sec);
1347
1348 raw_inode->i_blocks = cpu_to_le32(inode->i_blocks);
1349 raw_inode->i_dtime = cpu_to_le32(ei->i_dtime);
1350 raw_inode->i_flags = cpu_to_le32(ei->i_flags);
1351 raw_inode->i_faddr = cpu_to_le32(ei->i_faddr);
1352 raw_inode->i_frag = ei->i_frag_no;
1353 raw_inode->i_fsize = ei->i_frag_size;
1354 raw_inode->i_file_acl = cpu_to_le32(ei->i_file_acl);
1355 if (!S_ISREG(inode->i_mode))
1356 raw_inode->i_dir_acl = cpu_to_le32(ei->i_dir_acl);
1357 else {
1358 raw_inode->i_size_high = cpu_to_le32(inode->i_size >> 32);
1359 if (inode->i_size > 0x7fffffffULL) {
1360 if (!EXT2_HAS_RO_COMPAT_FEATURE(sb,
1361 EXT2_FEATURE_RO_COMPAT_LARGE_FILE) ||
1362 EXT2_SB(sb)->s_es->s_rev_level ==
1363 cpu_to_le32(EXT2_GOOD_OLD_REV)) {
1364
1365
1366
1367 lock_kernel();
1368 ext2_update_dynamic_rev(sb);
1369 EXT2_SET_RO_COMPAT_FEATURE(sb,
1370 EXT2_FEATURE_RO_COMPAT_LARGE_FILE);
1371 unlock_kernel();
1372 ext2_write_super(sb);
1373 }
1374 }
1375 }
1376
1377 raw_inode->i_generation = cpu_to_le32(inode->i_generation);
1378 if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode)) {
1379 if (old_valid_dev(inode->i_rdev)) {
1380 raw_inode->i_block[0] =
1381 cpu_to_le32(old_encode_dev(inode->i_rdev));
1382 raw_inode->i_block[1] = 0;
1383 } else {
1384 raw_inode->i_block[0] = 0;
1385 raw_inode->i_block[1] =
1386 cpu_to_le32(new_encode_dev(inode->i_rdev));
1387 raw_inode->i_block[2] = 0;
1388 }
1389 } else for (n = 0; n < EXT2_N_BLOCKS; n++)
1390 raw_inode->i_block[n] = ei->i_data[n];
1391 mark_buffer_dirty(bh);
1392 if (do_sync) {
1393 sync_dirty_buffer(bh);
1394 if (buffer_req(bh) && !buffer_uptodate(bh)) {
1395 printk ("IO error syncing ext2 inode [%s:%08lx]\n",
1396 sb->s_id, (unsigned long) ino);
1397 err = -EIO;
1398 }
1399 }
1400 ei->i_state &= ~EXT2_STATE_NEW;
1401 brelse (bh);
1402 return err;
1403}
1404
1405int ext2_write_inode(struct inode *inode, int wait)
1406{
1407 return ext2_update_inode(inode, wait);
1408}
1409
1410int ext2_sync_inode(struct inode *inode)
1411{
1412 struct writeback_control wbc = {
1413 .sync_mode = WB_SYNC_ALL,
1414 .nr_to_write = 0,
1415 };
1416 return sync_inode(inode, &wbc);
1417}
1418
1419int ext2_setattr(struct dentry *dentry, struct iattr *iattr)
1420{
1421 struct inode *inode = dentry->d_inode;
1422 int error;
1423
1424 error = inode_change_ok(inode, iattr);
1425 if (error)
1426 return error;
1427 if ((iattr->ia_valid & ATTR_UID && iattr->ia_uid != inode->i_uid) ||
1428 (iattr->ia_valid & ATTR_GID && iattr->ia_gid != inode->i_gid)) {
1429 error = DQUOT_TRANSFER(inode, iattr) ? -EDQUOT : 0;
1430 if (error)
1431 return error;
1432 }
1433 error = inode_setattr(inode, iattr);
1434 if (!error && (iattr->ia_valid & ATTR_MODE))
1435 error = ext2_acl_chmod(inode);
1436 return error;
1437}
1438