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/module.h>
26#include <linux/fs.h>
27#include <linux/time.h>
28#include <linux/ext3_jbd.h>
29#include <linux/jbd.h>
30#include <linux/highuid.h>
31#include <linux/pagemap.h>
32#include <linux/quotaops.h>
33#include <linux/string.h>
34#include <linux/buffer_head.h>
35#include <linux/writeback.h>
36#include <linux/mpage.h>
37#include <linux/uio.h>
38#include <linux/bio.h>
39#include <linux/fiemap.h>
40#include <linux/namei.h>
41#include "xattr.h"
42#include "acl.h"
43
44static int ext3_writepage_trans_blocks(struct inode *inode);
45
46
47
48
49static int ext3_inode_is_fast_symlink(struct inode *inode)
50{
51 int ea_blocks = EXT3_I(inode)->i_file_acl ?
52 (inode->i_sb->s_blocksize >> 9) : 0;
53
54 return (S_ISLNK(inode->i_mode) && inode->i_blocks - ea_blocks == 0);
55}
56
57
58
59
60
61
62
63
64
65
66int ext3_forget(handle_t *handle, int is_metadata, struct inode *inode,
67 struct buffer_head *bh, ext3_fsblk_t blocknr)
68{
69 int err;
70
71 might_sleep();
72
73 BUFFER_TRACE(bh, "enter");
74
75 jbd_debug(4, "forgetting bh %p: is_metadata = %d, mode %o, "
76 "data mode %lx\n",
77 bh, is_metadata, inode->i_mode,
78 test_opt(inode->i_sb, DATA_FLAGS));
79
80
81
82
83
84
85 if (test_opt(inode->i_sb, DATA_FLAGS) == EXT3_MOUNT_JOURNAL_DATA ||
86 (!is_metadata && !ext3_should_journal_data(inode))) {
87 if (bh) {
88 BUFFER_TRACE(bh, "call journal_forget");
89 return ext3_journal_forget(handle, bh);
90 }
91 return 0;
92 }
93
94
95
96
97 BUFFER_TRACE(bh, "call ext3_journal_revoke");
98 err = ext3_journal_revoke(handle, blocknr, bh);
99 if (err)
100 ext3_abort(inode->i_sb, __func__,
101 "error %d when attempting revoke", err);
102 BUFFER_TRACE(bh, "exit");
103 return err;
104}
105
106
107
108
109
110static unsigned long blocks_for_truncate(struct inode *inode)
111{
112 unsigned long needed;
113
114 needed = inode->i_blocks >> (inode->i_sb->s_blocksize_bits - 9);
115
116
117
118
119
120
121
122 if (needed < 2)
123 needed = 2;
124
125
126
127 if (needed > EXT3_MAX_TRANS_DATA)
128 needed = EXT3_MAX_TRANS_DATA;
129
130 return EXT3_DATA_TRANS_BLOCKS(inode->i_sb) + needed;
131}
132
133
134
135
136
137
138
139
140
141
142
143static handle_t *start_transaction(struct inode *inode)
144{
145 handle_t *result;
146
147 result = ext3_journal_start(inode, blocks_for_truncate(inode));
148 if (!IS_ERR(result))
149 return result;
150
151 ext3_std_error(inode->i_sb, PTR_ERR(result));
152 return result;
153}
154
155
156
157
158
159
160
161static int try_to_extend_transaction(handle_t *handle, struct inode *inode)
162{
163 if (handle->h_buffer_credits > EXT3_RESERVE_TRANS_BLOCKS)
164 return 0;
165 if (!ext3_journal_extend(handle, blocks_for_truncate(inode)))
166 return 0;
167 return 1;
168}
169
170
171
172
173
174
175static int truncate_restart_transaction(handle_t *handle, struct inode *inode)
176{
177 int ret;
178
179 jbd_debug(2, "restarting handle %p\n", handle);
180
181
182
183
184
185
186 mutex_unlock(&EXT3_I(inode)->truncate_mutex);
187 ret = ext3_journal_restart(handle, blocks_for_truncate(inode));
188 mutex_lock(&EXT3_I(inode)->truncate_mutex);
189 return ret;
190}
191
192
193
194
195void ext3_delete_inode (struct inode * inode)
196{
197 handle_t *handle;
198
199 truncate_inode_pages(&inode->i_data, 0);
200
201 if (is_bad_inode(inode))
202 goto no_delete;
203
204 handle = start_transaction(inode);
205 if (IS_ERR(handle)) {
206
207
208
209
210
211 ext3_orphan_del(NULL, inode);
212 goto no_delete;
213 }
214
215 if (IS_SYNC(inode))
216 handle->h_sync = 1;
217 inode->i_size = 0;
218 if (inode->i_blocks)
219 ext3_truncate(inode);
220
221
222
223
224
225
226
227
228 ext3_orphan_del(handle, inode);
229 EXT3_I(inode)->i_dtime = get_seconds();
230
231
232
233
234
235
236
237
238 if (ext3_mark_inode_dirty(handle, inode))
239
240 clear_inode(inode);
241 else
242 ext3_free_inode(handle, inode);
243 ext3_journal_stop(handle);
244 return;
245no_delete:
246 clear_inode(inode);
247}
248
249typedef struct {
250 __le32 *p;
251 __le32 key;
252 struct buffer_head *bh;
253} Indirect;
254
255static inline void add_chain(Indirect *p, struct buffer_head *bh, __le32 *v)
256{
257 p->key = *(p->p = v);
258 p->bh = bh;
259}
260
261static int verify_chain(Indirect *from, Indirect *to)
262{
263 while (from <= to && from->key == *from->p)
264 from++;
265 return (from > to);
266}
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299static int ext3_block_to_path(struct inode *inode,
300 long i_block, int offsets[4], int *boundary)
301{
302 int ptrs = EXT3_ADDR_PER_BLOCK(inode->i_sb);
303 int ptrs_bits = EXT3_ADDR_PER_BLOCK_BITS(inode->i_sb);
304 const long direct_blocks = EXT3_NDIR_BLOCKS,
305 indirect_blocks = ptrs,
306 double_blocks = (1 << (ptrs_bits * 2));
307 int n = 0;
308 int final = 0;
309
310 if (i_block < 0) {
311 ext3_warning (inode->i_sb, "ext3_block_to_path", "block < 0");
312 } else if (i_block < direct_blocks) {
313 offsets[n++] = i_block;
314 final = direct_blocks;
315 } else if ( (i_block -= direct_blocks) < indirect_blocks) {
316 offsets[n++] = EXT3_IND_BLOCK;
317 offsets[n++] = i_block;
318 final = ptrs;
319 } else if ((i_block -= indirect_blocks) < double_blocks) {
320 offsets[n++] = EXT3_DIND_BLOCK;
321 offsets[n++] = i_block >> ptrs_bits;
322 offsets[n++] = i_block & (ptrs - 1);
323 final = ptrs;
324 } else if (((i_block -= double_blocks) >> (ptrs_bits * 2)) < ptrs) {
325 offsets[n++] = EXT3_TIND_BLOCK;
326 offsets[n++] = i_block >> (ptrs_bits * 2);
327 offsets[n++] = (i_block >> ptrs_bits) & (ptrs - 1);
328 offsets[n++] = i_block & (ptrs - 1);
329 final = ptrs;
330 } else {
331 ext3_warning(inode->i_sb, "ext3_block_to_path", "block > big");
332 }
333 if (boundary)
334 *boundary = final - 1 - (i_block & (ptrs - 1));
335 return n;
336}
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367static Indirect *ext3_get_branch(struct inode *inode, int depth, int *offsets,
368 Indirect chain[4], int *err)
369{
370 struct super_block *sb = inode->i_sb;
371 Indirect *p = chain;
372 struct buffer_head *bh;
373
374 *err = 0;
375
376 add_chain (chain, NULL, EXT3_I(inode)->i_data + *offsets);
377 if (!p->key)
378 goto no_block;
379 while (--depth) {
380 bh = sb_bread(sb, le32_to_cpu(p->key));
381 if (!bh)
382 goto failure;
383
384 if (!verify_chain(chain, p))
385 goto changed;
386 add_chain(++p, bh, (__le32*)bh->b_data + *++offsets);
387
388 if (!p->key)
389 goto no_block;
390 }
391 return NULL;
392
393changed:
394 brelse(bh);
395 *err = -EAGAIN;
396 goto no_block;
397failure:
398 *err = -EIO;
399no_block:
400 return p;
401}
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423static ext3_fsblk_t ext3_find_near(struct inode *inode, Indirect *ind)
424{
425 struct ext3_inode_info *ei = EXT3_I(inode);
426 __le32 *start = ind->bh ? (__le32*) ind->bh->b_data : ei->i_data;
427 __le32 *p;
428 ext3_fsblk_t bg_start;
429 ext3_grpblk_t colour;
430
431
432 for (p = ind->p - 1; p >= start; p--) {
433 if (*p)
434 return le32_to_cpu(*p);
435 }
436
437
438 if (ind->bh)
439 return ind->bh->b_blocknr;
440
441
442
443
444
445 bg_start = ext3_group_first_block_no(inode->i_sb, ei->i_block_group);
446 colour = (current->pid % 16) *
447 (EXT3_BLOCKS_PER_GROUP(inode->i_sb) / 16);
448 return bg_start + colour;
449}
450
451
452
453
454
455
456
457
458
459
460
461static ext3_fsblk_t ext3_find_goal(struct inode *inode, long block,
462 Indirect *partial)
463{
464 struct ext3_block_alloc_info *block_i;
465
466 block_i = EXT3_I(inode)->i_block_alloc_info;
467
468
469
470
471
472 if (block_i && (block == block_i->last_alloc_logical_block + 1)
473 && (block_i->last_alloc_physical_block != 0)) {
474 return block_i->last_alloc_physical_block + 1;
475 }
476
477 return ext3_find_near(inode, partial);
478}
479
480
481
482
483
484
485
486
487
488
489
490
491
492static int ext3_blks_to_allocate(Indirect *branch, int k, unsigned long blks,
493 int blocks_to_boundary)
494{
495 unsigned long count = 0;
496
497
498
499
500
501 if (k > 0) {
502
503 if (blks < blocks_to_boundary + 1)
504 count += blks;
505 else
506 count += blocks_to_boundary + 1;
507 return count;
508 }
509
510 count++;
511 while (count < blks && count <= blocks_to_boundary &&
512 le32_to_cpu(*(branch[0].p + count)) == 0) {
513 count++;
514 }
515 return count;
516}
517
518
519
520
521
522
523
524
525
526
527
528static int ext3_alloc_blocks(handle_t *handle, struct inode *inode,
529 ext3_fsblk_t goal, int indirect_blks, int blks,
530 ext3_fsblk_t new_blocks[4], int *err)
531{
532 int target, i;
533 unsigned long count = 0;
534 int index = 0;
535 ext3_fsblk_t current_block = 0;
536 int ret = 0;
537
538
539
540
541
542
543
544
545
546 target = blks + indirect_blks;
547
548 while (1) {
549 count = target;
550
551 current_block = ext3_new_blocks(handle,inode,goal,&count,err);
552 if (*err)
553 goto failed_out;
554
555 target -= count;
556
557 while (index < indirect_blks && count) {
558 new_blocks[index++] = current_block++;
559 count--;
560 }
561
562 if (count > 0)
563 break;
564 }
565
566
567 new_blocks[index] = current_block;
568
569
570 ret = count;
571 *err = 0;
572 return ret;
573failed_out:
574 for (i = 0; i <index; i++)
575 ext3_free_blocks(handle, inode, new_blocks[i], 1);
576 return ret;
577}
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604static int ext3_alloc_branch(handle_t *handle, struct inode *inode,
605 int indirect_blks, int *blks, ext3_fsblk_t goal,
606 int *offsets, Indirect *branch)
607{
608 int blocksize = inode->i_sb->s_blocksize;
609 int i, n = 0;
610 int err = 0;
611 struct buffer_head *bh;
612 int num;
613 ext3_fsblk_t new_blocks[4];
614 ext3_fsblk_t current_block;
615
616 num = ext3_alloc_blocks(handle, inode, goal, indirect_blks,
617 *blks, new_blocks, &err);
618 if (err)
619 return err;
620
621 branch[0].key = cpu_to_le32(new_blocks[0]);
622
623
624
625 for (n = 1; n <= indirect_blks; n++) {
626
627
628
629
630
631 bh = sb_getblk(inode->i_sb, new_blocks[n-1]);
632 branch[n].bh = bh;
633 lock_buffer(bh);
634 BUFFER_TRACE(bh, "call get_create_access");
635 err = ext3_journal_get_create_access(handle, bh);
636 if (err) {
637 unlock_buffer(bh);
638 brelse(bh);
639 goto failed;
640 }
641
642 memset(bh->b_data, 0, blocksize);
643 branch[n].p = (__le32 *) bh->b_data + offsets[n];
644 branch[n].key = cpu_to_le32(new_blocks[n]);
645 *branch[n].p = branch[n].key;
646 if ( n == indirect_blks) {
647 current_block = new_blocks[n];
648
649
650
651
652
653 for (i=1; i < num; i++)
654 *(branch[n].p + i) = cpu_to_le32(++current_block);
655 }
656 BUFFER_TRACE(bh, "marking uptodate");
657 set_buffer_uptodate(bh);
658 unlock_buffer(bh);
659
660 BUFFER_TRACE(bh, "call ext3_journal_dirty_metadata");
661 err = ext3_journal_dirty_metadata(handle, bh);
662 if (err)
663 goto failed;
664 }
665 *blks = num;
666 return err;
667failed:
668
669 for (i = 1; i <= n ; i++) {
670 BUFFER_TRACE(branch[i].bh, "call journal_forget");
671 ext3_journal_forget(handle, branch[i].bh);
672 }
673 for (i = 0; i <indirect_blks; i++)
674 ext3_free_blocks(handle, inode, new_blocks[i], 1);
675
676 ext3_free_blocks(handle, inode, new_blocks[i], num);
677
678 return err;
679}
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695static int ext3_splice_branch(handle_t *handle, struct inode *inode,
696 long block, Indirect *where, int num, int blks)
697{
698 int i;
699 int err = 0;
700 struct ext3_block_alloc_info *block_i;
701 ext3_fsblk_t current_block;
702 struct ext3_inode_info *ei = EXT3_I(inode);
703
704 block_i = ei->i_block_alloc_info;
705
706
707
708
709
710 if (where->bh) {
711 BUFFER_TRACE(where->bh, "get_write_access");
712 err = ext3_journal_get_write_access(handle, where->bh);
713 if (err)
714 goto err_out;
715 }
716
717
718 *where->p = where->key;
719
720
721
722
723
724 if (num == 0 && blks > 1) {
725 current_block = le32_to_cpu(where->key) + 1;
726 for (i = 1; i < blks; i++)
727 *(where->p + i ) = cpu_to_le32(current_block++);
728 }
729
730
731
732
733
734
735 if (block_i) {
736 block_i->last_alloc_logical_block = block + blks - 1;
737 block_i->last_alloc_physical_block =
738 le32_to_cpu(where[num].key) + blks - 1;
739 }
740
741
742
743 inode->i_ctime = CURRENT_TIME_SEC;
744 ext3_mark_inode_dirty(handle, inode);
745
746 atomic_set(&ei->i_datasync_tid, handle->h_transaction->t_tid);
747
748
749 if (where->bh) {
750
751
752
753
754
755
756
757
758 jbd_debug(5, "splicing indirect only\n");
759 BUFFER_TRACE(where->bh, "call ext3_journal_dirty_metadata");
760 err = ext3_journal_dirty_metadata(handle, where->bh);
761 if (err)
762 goto err_out;
763 } else {
764
765
766
767
768 jbd_debug(5, "splicing direct\n");
769 }
770 return err;
771
772err_out:
773 for (i = 1; i <= num; i++) {
774 BUFFER_TRACE(where[i].bh, "call journal_forget");
775 ext3_journal_forget(handle, where[i].bh);
776 ext3_free_blocks(handle,inode,le32_to_cpu(where[i-1].key),1);
777 }
778 ext3_free_blocks(handle, inode, le32_to_cpu(where[num].key), blks);
779
780 return err;
781}
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802int ext3_get_blocks_handle(handle_t *handle, struct inode *inode,
803 sector_t iblock, unsigned long maxblocks,
804 struct buffer_head *bh_result,
805 int create)
806{
807 int err = -EIO;
808 int offsets[4];
809 Indirect chain[4];
810 Indirect *partial;
811 ext3_fsblk_t goal;
812 int indirect_blks;
813 int blocks_to_boundary = 0;
814 int depth;
815 struct ext3_inode_info *ei = EXT3_I(inode);
816 int count = 0;
817 ext3_fsblk_t first_block = 0;
818
819
820 J_ASSERT(handle != NULL || create == 0);
821 depth = ext3_block_to_path(inode,iblock,offsets,&blocks_to_boundary);
822
823 if (depth == 0)
824 goto out;
825
826 partial = ext3_get_branch(inode, depth, offsets, chain, &err);
827
828
829 if (!partial) {
830 first_block = le32_to_cpu(chain[depth - 1].key);
831 clear_buffer_new(bh_result);
832 count++;
833
834 while (count < maxblocks && count <= blocks_to_boundary) {
835 ext3_fsblk_t blk;
836
837 if (!verify_chain(chain, chain + depth - 1)) {
838
839
840
841
842
843
844
845 err = -EAGAIN;
846 count = 0;
847 break;
848 }
849 blk = le32_to_cpu(*(chain[depth-1].p + count));
850
851 if (blk == first_block + count)
852 count++;
853 else
854 break;
855 }
856 if (err != -EAGAIN)
857 goto got_it;
858 }
859
860
861 if (!create || err == -EIO)
862 goto cleanup;
863
864 mutex_lock(&ei->truncate_mutex);
865
866
867
868
869
870
871
872
873
874
875
876
877
878 if (err == -EAGAIN || !verify_chain(chain, partial)) {
879 while (partial > chain) {
880 brelse(partial->bh);
881 partial--;
882 }
883 partial = ext3_get_branch(inode, depth, offsets, chain, &err);
884 if (!partial) {
885 count++;
886 mutex_unlock(&ei->truncate_mutex);
887 if (err)
888 goto cleanup;
889 clear_buffer_new(bh_result);
890 goto got_it;
891 }
892 }
893
894
895
896
897
898 if (S_ISREG(inode->i_mode) && (!ei->i_block_alloc_info))
899 ext3_init_block_alloc_info(inode);
900
901 goal = ext3_find_goal(inode, iblock, partial);
902
903
904 indirect_blks = (chain + depth) - partial - 1;
905
906
907
908
909
910 count = ext3_blks_to_allocate(partial, indirect_blks,
911 maxblocks, blocks_to_boundary);
912
913
914
915 err = ext3_alloc_branch(handle, inode, indirect_blks, &count, goal,
916 offsets + (partial - chain), partial);
917
918
919
920
921
922
923
924
925 if (!err)
926 err = ext3_splice_branch(handle, inode, iblock,
927 partial, indirect_blks, count);
928 mutex_unlock(&ei->truncate_mutex);
929 if (err)
930 goto cleanup;
931
932 set_buffer_new(bh_result);
933got_it:
934 map_bh(bh_result, inode->i_sb, le32_to_cpu(chain[depth-1].key));
935 if (count > blocks_to_boundary)
936 set_buffer_boundary(bh_result);
937 err = count;
938
939 partial = chain + depth - 1;
940cleanup:
941 while (partial > chain) {
942 BUFFER_TRACE(partial->bh, "call brelse");
943 brelse(partial->bh);
944 partial--;
945 }
946 BUFFER_TRACE(bh_result, "returned");
947out:
948 return err;
949}
950
951
952#define DIO_MAX_BLOCKS 4096
953
954
955
956
957
958
959
960#define DIO_CREDITS 25
961
962static int ext3_get_block(struct inode *inode, sector_t iblock,
963 struct buffer_head *bh_result, int create)
964{
965 handle_t *handle = ext3_journal_current_handle();
966 int ret = 0, started = 0;
967 unsigned max_blocks = bh_result->b_size >> inode->i_blkbits;
968
969 if (create && !handle) {
970 if (max_blocks > DIO_MAX_BLOCKS)
971 max_blocks = DIO_MAX_BLOCKS;
972 handle = ext3_journal_start(inode, DIO_CREDITS +
973 EXT3_MAXQUOTAS_TRANS_BLOCKS(inode->i_sb));
974 if (IS_ERR(handle)) {
975 ret = PTR_ERR(handle);
976 goto out;
977 }
978 started = 1;
979 }
980
981 ret = ext3_get_blocks_handle(handle, inode, iblock,
982 max_blocks, bh_result, create);
983 if (ret > 0) {
984 bh_result->b_size = (ret << inode->i_blkbits);
985 ret = 0;
986 }
987 if (started)
988 ext3_journal_stop(handle);
989out:
990 return ret;
991}
992
993int ext3_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo,
994 u64 start, u64 len)
995{
996 return generic_block_fiemap(inode, fieinfo, start, len,
997 ext3_get_block);
998}
999
1000
1001
1002
1003struct buffer_head *ext3_getblk(handle_t *handle, struct inode *inode,
1004 long block, int create, int *errp)
1005{
1006 struct buffer_head dummy;
1007 int fatal = 0, err;
1008
1009 J_ASSERT(handle != NULL || create == 0);
1010
1011 dummy.b_state = 0;
1012 dummy.b_blocknr = -1000;
1013 buffer_trace_init(&dummy.b_history);
1014 err = ext3_get_blocks_handle(handle, inode, block, 1,
1015 &dummy, create);
1016
1017
1018
1019
1020 if (err > 0) {
1021 if (err > 1)
1022 WARN_ON(1);
1023 err = 0;
1024 }
1025 *errp = err;
1026 if (!err && buffer_mapped(&dummy)) {
1027 struct buffer_head *bh;
1028 bh = sb_getblk(inode->i_sb, dummy.b_blocknr);
1029 if (!bh) {
1030 *errp = -EIO;
1031 goto err;
1032 }
1033 if (buffer_new(&dummy)) {
1034 J_ASSERT(create != 0);
1035 J_ASSERT(handle != NULL);
1036
1037
1038
1039
1040
1041
1042
1043
1044 lock_buffer(bh);
1045 BUFFER_TRACE(bh, "call get_create_access");
1046 fatal = ext3_journal_get_create_access(handle, bh);
1047 if (!fatal && !buffer_uptodate(bh)) {
1048 memset(bh->b_data,0,inode->i_sb->s_blocksize);
1049 set_buffer_uptodate(bh);
1050 }
1051 unlock_buffer(bh);
1052 BUFFER_TRACE(bh, "call ext3_journal_dirty_metadata");
1053 err = ext3_journal_dirty_metadata(handle, bh);
1054 if (!fatal)
1055 fatal = err;
1056 } else {
1057 BUFFER_TRACE(bh, "not a new buffer");
1058 }
1059 if (fatal) {
1060 *errp = fatal;
1061 brelse(bh);
1062 bh = NULL;
1063 }
1064 return bh;
1065 }
1066err:
1067 return NULL;
1068}
1069
1070struct buffer_head *ext3_bread(handle_t *handle, struct inode *inode,
1071 int block, int create, int *err)
1072{
1073 struct buffer_head * bh;
1074
1075 bh = ext3_getblk(handle, inode, block, create, err);
1076 if (!bh)
1077 return bh;
1078 if (buffer_uptodate(bh))
1079 return bh;
1080 ll_rw_block(READ_META, 1, &bh);
1081 wait_on_buffer(bh);
1082 if (buffer_uptodate(bh))
1083 return bh;
1084 put_bh(bh);
1085 *err = -EIO;
1086 return NULL;
1087}
1088
1089static int walk_page_buffers( handle_t *handle,
1090 struct buffer_head *head,
1091 unsigned from,
1092 unsigned to,
1093 int *partial,
1094 int (*fn)( handle_t *handle,
1095 struct buffer_head *bh))
1096{
1097 struct buffer_head *bh;
1098 unsigned block_start, block_end;
1099 unsigned blocksize = head->b_size;
1100 int err, ret = 0;
1101 struct buffer_head *next;
1102
1103 for ( bh = head, block_start = 0;
1104 ret == 0 && (bh != head || !block_start);
1105 block_start = block_end, bh = next)
1106 {
1107 next = bh->b_this_page;
1108 block_end = block_start + blocksize;
1109 if (block_end <= from || block_start >= to) {
1110 if (partial && !buffer_uptodate(bh))
1111 *partial = 1;
1112 continue;
1113 }
1114 err = (*fn)(handle, bh);
1115 if (!ret)
1116 ret = err;
1117 }
1118 return ret;
1119}
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146static int do_journal_get_write_access(handle_t *handle,
1147 struct buffer_head *bh)
1148{
1149 if (!buffer_mapped(bh) || buffer_freed(bh))
1150 return 0;
1151 return ext3_journal_get_write_access(handle, bh);
1152}
1153
1154
1155
1156
1157
1158static void ext3_truncate_failed_write(struct inode *inode)
1159{
1160 truncate_inode_pages(inode->i_mapping, inode->i_size);
1161 ext3_truncate(inode);
1162}
1163
1164static int ext3_write_begin(struct file *file, struct address_space *mapping,
1165 loff_t pos, unsigned len, unsigned flags,
1166 struct page **pagep, void **fsdata)
1167{
1168 struct inode *inode = mapping->host;
1169 int ret;
1170 handle_t *handle;
1171 int retries = 0;
1172 struct page *page;
1173 pgoff_t index;
1174 unsigned from, to;
1175
1176
1177 int needed_blocks = ext3_writepage_trans_blocks(inode) + 1;
1178
1179 index = pos >> PAGE_CACHE_SHIFT;
1180 from = pos & (PAGE_CACHE_SIZE - 1);
1181 to = from + len;
1182
1183retry:
1184 page = grab_cache_page_write_begin(mapping, index, flags);
1185 if (!page)
1186 return -ENOMEM;
1187 *pagep = page;
1188
1189 handle = ext3_journal_start(inode, needed_blocks);
1190 if (IS_ERR(handle)) {
1191 unlock_page(page);
1192 page_cache_release(page);
1193 ret = PTR_ERR(handle);
1194 goto out;
1195 }
1196 ret = block_write_begin(file, mapping, pos, len, flags, pagep, fsdata,
1197 ext3_get_block);
1198 if (ret)
1199 goto write_begin_failed;
1200
1201 if (ext3_should_journal_data(inode)) {
1202 ret = walk_page_buffers(handle, page_buffers(page),
1203 from, to, NULL, do_journal_get_write_access);
1204 }
1205write_begin_failed:
1206 if (ret) {
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216 if (pos + len > inode->i_size && ext3_can_truncate(inode))
1217 ext3_orphan_add(handle, inode);
1218 ext3_journal_stop(handle);
1219 unlock_page(page);
1220 page_cache_release(page);
1221 if (pos + len > inode->i_size)
1222 ext3_truncate_failed_write(inode);
1223 }
1224 if (ret == -ENOSPC && ext3_should_retry_alloc(inode->i_sb, &retries))
1225 goto retry;
1226out:
1227 return ret;
1228}
1229
1230
1231int ext3_journal_dirty_data(handle_t *handle, struct buffer_head *bh)
1232{
1233 int err = journal_dirty_data(handle, bh);
1234 if (err)
1235 ext3_journal_abort_handle(__func__, __func__,
1236 bh, handle, err);
1237 return err;
1238}
1239
1240
1241static int journal_dirty_data_fn(handle_t *handle, struct buffer_head *bh)
1242{
1243
1244
1245
1246
1247 if (buffer_mapped(bh) && buffer_uptodate(bh))
1248 return ext3_journal_dirty_data(handle, bh);
1249 return 0;
1250}
1251
1252
1253static int write_end_fn(handle_t *handle, struct buffer_head *bh)
1254{
1255 if (!buffer_mapped(bh) || buffer_freed(bh))
1256 return 0;
1257 set_buffer_uptodate(bh);
1258 return ext3_journal_dirty_metadata(handle, bh);
1259}
1260
1261
1262
1263
1264
1265
1266
1267static void update_file_sizes(struct inode *inode, loff_t pos, unsigned copied)
1268{
1269
1270 if (pos + copied > inode->i_size)
1271 i_size_write(inode, pos + copied);
1272 if (pos + copied > EXT3_I(inode)->i_disksize) {
1273 EXT3_I(inode)->i_disksize = pos + copied;
1274 mark_inode_dirty(inode);
1275 }
1276}
1277
1278
1279
1280
1281
1282
1283
1284
1285static int ext3_ordered_write_end(struct file *file,
1286 struct address_space *mapping,
1287 loff_t pos, unsigned len, unsigned copied,
1288 struct page *page, void *fsdata)
1289{
1290 handle_t *handle = ext3_journal_current_handle();
1291 struct inode *inode = file->f_mapping->host;
1292 unsigned from, to;
1293 int ret = 0, ret2;
1294
1295 copied = block_write_end(file, mapping, pos, len, copied, page, fsdata);
1296
1297 from = pos & (PAGE_CACHE_SIZE - 1);
1298 to = from + copied;
1299 ret = walk_page_buffers(handle, page_buffers(page),
1300 from, to, NULL, journal_dirty_data_fn);
1301
1302 if (ret == 0)
1303 update_file_sizes(inode, pos, copied);
1304
1305
1306
1307
1308 if (pos + len > inode->i_size && ext3_can_truncate(inode))
1309 ext3_orphan_add(handle, inode);
1310 ret2 = ext3_journal_stop(handle);
1311 if (!ret)
1312 ret = ret2;
1313 unlock_page(page);
1314 page_cache_release(page);
1315
1316 if (pos + len > inode->i_size)
1317 ext3_truncate_failed_write(inode);
1318 return ret ? ret : copied;
1319}
1320
1321static int ext3_writeback_write_end(struct file *file,
1322 struct address_space *mapping,
1323 loff_t pos, unsigned len, unsigned copied,
1324 struct page *page, void *fsdata)
1325{
1326 handle_t *handle = ext3_journal_current_handle();
1327 struct inode *inode = file->f_mapping->host;
1328 int ret;
1329
1330 copied = block_write_end(file, mapping, pos, len, copied, page, fsdata);
1331 update_file_sizes(inode, pos, copied);
1332
1333
1334
1335
1336 if (pos + len > inode->i_size && ext3_can_truncate(inode))
1337 ext3_orphan_add(handle, inode);
1338 ret = ext3_journal_stop(handle);
1339 unlock_page(page);
1340 page_cache_release(page);
1341
1342 if (pos + len > inode->i_size)
1343 ext3_truncate_failed_write(inode);
1344 return ret ? ret : copied;
1345}
1346
1347static int ext3_journalled_write_end(struct file *file,
1348 struct address_space *mapping,
1349 loff_t pos, unsigned len, unsigned copied,
1350 struct page *page, void *fsdata)
1351{
1352 handle_t *handle = ext3_journal_current_handle();
1353 struct inode *inode = mapping->host;
1354 int ret = 0, ret2;
1355 int partial = 0;
1356 unsigned from, to;
1357
1358 from = pos & (PAGE_CACHE_SIZE - 1);
1359 to = from + len;
1360
1361 if (copied < len) {
1362 if (!PageUptodate(page))
1363 copied = 0;
1364 page_zero_new_buffers(page, from + copied, to);
1365 to = from + copied;
1366 }
1367
1368 ret = walk_page_buffers(handle, page_buffers(page), from,
1369 to, &partial, write_end_fn);
1370 if (!partial)
1371 SetPageUptodate(page);
1372
1373 if (pos + copied > inode->i_size)
1374 i_size_write(inode, pos + copied);
1375
1376
1377
1378
1379 if (pos + len > inode->i_size && ext3_can_truncate(inode))
1380 ext3_orphan_add(handle, inode);
1381 EXT3_I(inode)->i_state |= EXT3_STATE_JDATA;
1382 if (inode->i_size > EXT3_I(inode)->i_disksize) {
1383 EXT3_I(inode)->i_disksize = inode->i_size;
1384 ret2 = ext3_mark_inode_dirty(handle, inode);
1385 if (!ret)
1386 ret = ret2;
1387 }
1388
1389 ret2 = ext3_journal_stop(handle);
1390 if (!ret)
1391 ret = ret2;
1392 unlock_page(page);
1393 page_cache_release(page);
1394
1395 if (pos + len > inode->i_size)
1396 ext3_truncate_failed_write(inode);
1397 return ret ? ret : copied;
1398}
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414static sector_t ext3_bmap(struct address_space *mapping, sector_t block)
1415{
1416 struct inode *inode = mapping->host;
1417 journal_t *journal;
1418 int err;
1419
1420 if (EXT3_I(inode)->i_state & EXT3_STATE_JDATA) {
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439 EXT3_I(inode)->i_state &= ~EXT3_STATE_JDATA;
1440 journal = EXT3_JOURNAL(inode);
1441 journal_lock_updates(journal);
1442 err = journal_flush(journal);
1443 journal_unlock_updates(journal);
1444
1445 if (err)
1446 return 0;
1447 }
1448
1449 return generic_block_bmap(mapping,block,ext3_get_block);
1450}
1451
1452static int bget_one(handle_t *handle, struct buffer_head *bh)
1453{
1454 get_bh(bh);
1455 return 0;
1456}
1457
1458static int bput_one(handle_t *handle, struct buffer_head *bh)
1459{
1460 put_bh(bh);
1461 return 0;
1462}
1463
1464static int buffer_unmapped(handle_t *handle, struct buffer_head *bh)
1465{
1466 return !buffer_mapped(bh);
1467}
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521static int ext3_ordered_writepage(struct page *page,
1522 struct writeback_control *wbc)
1523{
1524 struct inode *inode = page->mapping->host;
1525 struct buffer_head *page_bufs;
1526 handle_t *handle = NULL;
1527 int ret = 0;
1528 int err;
1529
1530 J_ASSERT(PageLocked(page));
1531
1532
1533
1534
1535
1536 if (ext3_journal_current_handle())
1537 goto out_fail;
1538
1539 if (!page_has_buffers(page)) {
1540 create_empty_buffers(page, inode->i_sb->s_blocksize,
1541 (1 << BH_Dirty)|(1 << BH_Uptodate));
1542 page_bufs = page_buffers(page);
1543 } else {
1544 page_bufs = page_buffers(page);
1545 if (!walk_page_buffers(NULL, page_bufs, 0, PAGE_CACHE_SIZE,
1546 NULL, buffer_unmapped)) {
1547
1548
1549 return block_write_full_page(page, NULL, wbc);
1550 }
1551 }
1552 handle = ext3_journal_start(inode, ext3_writepage_trans_blocks(inode));
1553
1554 if (IS_ERR(handle)) {
1555 ret = PTR_ERR(handle);
1556 goto out_fail;
1557 }
1558
1559 walk_page_buffers(handle, page_bufs, 0,
1560 PAGE_CACHE_SIZE, NULL, bget_one);
1561
1562 ret = block_write_full_page(page, ext3_get_block, wbc);
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576 if (ret == 0) {
1577 err = walk_page_buffers(handle, page_bufs, 0, PAGE_CACHE_SIZE,
1578 NULL, journal_dirty_data_fn);
1579 if (!ret)
1580 ret = err;
1581 }
1582 walk_page_buffers(handle, page_bufs, 0,
1583 PAGE_CACHE_SIZE, NULL, bput_one);
1584 err = ext3_journal_stop(handle);
1585 if (!ret)
1586 ret = err;
1587 return ret;
1588
1589out_fail:
1590 redirty_page_for_writepage(wbc, page);
1591 unlock_page(page);
1592 return ret;
1593}
1594
1595static int ext3_writeback_writepage(struct page *page,
1596 struct writeback_control *wbc)
1597{
1598 struct inode *inode = page->mapping->host;
1599 handle_t *handle = NULL;
1600 int ret = 0;
1601 int err;
1602
1603 if (ext3_journal_current_handle())
1604 goto out_fail;
1605
1606 if (page_has_buffers(page)) {
1607 if (!walk_page_buffers(NULL, page_buffers(page), 0,
1608 PAGE_CACHE_SIZE, NULL, buffer_unmapped)) {
1609
1610
1611 return block_write_full_page(page, NULL, wbc);
1612 }
1613 }
1614
1615 handle = ext3_journal_start(inode, ext3_writepage_trans_blocks(inode));
1616 if (IS_ERR(handle)) {
1617 ret = PTR_ERR(handle);
1618 goto out_fail;
1619 }
1620
1621 if (test_opt(inode->i_sb, NOBH) && ext3_should_writeback_data(inode))
1622 ret = nobh_writepage(page, ext3_get_block, wbc);
1623 else
1624 ret = block_write_full_page(page, ext3_get_block, wbc);
1625
1626 err = ext3_journal_stop(handle);
1627 if (!ret)
1628 ret = err;
1629 return ret;
1630
1631out_fail:
1632 redirty_page_for_writepage(wbc, page);
1633 unlock_page(page);
1634 return ret;
1635}
1636
1637static int ext3_journalled_writepage(struct page *page,
1638 struct writeback_control *wbc)
1639{
1640 struct inode *inode = page->mapping->host;
1641 handle_t *handle = NULL;
1642 int ret = 0;
1643 int err;
1644
1645 if (ext3_journal_current_handle())
1646 goto no_write;
1647
1648 handle = ext3_journal_start(inode, ext3_writepage_trans_blocks(inode));
1649 if (IS_ERR(handle)) {
1650 ret = PTR_ERR(handle);
1651 goto no_write;
1652 }
1653
1654 if (!page_has_buffers(page) || PageChecked(page)) {
1655
1656
1657
1658
1659 ClearPageChecked(page);
1660 ret = block_prepare_write(page, 0, PAGE_CACHE_SIZE,
1661 ext3_get_block);
1662 if (ret != 0) {
1663 ext3_journal_stop(handle);
1664 goto out_unlock;
1665 }
1666 ret = walk_page_buffers(handle, page_buffers(page), 0,
1667 PAGE_CACHE_SIZE, NULL, do_journal_get_write_access);
1668
1669 err = walk_page_buffers(handle, page_buffers(page), 0,
1670 PAGE_CACHE_SIZE, NULL, write_end_fn);
1671 if (ret == 0)
1672 ret = err;
1673 EXT3_I(inode)->i_state |= EXT3_STATE_JDATA;
1674 unlock_page(page);
1675 } else {
1676
1677
1678
1679
1680
1681 ret = block_write_full_page(page, ext3_get_block, wbc);
1682 }
1683 err = ext3_journal_stop(handle);
1684 if (!ret)
1685 ret = err;
1686out:
1687 return ret;
1688
1689no_write:
1690 redirty_page_for_writepage(wbc, page);
1691out_unlock:
1692 unlock_page(page);
1693 goto out;
1694}
1695
1696static int ext3_readpage(struct file *file, struct page *page)
1697{
1698 return mpage_readpage(page, ext3_get_block);
1699}
1700
1701static int
1702ext3_readpages(struct file *file, struct address_space *mapping,
1703 struct list_head *pages, unsigned nr_pages)
1704{
1705 return mpage_readpages(mapping, pages, nr_pages, ext3_get_block);
1706}
1707
1708static void ext3_invalidatepage(struct page *page, unsigned long offset)
1709{
1710 journal_t *journal = EXT3_JOURNAL(page->mapping->host);
1711
1712
1713
1714
1715 if (offset == 0)
1716 ClearPageChecked(page);
1717
1718 journal_invalidatepage(journal, page, offset);
1719}
1720
1721static int ext3_releasepage(struct page *page, gfp_t wait)
1722{
1723 journal_t *journal = EXT3_JOURNAL(page->mapping->host);
1724
1725 WARN_ON(PageChecked(page));
1726 if (!page_has_buffers(page))
1727 return 0;
1728 return journal_try_to_free_buffers(journal, page, wait);
1729}
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740static ssize_t ext3_direct_IO(int rw, struct kiocb *iocb,
1741 const struct iovec *iov, loff_t offset,
1742 unsigned long nr_segs)
1743{
1744 struct file *file = iocb->ki_filp;
1745 struct inode *inode = file->f_mapping->host;
1746 struct ext3_inode_info *ei = EXT3_I(inode);
1747 handle_t *handle;
1748 ssize_t ret;
1749 int orphan = 0;
1750 size_t count = iov_length(iov, nr_segs);
1751 int retries = 0;
1752
1753 if (rw == WRITE) {
1754 loff_t final_size = offset + count;
1755
1756 if (final_size > inode->i_size) {
1757
1758 handle = ext3_journal_start(inode, 2);
1759 if (IS_ERR(handle)) {
1760 ret = PTR_ERR(handle);
1761 goto out;
1762 }
1763 ret = ext3_orphan_add(handle, inode);
1764 if (ret) {
1765 ext3_journal_stop(handle);
1766 goto out;
1767 }
1768 orphan = 1;
1769 ei->i_disksize = inode->i_size;
1770 ext3_journal_stop(handle);
1771 }
1772 }
1773
1774retry:
1775 ret = blockdev_direct_IO(rw, iocb, inode, inode->i_sb->s_bdev, iov,
1776 offset, nr_segs,
1777 ext3_get_block, NULL);
1778 if (ret == -ENOSPC && ext3_should_retry_alloc(inode->i_sb, &retries))
1779 goto retry;
1780
1781 if (orphan) {
1782 int err;
1783
1784
1785 handle = ext3_journal_start(inode, 2);
1786 if (IS_ERR(handle)) {
1787
1788
1789
1790 ret = PTR_ERR(handle);
1791 goto out;
1792 }
1793 if (inode->i_nlink)
1794 ext3_orphan_del(handle, inode);
1795 if (ret > 0) {
1796 loff_t end = offset + ret;
1797 if (end > inode->i_size) {
1798 ei->i_disksize = end;
1799 i_size_write(inode, end);
1800
1801
1802
1803
1804
1805
1806
1807 ext3_mark_inode_dirty(handle, inode);
1808 }
1809 }
1810 err = ext3_journal_stop(handle);
1811 if (ret == 0)
1812 ret = err;
1813 }
1814out:
1815 return ret;
1816}
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831static int ext3_journalled_set_page_dirty(struct page *page)
1832{
1833 SetPageChecked(page);
1834 return __set_page_dirty_nobuffers(page);
1835}
1836
1837static const struct address_space_operations ext3_ordered_aops = {
1838 .readpage = ext3_readpage,
1839 .readpages = ext3_readpages,
1840 .writepage = ext3_ordered_writepage,
1841 .sync_page = block_sync_page,
1842 .write_begin = ext3_write_begin,
1843 .write_end = ext3_ordered_write_end,
1844 .bmap = ext3_bmap,
1845 .invalidatepage = ext3_invalidatepage,
1846 .releasepage = ext3_releasepage,
1847 .direct_IO = ext3_direct_IO,
1848 .migratepage = buffer_migrate_page,
1849 .is_partially_uptodate = block_is_partially_uptodate,
1850 .error_remove_page = generic_error_remove_page,
1851};
1852
1853static const struct address_space_operations ext3_writeback_aops = {
1854 .readpage = ext3_readpage,
1855 .readpages = ext3_readpages,
1856 .writepage = ext3_writeback_writepage,
1857 .sync_page = block_sync_page,
1858 .write_begin = ext3_write_begin,
1859 .write_end = ext3_writeback_write_end,
1860 .bmap = ext3_bmap,
1861 .invalidatepage = ext3_invalidatepage,
1862 .releasepage = ext3_releasepage,
1863 .direct_IO = ext3_direct_IO,
1864 .migratepage = buffer_migrate_page,
1865 .is_partially_uptodate = block_is_partially_uptodate,
1866 .error_remove_page = generic_error_remove_page,
1867};
1868
1869static const struct address_space_operations ext3_journalled_aops = {
1870 .readpage = ext3_readpage,
1871 .readpages = ext3_readpages,
1872 .writepage = ext3_journalled_writepage,
1873 .sync_page = block_sync_page,
1874 .write_begin = ext3_write_begin,
1875 .write_end = ext3_journalled_write_end,
1876 .set_page_dirty = ext3_journalled_set_page_dirty,
1877 .bmap = ext3_bmap,
1878 .invalidatepage = ext3_invalidatepage,
1879 .releasepage = ext3_releasepage,
1880 .is_partially_uptodate = block_is_partially_uptodate,
1881 .error_remove_page = generic_error_remove_page,
1882};
1883
1884void ext3_set_aops(struct inode *inode)
1885{
1886 if (ext3_should_order_data(inode))
1887 inode->i_mapping->a_ops = &ext3_ordered_aops;
1888 else if (ext3_should_writeback_data(inode))
1889 inode->i_mapping->a_ops = &ext3_writeback_aops;
1890 else
1891 inode->i_mapping->a_ops = &ext3_journalled_aops;
1892}
1893
1894
1895
1896
1897
1898
1899
1900static int ext3_block_truncate_page(handle_t *handle, struct page *page,
1901 struct address_space *mapping, loff_t from)
1902{
1903 ext3_fsblk_t index = from >> PAGE_CACHE_SHIFT;
1904 unsigned offset = from & (PAGE_CACHE_SIZE-1);
1905 unsigned blocksize, iblock, length, pos;
1906 struct inode *inode = mapping->host;
1907 struct buffer_head *bh;
1908 int err = 0;
1909
1910 blocksize = inode->i_sb->s_blocksize;
1911 length = blocksize - (offset & (blocksize - 1));
1912 iblock = index << (PAGE_CACHE_SHIFT - inode->i_sb->s_blocksize_bits);
1913
1914
1915
1916
1917
1918 if (!page_has_buffers(page) && test_opt(inode->i_sb, NOBH) &&
1919 ext3_should_writeback_data(inode) && PageUptodate(page)) {
1920 zero_user(page, offset, length);
1921 set_page_dirty(page);
1922 goto unlock;
1923 }
1924
1925 if (!page_has_buffers(page))
1926 create_empty_buffers(page, blocksize, 0);
1927
1928
1929 bh = page_buffers(page);
1930 pos = blocksize;
1931 while (offset >= pos) {
1932 bh = bh->b_this_page;
1933 iblock++;
1934 pos += blocksize;
1935 }
1936
1937 err = 0;
1938 if (buffer_freed(bh)) {
1939 BUFFER_TRACE(bh, "freed: skip");
1940 goto unlock;
1941 }
1942
1943 if (!buffer_mapped(bh)) {
1944 BUFFER_TRACE(bh, "unmapped");
1945 ext3_get_block(inode, iblock, bh, 0);
1946
1947 if (!buffer_mapped(bh)) {
1948 BUFFER_TRACE(bh, "still unmapped");
1949 goto unlock;
1950 }
1951 }
1952
1953
1954 if (PageUptodate(page))
1955 set_buffer_uptodate(bh);
1956
1957 if (!buffer_uptodate(bh)) {
1958 err = -EIO;
1959 ll_rw_block(READ, 1, &bh);
1960 wait_on_buffer(bh);
1961
1962 if (!buffer_uptodate(bh))
1963 goto unlock;
1964 }
1965
1966 if (ext3_should_journal_data(inode)) {
1967 BUFFER_TRACE(bh, "get write access");
1968 err = ext3_journal_get_write_access(handle, bh);
1969 if (err)
1970 goto unlock;
1971 }
1972
1973 zero_user(page, offset, length);
1974 BUFFER_TRACE(bh, "zeroed end of block");
1975
1976 err = 0;
1977 if (ext3_should_journal_data(inode)) {
1978 err = ext3_journal_dirty_metadata(handle, bh);
1979 } else {
1980 if (ext3_should_order_data(inode))
1981 err = ext3_journal_dirty_data(handle, bh);
1982 mark_buffer_dirty(bh);
1983 }
1984
1985unlock:
1986 unlock_page(page);
1987 page_cache_release(page);
1988 return err;
1989}
1990
1991
1992
1993
1994
1995
1996static inline int all_zeroes(__le32 *p, __le32 *q)
1997{
1998 while (p < q)
1999 if (*p++)
2000 return 0;
2001 return 1;
2002}
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039static Indirect *ext3_find_shared(struct inode *inode, int depth,
2040 int offsets[4], Indirect chain[4], __le32 *top)
2041{
2042 Indirect *partial, *p;
2043 int k, err;
2044
2045 *top = 0;
2046
2047 for (k = depth; k > 1 && !offsets[k-1]; k--)
2048 ;
2049 partial = ext3_get_branch(inode, k, offsets, chain, &err);
2050
2051 if (!partial)
2052 partial = chain + k-1;
2053
2054
2055
2056
2057 if (!partial->key && *partial->p)
2058
2059 goto no_top;
2060 for (p=partial; p>chain && all_zeroes((__le32*)p->bh->b_data,p->p); p--)
2061 ;
2062
2063
2064
2065
2066
2067
2068 if (p == chain + k - 1 && p > chain) {
2069 p->p--;
2070 } else {
2071 *top = *p->p;
2072
2073#if 0
2074 *p->p = 0;
2075#endif
2076 }
2077
2078
2079 while(partial > p) {
2080 brelse(partial->bh);
2081 partial--;
2082 }
2083no_top:
2084 return partial;
2085}
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095static void ext3_clear_blocks(handle_t *handle, struct inode *inode,
2096 struct buffer_head *bh, ext3_fsblk_t block_to_free,
2097 unsigned long count, __le32 *first, __le32 *last)
2098{
2099 __le32 *p;
2100 if (try_to_extend_transaction(handle, inode)) {
2101 if (bh) {
2102 BUFFER_TRACE(bh, "call ext3_journal_dirty_metadata");
2103 ext3_journal_dirty_metadata(handle, bh);
2104 }
2105 ext3_mark_inode_dirty(handle, inode);
2106 truncate_restart_transaction(handle, inode);
2107 if (bh) {
2108 BUFFER_TRACE(bh, "retaking write access");
2109 ext3_journal_get_write_access(handle, bh);
2110 }
2111 }
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121 for (p = first; p < last; p++) {
2122 u32 nr = le32_to_cpu(*p);
2123 if (nr) {
2124 struct buffer_head *bh;
2125
2126 *p = 0;
2127 bh = sb_find_get_block(inode->i_sb, nr);
2128 ext3_forget(handle, 0, inode, bh, nr);
2129 }
2130 }
2131
2132 ext3_free_blocks(handle, inode, block_to_free, count);
2133}
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154static void ext3_free_data(handle_t *handle, struct inode *inode,
2155 struct buffer_head *this_bh,
2156 __le32 *first, __le32 *last)
2157{
2158 ext3_fsblk_t block_to_free = 0;
2159 unsigned long count = 0;
2160 __le32 *block_to_free_p = NULL;
2161
2162
2163 ext3_fsblk_t nr;
2164 __le32 *p;
2165
2166 int err;
2167
2168 if (this_bh) {
2169 BUFFER_TRACE(this_bh, "get_write_access");
2170 err = ext3_journal_get_write_access(handle, this_bh);
2171
2172
2173 if (err)
2174 return;
2175 }
2176
2177 for (p = first; p < last; p++) {
2178 nr = le32_to_cpu(*p);
2179 if (nr) {
2180
2181 if (count == 0) {
2182 block_to_free = nr;
2183 block_to_free_p = p;
2184 count = 1;
2185 } else if (nr == block_to_free + count) {
2186 count++;
2187 } else {
2188 ext3_clear_blocks(handle, inode, this_bh,
2189 block_to_free,
2190 count, block_to_free_p, p);
2191 block_to_free = nr;
2192 block_to_free_p = p;
2193 count = 1;
2194 }
2195 }
2196 }
2197
2198 if (count > 0)
2199 ext3_clear_blocks(handle, inode, this_bh, block_to_free,
2200 count, block_to_free_p, p);
2201
2202 if (this_bh) {
2203 BUFFER_TRACE(this_bh, "call ext3_journal_dirty_metadata");
2204
2205
2206
2207
2208
2209
2210
2211 if (bh2jh(this_bh))
2212 ext3_journal_dirty_metadata(handle, this_bh);
2213 else
2214 ext3_error(inode->i_sb, "ext3_free_data",
2215 "circular indirect block detected, "
2216 "inode=%lu, block=%llu",
2217 inode->i_ino,
2218 (unsigned long long)this_bh->b_blocknr);
2219 }
2220}
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235static void ext3_free_branches(handle_t *handle, struct inode *inode,
2236 struct buffer_head *parent_bh,
2237 __le32 *first, __le32 *last, int depth)
2238{
2239 ext3_fsblk_t nr;
2240 __le32 *p;
2241
2242 if (is_handle_aborted(handle))
2243 return;
2244
2245 if (depth--) {
2246 struct buffer_head *bh;
2247 int addr_per_block = EXT3_ADDR_PER_BLOCK(inode->i_sb);
2248 p = last;
2249 while (--p >= first) {
2250 nr = le32_to_cpu(*p);
2251 if (!nr)
2252 continue;
2253
2254
2255 bh = sb_bread(inode->i_sb, nr);
2256
2257
2258
2259
2260
2261 if (!bh) {
2262 ext3_error(inode->i_sb, "ext3_free_branches",
2263 "Read failure, inode=%lu, block="E3FSBLK,
2264 inode->i_ino, nr);
2265 continue;
2266 }
2267
2268
2269 BUFFER_TRACE(bh, "free child branches");
2270 ext3_free_branches(handle, inode, bh,
2271 (__le32*)bh->b_data,
2272 (__le32*)bh->b_data + addr_per_block,
2273 depth);
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294 ext3_forget(handle, 1, inode, bh, bh->b_blocknr);
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312 if (is_handle_aborted(handle))
2313 return;
2314 if (try_to_extend_transaction(handle, inode)) {
2315 ext3_mark_inode_dirty(handle, inode);
2316 truncate_restart_transaction(handle, inode);
2317 }
2318
2319 ext3_free_blocks(handle, inode, nr, 1);
2320
2321 if (parent_bh) {
2322
2323
2324
2325
2326 BUFFER_TRACE(parent_bh, "get_write_access");
2327 if (!ext3_journal_get_write_access(handle,
2328 parent_bh)){
2329 *p = 0;
2330 BUFFER_TRACE(parent_bh,
2331 "call ext3_journal_dirty_metadata");
2332 ext3_journal_dirty_metadata(handle,
2333 parent_bh);
2334 }
2335 }
2336 }
2337 } else {
2338
2339 BUFFER_TRACE(parent_bh, "free data blocks");
2340 ext3_free_data(handle, inode, parent_bh, first, last);
2341 }
2342}
2343
2344int ext3_can_truncate(struct inode *inode)
2345{
2346 if (IS_APPEND(inode) || IS_IMMUTABLE(inode))
2347 return 0;
2348 if (S_ISREG(inode->i_mode))
2349 return 1;
2350 if (S_ISDIR(inode->i_mode))
2351 return 1;
2352 if (S_ISLNK(inode->i_mode))
2353 return !ext3_inode_is_fast_symlink(inode);
2354 return 0;
2355}
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385void ext3_truncate(struct inode *inode)
2386{
2387 handle_t *handle;
2388 struct ext3_inode_info *ei = EXT3_I(inode);
2389 __le32 *i_data = ei->i_data;
2390 int addr_per_block = EXT3_ADDR_PER_BLOCK(inode->i_sb);
2391 struct address_space *mapping = inode->i_mapping;
2392 int offsets[4];
2393 Indirect chain[4];
2394 Indirect *partial;
2395 __le32 nr = 0;
2396 int n;
2397 long last_block;
2398 unsigned blocksize = inode->i_sb->s_blocksize;
2399 struct page *page;
2400
2401 if (!ext3_can_truncate(inode))
2402 goto out_notrans;
2403
2404 if (inode->i_size == 0 && ext3_should_writeback_data(inode))
2405 ei->i_state |= EXT3_STATE_FLUSH_ON_CLOSE;
2406
2407
2408
2409
2410
2411 if ((inode->i_size & (blocksize - 1)) == 0) {
2412
2413 page = NULL;
2414 } else {
2415 page = grab_cache_page(mapping,
2416 inode->i_size >> PAGE_CACHE_SHIFT);
2417 if (!page)
2418 goto out_notrans;
2419 }
2420
2421 handle = start_transaction(inode);
2422 if (IS_ERR(handle)) {
2423 if (page) {
2424 clear_highpage(page);
2425 flush_dcache_page(page);
2426 unlock_page(page);
2427 page_cache_release(page);
2428 }
2429 goto out_notrans;
2430 }
2431
2432 last_block = (inode->i_size + blocksize-1)
2433 >> EXT3_BLOCK_SIZE_BITS(inode->i_sb);
2434
2435 if (page)
2436 ext3_block_truncate_page(handle, page, mapping, inode->i_size);
2437
2438 n = ext3_block_to_path(inode, last_block, offsets, NULL);
2439 if (n == 0)
2440 goto out_stop;
2441
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451 if (ext3_orphan_add(handle, inode))
2452 goto out_stop;
2453
2454
2455
2456
2457
2458
2459
2460
2461 ei->i_disksize = inode->i_size;
2462
2463
2464
2465
2466
2467 mutex_lock(&ei->truncate_mutex);
2468
2469 if (n == 1) {
2470 ext3_free_data(handle, inode, NULL, i_data+offsets[0],
2471 i_data + EXT3_NDIR_BLOCKS);
2472 goto do_indirects;
2473 }
2474
2475 partial = ext3_find_shared(inode, n, offsets, chain, &nr);
2476
2477 if (nr) {
2478 if (partial == chain) {
2479
2480 ext3_free_branches(handle, inode, NULL,
2481 &nr, &nr+1, (chain+n-1) - partial);
2482 *partial->p = 0;
2483
2484
2485
2486
2487 } else {
2488
2489 BUFFER_TRACE(partial->bh, "get_write_access");
2490 ext3_free_branches(handle, inode, partial->bh,
2491 partial->p,
2492 partial->p+1, (chain+n-1) - partial);
2493 }
2494 }
2495
2496 while (partial > chain) {
2497 ext3_free_branches(handle, inode, partial->bh, partial->p + 1,
2498 (__le32*)partial->bh->b_data+addr_per_block,
2499 (chain+n-1) - partial);
2500 BUFFER_TRACE(partial->bh, "call brelse");
2501 brelse (partial->bh);
2502 partial--;
2503 }
2504do_indirects:
2505
2506 switch (offsets[0]) {
2507 default:
2508 nr = i_data[EXT3_IND_BLOCK];
2509 if (nr) {
2510 ext3_free_branches(handle, inode, NULL, &nr, &nr+1, 1);
2511 i_data[EXT3_IND_BLOCK] = 0;
2512 }
2513 case EXT3_IND_BLOCK:
2514 nr = i_data[EXT3_DIND_BLOCK];
2515 if (nr) {
2516 ext3_free_branches(handle, inode, NULL, &nr, &nr+1, 2);
2517 i_data[EXT3_DIND_BLOCK] = 0;
2518 }
2519 case EXT3_DIND_BLOCK:
2520 nr = i_data[EXT3_TIND_BLOCK];
2521 if (nr) {
2522 ext3_free_branches(handle, inode, NULL, &nr, &nr+1, 3);
2523 i_data[EXT3_TIND_BLOCK] = 0;
2524 }
2525 case EXT3_TIND_BLOCK:
2526 ;
2527 }
2528
2529 ext3_discard_reservation(inode);
2530
2531 mutex_unlock(&ei->truncate_mutex);
2532 inode->i_mtime = inode->i_ctime = CURRENT_TIME_SEC;
2533 ext3_mark_inode_dirty(handle, inode);
2534
2535
2536
2537
2538
2539 if (IS_SYNC(inode))
2540 handle->h_sync = 1;
2541out_stop:
2542
2543
2544
2545
2546
2547
2548
2549 if (inode->i_nlink)
2550 ext3_orphan_del(handle, inode);
2551
2552 ext3_journal_stop(handle);
2553 return;
2554out_notrans:
2555
2556
2557
2558
2559 if (inode->i_nlink)
2560 ext3_orphan_del(NULL, inode);
2561}
2562
2563static ext3_fsblk_t ext3_get_inode_block(struct super_block *sb,
2564 unsigned long ino, struct ext3_iloc *iloc)
2565{
2566 unsigned long block_group;
2567 unsigned long offset;
2568 ext3_fsblk_t block;
2569 struct ext3_group_desc *gdp;
2570
2571 if (!ext3_valid_inum(sb, ino)) {
2572
2573
2574
2575
2576
2577 return 0;
2578 }
2579
2580 block_group = (ino - 1) / EXT3_INODES_PER_GROUP(sb);
2581 gdp = ext3_get_group_desc(sb, block_group, NULL);
2582 if (!gdp)
2583 return 0;
2584
2585
2586
2587 offset = ((ino - 1) % EXT3_INODES_PER_GROUP(sb)) *
2588 EXT3_INODE_SIZE(sb);
2589 block = le32_to_cpu(gdp->bg_inode_table) +
2590 (offset >> EXT3_BLOCK_SIZE_BITS(sb));
2591
2592 iloc->block_group = block_group;
2593 iloc->offset = offset & (EXT3_BLOCK_SIZE(sb) - 1);
2594 return block;
2595}
2596
2597
2598
2599
2600
2601
2602
2603static int __ext3_get_inode_loc(struct inode *inode,
2604 struct ext3_iloc *iloc, int in_mem)
2605{
2606 ext3_fsblk_t block;
2607 struct buffer_head *bh;
2608
2609 block = ext3_get_inode_block(inode->i_sb, inode->i_ino, iloc);
2610 if (!block)
2611 return -EIO;
2612
2613 bh = sb_getblk(inode->i_sb, block);
2614 if (!bh) {
2615 ext3_error (inode->i_sb, "ext3_get_inode_loc",
2616 "unable to read inode block - "
2617 "inode=%lu, block="E3FSBLK,
2618 inode->i_ino, block);
2619 return -EIO;
2620 }
2621 if (!buffer_uptodate(bh)) {
2622 lock_buffer(bh);
2623
2624
2625
2626
2627
2628
2629
2630 if (buffer_write_io_error(bh) && !buffer_uptodate(bh))
2631 set_buffer_uptodate(bh);
2632
2633 if (buffer_uptodate(bh)) {
2634
2635 unlock_buffer(bh);
2636 goto has_buffer;
2637 }
2638
2639
2640
2641
2642
2643
2644 if (in_mem) {
2645 struct buffer_head *bitmap_bh;
2646 struct ext3_group_desc *desc;
2647 int inodes_per_buffer;
2648 int inode_offset, i;
2649 int block_group;
2650 int start;
2651
2652 block_group = (inode->i_ino - 1) /
2653 EXT3_INODES_PER_GROUP(inode->i_sb);
2654 inodes_per_buffer = bh->b_size /
2655 EXT3_INODE_SIZE(inode->i_sb);
2656 inode_offset = ((inode->i_ino - 1) %
2657 EXT3_INODES_PER_GROUP(inode->i_sb));
2658 start = inode_offset & ~(inodes_per_buffer - 1);
2659
2660
2661 desc = ext3_get_group_desc(inode->i_sb,
2662 block_group, NULL);
2663 if (!desc)
2664 goto make_io;
2665
2666 bitmap_bh = sb_getblk(inode->i_sb,
2667 le32_to_cpu(desc->bg_inode_bitmap));
2668 if (!bitmap_bh)
2669 goto make_io;
2670
2671
2672
2673
2674
2675
2676 if (!buffer_uptodate(bitmap_bh)) {
2677 brelse(bitmap_bh);
2678 goto make_io;
2679 }
2680 for (i = start; i < start + inodes_per_buffer; i++) {
2681 if (i == inode_offset)
2682 continue;
2683 if (ext3_test_bit(i, bitmap_bh->b_data))
2684 break;
2685 }
2686 brelse(bitmap_bh);
2687 if (i == start + inodes_per_buffer) {
2688
2689 memset(bh->b_data, 0, bh->b_size);
2690 set_buffer_uptodate(bh);
2691 unlock_buffer(bh);
2692 goto has_buffer;
2693 }
2694 }
2695
2696make_io:
2697
2698
2699
2700
2701
2702 get_bh(bh);
2703 bh->b_end_io = end_buffer_read_sync;
2704 submit_bh(READ_META, bh);
2705 wait_on_buffer(bh);
2706 if (!buffer_uptodate(bh)) {
2707 ext3_error(inode->i_sb, "ext3_get_inode_loc",
2708 "unable to read inode block - "
2709 "inode=%lu, block="E3FSBLK,
2710 inode->i_ino, block);
2711 brelse(bh);
2712 return -EIO;
2713 }
2714 }
2715has_buffer:
2716 iloc->bh = bh;
2717 return 0;
2718}
2719
2720int ext3_get_inode_loc(struct inode *inode, struct ext3_iloc *iloc)
2721{
2722
2723 return __ext3_get_inode_loc(inode, iloc,
2724 !(EXT3_I(inode)->i_state & EXT3_STATE_XATTR));
2725}
2726
2727void ext3_set_inode_flags(struct inode *inode)
2728{
2729 unsigned int flags = EXT3_I(inode)->i_flags;
2730
2731 inode->i_flags &= ~(S_SYNC|S_APPEND|S_IMMUTABLE|S_NOATIME|S_DIRSYNC);
2732 if (flags & EXT3_SYNC_FL)
2733 inode->i_flags |= S_SYNC;
2734 if (flags & EXT3_APPEND_FL)
2735 inode->i_flags |= S_APPEND;
2736 if (flags & EXT3_IMMUTABLE_FL)
2737 inode->i_flags |= S_IMMUTABLE;
2738 if (flags & EXT3_NOATIME_FL)
2739 inode->i_flags |= S_NOATIME;
2740 if (flags & EXT3_DIRSYNC_FL)
2741 inode->i_flags |= S_DIRSYNC;
2742}
2743
2744
2745void ext3_get_inode_flags(struct ext3_inode_info *ei)
2746{
2747 unsigned int flags = ei->vfs_inode.i_flags;
2748
2749 ei->i_flags &= ~(EXT3_SYNC_FL|EXT3_APPEND_FL|
2750 EXT3_IMMUTABLE_FL|EXT3_NOATIME_FL|EXT3_DIRSYNC_FL);
2751 if (flags & S_SYNC)
2752 ei->i_flags |= EXT3_SYNC_FL;
2753 if (flags & S_APPEND)
2754 ei->i_flags |= EXT3_APPEND_FL;
2755 if (flags & S_IMMUTABLE)
2756 ei->i_flags |= EXT3_IMMUTABLE_FL;
2757 if (flags & S_NOATIME)
2758 ei->i_flags |= EXT3_NOATIME_FL;
2759 if (flags & S_DIRSYNC)
2760 ei->i_flags |= EXT3_DIRSYNC_FL;
2761}
2762
2763struct inode *ext3_iget(struct super_block *sb, unsigned long ino)
2764{
2765 struct ext3_iloc iloc;
2766 struct ext3_inode *raw_inode;
2767 struct ext3_inode_info *ei;
2768 struct buffer_head *bh;
2769 struct inode *inode;
2770 journal_t *journal = EXT3_SB(sb)->s_journal;
2771 transaction_t *transaction;
2772 long ret;
2773 int block;
2774
2775 inode = iget_locked(sb, ino);
2776 if (!inode)
2777 return ERR_PTR(-ENOMEM);
2778 if (!(inode->i_state & I_NEW))
2779 return inode;
2780
2781 ei = EXT3_I(inode);
2782 ei->i_block_alloc_info = NULL;
2783
2784 ret = __ext3_get_inode_loc(inode, &iloc, 0);
2785 if (ret < 0)
2786 goto bad_inode;
2787 bh = iloc.bh;
2788 raw_inode = ext3_raw_inode(&iloc);
2789 inode->i_mode = le16_to_cpu(raw_inode->i_mode);
2790 inode->i_uid = (uid_t)le16_to_cpu(raw_inode->i_uid_low);
2791 inode->i_gid = (gid_t)le16_to_cpu(raw_inode->i_gid_low);
2792 if(!(test_opt (inode->i_sb, NO_UID32))) {
2793 inode->i_uid |= le16_to_cpu(raw_inode->i_uid_high) << 16;
2794 inode->i_gid |= le16_to_cpu(raw_inode->i_gid_high) << 16;
2795 }
2796 inode->i_nlink = le16_to_cpu(raw_inode->i_links_count);
2797 inode->i_size = le32_to_cpu(raw_inode->i_size);
2798 inode->i_atime.tv_sec = (signed)le32_to_cpu(raw_inode->i_atime);
2799 inode->i_ctime.tv_sec = (signed)le32_to_cpu(raw_inode->i_ctime);
2800 inode->i_mtime.tv_sec = (signed)le32_to_cpu(raw_inode->i_mtime);
2801 inode->i_atime.tv_nsec = inode->i_ctime.tv_nsec = inode->i_mtime.tv_nsec = 0;
2802
2803 ei->i_state = 0;
2804 ei->i_dir_start_lookup = 0;
2805 ei->i_dtime = le32_to_cpu(raw_inode->i_dtime);
2806
2807
2808
2809
2810
2811 if (inode->i_nlink == 0) {
2812 if (inode->i_mode == 0 ||
2813 !(EXT3_SB(inode->i_sb)->s_mount_state & EXT3_ORPHAN_FS)) {
2814
2815 brelse (bh);
2816 ret = -ESTALE;
2817 goto bad_inode;
2818 }
2819
2820
2821
2822
2823 }
2824 inode->i_blocks = le32_to_cpu(raw_inode->i_blocks);
2825 ei->i_flags = le32_to_cpu(raw_inode->i_flags);
2826#ifdef EXT3_FRAGMENTS
2827 ei->i_faddr = le32_to_cpu(raw_inode->i_faddr);
2828 ei->i_frag_no = raw_inode->i_frag;
2829 ei->i_frag_size = raw_inode->i_fsize;
2830#endif
2831 ei->i_file_acl = le32_to_cpu(raw_inode->i_file_acl);
2832 if (!S_ISREG(inode->i_mode)) {
2833 ei->i_dir_acl = le32_to_cpu(raw_inode->i_dir_acl);
2834 } else {
2835 inode->i_size |=
2836 ((__u64)le32_to_cpu(raw_inode->i_size_high)) << 32;
2837 }
2838 ei->i_disksize = inode->i_size;
2839 inode->i_generation = le32_to_cpu(raw_inode->i_generation);
2840 ei->i_block_group = iloc.block_group;
2841
2842
2843
2844
2845 for (block = 0; block < EXT3_N_BLOCKS; block++)
2846 ei->i_data[block] = raw_inode->i_block[block];
2847 INIT_LIST_HEAD(&ei->i_orphan);
2848
2849
2850
2851
2852
2853
2854
2855
2856 if (journal) {
2857 tid_t tid;
2858
2859 spin_lock(&journal->j_state_lock);
2860 if (journal->j_running_transaction)
2861 transaction = journal->j_running_transaction;
2862 else
2863 transaction = journal->j_committing_transaction;
2864 if (transaction)
2865 tid = transaction->t_tid;
2866 else
2867 tid = journal->j_commit_sequence;
2868 spin_unlock(&journal->j_state_lock);
2869 atomic_set(&ei->i_sync_tid, tid);
2870 atomic_set(&ei->i_datasync_tid, tid);
2871 }
2872
2873 if (inode->i_ino >= EXT3_FIRST_INO(inode->i_sb) + 1 &&
2874 EXT3_INODE_SIZE(inode->i_sb) > EXT3_GOOD_OLD_INODE_SIZE) {
2875
2876
2877
2878
2879
2880 ei->i_extra_isize = le16_to_cpu(raw_inode->i_extra_isize);
2881 if (EXT3_GOOD_OLD_INODE_SIZE + ei->i_extra_isize >
2882 EXT3_INODE_SIZE(inode->i_sb)) {
2883 brelse (bh);
2884 ret = -EIO;
2885 goto bad_inode;
2886 }
2887 if (ei->i_extra_isize == 0) {
2888
2889 ei->i_extra_isize = sizeof(struct ext3_inode) -
2890 EXT3_GOOD_OLD_INODE_SIZE;
2891 } else {
2892 __le32 *magic = (void *)raw_inode +
2893 EXT3_GOOD_OLD_INODE_SIZE +
2894 ei->i_extra_isize;
2895 if (*magic == cpu_to_le32(EXT3_XATTR_MAGIC))
2896 ei->i_state |= EXT3_STATE_XATTR;
2897 }
2898 } else
2899 ei->i_extra_isize = 0;
2900
2901 if (S_ISREG(inode->i_mode)) {
2902 inode->i_op = &ext3_file_inode_operations;
2903 inode->i_fop = &ext3_file_operations;
2904 ext3_set_aops(inode);
2905 } else if (S_ISDIR(inode->i_mode)) {
2906 inode->i_op = &ext3_dir_inode_operations;
2907 inode->i_fop = &ext3_dir_operations;
2908 } else if (S_ISLNK(inode->i_mode)) {
2909 if (ext3_inode_is_fast_symlink(inode)) {
2910 inode->i_op = &ext3_fast_symlink_inode_operations;
2911 nd_terminate_link(ei->i_data, inode->i_size,
2912 sizeof(ei->i_data) - 1);
2913 } else {
2914 inode->i_op = &ext3_symlink_inode_operations;
2915 ext3_set_aops(inode);
2916 }
2917 } else {
2918 inode->i_op = &ext3_special_inode_operations;
2919 if (raw_inode->i_block[0])
2920 init_special_inode(inode, inode->i_mode,
2921 old_decode_dev(le32_to_cpu(raw_inode->i_block[0])));
2922 else
2923 init_special_inode(inode, inode->i_mode,
2924 new_decode_dev(le32_to_cpu(raw_inode->i_block[1])));
2925 }
2926 brelse (iloc.bh);
2927 ext3_set_inode_flags(inode);
2928 unlock_new_inode(inode);
2929 return inode;
2930
2931bad_inode:
2932 iget_failed(inode);
2933 return ERR_PTR(ret);
2934}
2935
2936
2937
2938
2939
2940
2941
2942
2943static int ext3_do_update_inode(handle_t *handle,
2944 struct inode *inode,
2945 struct ext3_iloc *iloc)
2946{
2947 struct ext3_inode *raw_inode = ext3_raw_inode(iloc);
2948 struct ext3_inode_info *ei = EXT3_I(inode);
2949 struct buffer_head *bh = iloc->bh;
2950 int err = 0, rc, block;
2951
2952again:
2953
2954 lock_buffer(bh);
2955
2956
2957
2958 if (ei->i_state & EXT3_STATE_NEW)
2959 memset(raw_inode, 0, EXT3_SB(inode->i_sb)->s_inode_size);
2960
2961 ext3_get_inode_flags(ei);
2962 raw_inode->i_mode = cpu_to_le16(inode->i_mode);
2963 if(!(test_opt(inode->i_sb, NO_UID32))) {
2964 raw_inode->i_uid_low = cpu_to_le16(low_16_bits(inode->i_uid));
2965 raw_inode->i_gid_low = cpu_to_le16(low_16_bits(inode->i_gid));
2966
2967
2968
2969
2970 if(!ei->i_dtime) {
2971 raw_inode->i_uid_high =
2972 cpu_to_le16(high_16_bits(inode->i_uid));
2973 raw_inode->i_gid_high =
2974 cpu_to_le16(high_16_bits(inode->i_gid));
2975 } else {
2976 raw_inode->i_uid_high = 0;
2977 raw_inode->i_gid_high = 0;
2978 }
2979 } else {
2980 raw_inode->i_uid_low =
2981 cpu_to_le16(fs_high2lowuid(inode->i_uid));
2982 raw_inode->i_gid_low =
2983 cpu_to_le16(fs_high2lowgid(inode->i_gid));
2984 raw_inode->i_uid_high = 0;
2985 raw_inode->i_gid_high = 0;
2986 }
2987 raw_inode->i_links_count = cpu_to_le16(inode->i_nlink);
2988 raw_inode->i_size = cpu_to_le32(ei->i_disksize);
2989 raw_inode->i_atime = cpu_to_le32(inode->i_atime.tv_sec);
2990 raw_inode->i_ctime = cpu_to_le32(inode->i_ctime.tv_sec);
2991 raw_inode->i_mtime = cpu_to_le32(inode->i_mtime.tv_sec);
2992 raw_inode->i_blocks = cpu_to_le32(inode->i_blocks);
2993 raw_inode->i_dtime = cpu_to_le32(ei->i_dtime);
2994 raw_inode->i_flags = cpu_to_le32(ei->i_flags);
2995#ifdef EXT3_FRAGMENTS
2996 raw_inode->i_faddr = cpu_to_le32(ei->i_faddr);
2997 raw_inode->i_frag = ei->i_frag_no;
2998 raw_inode->i_fsize = ei->i_frag_size;
2999#endif
3000 raw_inode->i_file_acl = cpu_to_le32(ei->i_file_acl);
3001 if (!S_ISREG(inode->i_mode)) {
3002 raw_inode->i_dir_acl = cpu_to_le32(ei->i_dir_acl);
3003 } else {
3004 raw_inode->i_size_high =
3005 cpu_to_le32(ei->i_disksize >> 32);
3006 if (ei->i_disksize > 0x7fffffffULL) {
3007 struct super_block *sb = inode->i_sb;
3008 if (!EXT3_HAS_RO_COMPAT_FEATURE(sb,
3009 EXT3_FEATURE_RO_COMPAT_LARGE_FILE) ||
3010 EXT3_SB(sb)->s_es->s_rev_level ==
3011 cpu_to_le32(EXT3_GOOD_OLD_REV)) {
3012
3013
3014
3015 unlock_buffer(bh);
3016 err = ext3_journal_get_write_access(handle,
3017 EXT3_SB(sb)->s_sbh);
3018 if (err)
3019 goto out_brelse;
3020
3021 ext3_update_dynamic_rev(sb);
3022 EXT3_SET_RO_COMPAT_FEATURE(sb,
3023 EXT3_FEATURE_RO_COMPAT_LARGE_FILE);
3024 handle->h_sync = 1;
3025 err = ext3_journal_dirty_metadata(handle,
3026 EXT3_SB(sb)->s_sbh);
3027
3028 goto again;
3029 }
3030 }
3031 }
3032 raw_inode->i_generation = cpu_to_le32(inode->i_generation);
3033 if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode)) {
3034 if (old_valid_dev(inode->i_rdev)) {
3035 raw_inode->i_block[0] =
3036 cpu_to_le32(old_encode_dev(inode->i_rdev));
3037 raw_inode->i_block[1] = 0;
3038 } else {
3039 raw_inode->i_block[0] = 0;
3040 raw_inode->i_block[1] =
3041 cpu_to_le32(new_encode_dev(inode->i_rdev));
3042 raw_inode->i_block[2] = 0;
3043 }
3044 } else for (block = 0; block < EXT3_N_BLOCKS; block++)
3045 raw_inode->i_block[block] = ei->i_data[block];
3046
3047 if (ei->i_extra_isize)
3048 raw_inode->i_extra_isize = cpu_to_le16(ei->i_extra_isize);
3049
3050 BUFFER_TRACE(bh, "call ext3_journal_dirty_metadata");
3051 unlock_buffer(bh);
3052 rc = ext3_journal_dirty_metadata(handle, bh);
3053 if (!err)
3054 err = rc;
3055 ei->i_state &= ~EXT3_STATE_NEW;
3056
3057 atomic_set(&ei->i_sync_tid, handle->h_transaction->t_tid);
3058out_brelse:
3059 brelse (bh);
3060 ext3_std_error(inode->i_sb, err);
3061 return err;
3062}
3063
3064
3065
3066
3067
3068
3069
3070
3071
3072
3073
3074
3075
3076
3077
3078
3079
3080
3081
3082
3083
3084
3085
3086
3087
3088
3089
3090
3091
3092
3093
3094
3095
3096
3097
3098
3099int ext3_write_inode(struct inode *inode, int wait)
3100{
3101 if (current->flags & PF_MEMALLOC)
3102 return 0;
3103
3104 if (ext3_journal_current_handle()) {
3105 jbd_debug(1, "called recursively, non-PF_MEMALLOC!\n");
3106 dump_stack();
3107 return -EIO;
3108 }
3109
3110 if (!wait)
3111 return 0;
3112
3113 return ext3_force_commit(inode->i_sb);
3114}
3115
3116
3117
3118
3119
3120
3121
3122
3123
3124
3125
3126
3127
3128
3129
3130
3131
3132
3133int ext3_setattr(struct dentry *dentry, struct iattr *attr)
3134{
3135 struct inode *inode = dentry->d_inode;
3136 int error, rc = 0;
3137 const unsigned int ia_valid = attr->ia_valid;
3138
3139 error = inode_change_ok(inode, attr);
3140 if (error)
3141 return error;
3142
3143 if ((ia_valid & ATTR_UID && attr->ia_uid != inode->i_uid) ||
3144 (ia_valid & ATTR_GID && attr->ia_gid != inode->i_gid)) {
3145 handle_t *handle;
3146
3147
3148
3149 handle = ext3_journal_start(inode, EXT3_MAXQUOTAS_INIT_BLOCKS(inode->i_sb)+
3150 EXT3_MAXQUOTAS_DEL_BLOCKS(inode->i_sb)+3);
3151 if (IS_ERR(handle)) {
3152 error = PTR_ERR(handle);
3153 goto err_out;
3154 }
3155 error = vfs_dq_transfer(inode, attr) ? -EDQUOT : 0;
3156 if (error) {
3157 ext3_journal_stop(handle);
3158 return error;
3159 }
3160
3161
3162 if (attr->ia_valid & ATTR_UID)
3163 inode->i_uid = attr->ia_uid;
3164 if (attr->ia_valid & ATTR_GID)
3165 inode->i_gid = attr->ia_gid;
3166 error = ext3_mark_inode_dirty(handle, inode);
3167 ext3_journal_stop(handle);
3168 }
3169
3170 if (S_ISREG(inode->i_mode) &&
3171 attr->ia_valid & ATTR_SIZE && attr->ia_size < inode->i_size) {
3172 handle_t *handle;
3173
3174 handle = ext3_journal_start(inode, 3);
3175 if (IS_ERR(handle)) {
3176 error = PTR_ERR(handle);
3177 goto err_out;
3178 }
3179
3180 error = ext3_orphan_add(handle, inode);
3181 EXT3_I(inode)->i_disksize = attr->ia_size;
3182 rc = ext3_mark_inode_dirty(handle, inode);
3183 if (!error)
3184 error = rc;
3185 ext3_journal_stop(handle);
3186 }
3187
3188 rc = inode_setattr(inode, attr);
3189
3190 if (!rc && (ia_valid & ATTR_MODE))
3191 rc = ext3_acl_chmod(inode);
3192
3193err_out:
3194 ext3_std_error(inode->i_sb, error);
3195 if (!error)
3196 error = rc;
3197 return error;
3198}
3199
3200
3201
3202
3203
3204
3205
3206
3207
3208
3209
3210
3211
3212
3213
3214
3215
3216
3217
3218
3219
3220
3221
3222
3223
3224
3225
3226
3227
3228static int ext3_writepage_trans_blocks(struct inode *inode)
3229{
3230 int bpp = ext3_journal_blocks_per_page(inode);
3231 int indirects = (EXT3_NDIR_BLOCKS % bpp) ? 5 : 3;
3232 int ret;
3233
3234 if (ext3_should_journal_data(inode))
3235 ret = 3 * (bpp + indirects) + 2;
3236 else
3237 ret = 2 * (bpp + indirects) + 2;
3238
3239#ifdef CONFIG_QUOTA
3240
3241
3242 ret += EXT3_MAXQUOTAS_TRANS_BLOCKS(inode->i_sb);
3243#endif
3244
3245 return ret;
3246}
3247
3248
3249
3250
3251
3252int ext3_mark_iloc_dirty(handle_t *handle,
3253 struct inode *inode, struct ext3_iloc *iloc)
3254{
3255 int err = 0;
3256
3257
3258 get_bh(iloc->bh);
3259
3260
3261 err = ext3_do_update_inode(handle, inode, iloc);
3262 put_bh(iloc->bh);
3263 return err;
3264}
3265
3266
3267
3268
3269
3270
3271int
3272ext3_reserve_inode_write(handle_t *handle, struct inode *inode,
3273 struct ext3_iloc *iloc)
3274{
3275 int err = 0;
3276 if (handle) {
3277 err = ext3_get_inode_loc(inode, iloc);
3278 if (!err) {
3279 BUFFER_TRACE(iloc->bh, "get_write_access");
3280 err = ext3_journal_get_write_access(handle, iloc->bh);
3281 if (err) {
3282 brelse(iloc->bh);
3283 iloc->bh = NULL;
3284 }
3285 }
3286 }
3287 ext3_std_error(inode->i_sb, err);
3288 return err;
3289}
3290
3291
3292
3293
3294
3295
3296
3297
3298
3299
3300
3301
3302
3303
3304
3305
3306
3307
3308
3309
3310
3311
3312int ext3_mark_inode_dirty(handle_t *handle, struct inode *inode)
3313{
3314 struct ext3_iloc iloc;
3315 int err;
3316
3317 might_sleep();
3318 err = ext3_reserve_inode_write(handle, inode, &iloc);
3319 if (!err)
3320 err = ext3_mark_iloc_dirty(handle, inode, &iloc);
3321 return err;
3322}
3323
3324
3325
3326
3327
3328
3329
3330
3331
3332
3333
3334
3335
3336
3337
3338void ext3_dirty_inode(struct inode *inode)
3339{
3340 handle_t *current_handle = ext3_journal_current_handle();
3341 handle_t *handle;
3342
3343 handle = ext3_journal_start(inode, 2);
3344 if (IS_ERR(handle))
3345 goto out;
3346 if (current_handle &&
3347 current_handle->h_transaction != handle->h_transaction) {
3348
3349 printk(KERN_EMERG "%s: transactions do not match!\n",
3350 __func__);
3351 } else {
3352 jbd_debug(5, "marking dirty. outer handle=%p\n",
3353 current_handle);
3354 ext3_mark_inode_dirty(handle, inode);
3355 }
3356 ext3_journal_stop(handle);
3357out:
3358 return;
3359}
3360
3361#if 0
3362
3363
3364
3365
3366
3367
3368
3369static int ext3_pin_inode(handle_t *handle, struct inode *inode)
3370{
3371 struct ext3_iloc iloc;
3372
3373 int err = 0;
3374 if (handle) {
3375 err = ext3_get_inode_loc(inode, &iloc);
3376 if (!err) {
3377 BUFFER_TRACE(iloc.bh, "get_write_access");
3378 err = journal_get_write_access(handle, iloc.bh);
3379 if (!err)
3380 err = ext3_journal_dirty_metadata(handle,
3381 iloc.bh);
3382 brelse(iloc.bh);
3383 }
3384 }
3385 ext3_std_error(inode->i_sb, err);
3386 return err;
3387}
3388#endif
3389
3390int ext3_change_inode_journal_flag(struct inode *inode, int val)
3391{
3392 journal_t *journal;
3393 handle_t *handle;
3394 int err;
3395
3396
3397
3398
3399
3400
3401
3402
3403
3404
3405
3406 journal = EXT3_JOURNAL(inode);
3407 if (is_journal_aborted(journal))
3408 return -EROFS;
3409
3410 journal_lock_updates(journal);
3411 journal_flush(journal);
3412
3413
3414
3415
3416
3417
3418
3419
3420
3421 if (val)
3422 EXT3_I(inode)->i_flags |= EXT3_JOURNAL_DATA_FL;
3423 else
3424 EXT3_I(inode)->i_flags &= ~EXT3_JOURNAL_DATA_FL;
3425 ext3_set_aops(inode);
3426
3427 journal_unlock_updates(journal);
3428
3429
3430
3431 handle = ext3_journal_start(inode, 1);
3432 if (IS_ERR(handle))
3433 return PTR_ERR(handle);
3434
3435 err = ext3_mark_inode_dirty(handle, inode);
3436 handle->h_sync = 1;
3437 ext3_journal_stop(handle);
3438 ext3_std_error(inode->i_sb, err);
3439
3440 return err;
3441}
3442