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