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