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