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