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