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 .is_partially_uptodate = block_is_partially_uptodate,
1782};
1783
1784static const struct address_space_operations ext3_writeback_aops = {
1785 .readpage = ext3_readpage,
1786 .readpages = ext3_readpages,
1787 .writepage = ext3_writeback_writepage,
1788 .sync_page = block_sync_page,
1789 .write_begin = ext3_write_begin,
1790 .write_end = ext3_writeback_write_end,
1791 .bmap = ext3_bmap,
1792 .invalidatepage = ext3_invalidatepage,
1793 .releasepage = ext3_releasepage,
1794 .direct_IO = ext3_direct_IO,
1795 .migratepage = buffer_migrate_page,
1796 .is_partially_uptodate = block_is_partially_uptodate,
1797};
1798
1799static const struct address_space_operations ext3_journalled_aops = {
1800 .readpage = ext3_readpage,
1801 .readpages = ext3_readpages,
1802 .writepage = ext3_journalled_writepage,
1803 .sync_page = block_sync_page,
1804 .write_begin = ext3_write_begin,
1805 .write_end = ext3_journalled_write_end,
1806 .set_page_dirty = ext3_journalled_set_page_dirty,
1807 .bmap = ext3_bmap,
1808 .invalidatepage = ext3_invalidatepage,
1809 .releasepage = ext3_releasepage,
1810 .is_partially_uptodate = block_is_partially_uptodate,
1811};
1812
1813void ext3_set_aops(struct inode *inode)
1814{
1815 if (ext3_should_order_data(inode))
1816 inode->i_mapping->a_ops = &ext3_ordered_aops;
1817 else if (ext3_should_writeback_data(inode))
1818 inode->i_mapping->a_ops = &ext3_writeback_aops;
1819 else
1820 inode->i_mapping->a_ops = &ext3_journalled_aops;
1821}
1822
1823
1824
1825
1826
1827
1828
1829static int ext3_block_truncate_page(handle_t *handle, struct page *page,
1830 struct address_space *mapping, loff_t from)
1831{
1832 ext3_fsblk_t index = from >> PAGE_CACHE_SHIFT;
1833 unsigned offset = from & (PAGE_CACHE_SIZE-1);
1834 unsigned blocksize, iblock, length, pos;
1835 struct inode *inode = mapping->host;
1836 struct buffer_head *bh;
1837 int err = 0;
1838
1839 blocksize = inode->i_sb->s_blocksize;
1840 length = blocksize - (offset & (blocksize - 1));
1841 iblock = index << (PAGE_CACHE_SHIFT - inode->i_sb->s_blocksize_bits);
1842
1843
1844
1845
1846
1847 if (!page_has_buffers(page) && test_opt(inode->i_sb, NOBH) &&
1848 ext3_should_writeback_data(inode) && PageUptodate(page)) {
1849 zero_user(page, offset, length);
1850 set_page_dirty(page);
1851 goto unlock;
1852 }
1853
1854 if (!page_has_buffers(page))
1855 create_empty_buffers(page, blocksize, 0);
1856
1857
1858 bh = page_buffers(page);
1859 pos = blocksize;
1860 while (offset >= pos) {
1861 bh = bh->b_this_page;
1862 iblock++;
1863 pos += blocksize;
1864 }
1865
1866 err = 0;
1867 if (buffer_freed(bh)) {
1868 BUFFER_TRACE(bh, "freed: skip");
1869 goto unlock;
1870 }
1871
1872 if (!buffer_mapped(bh)) {
1873 BUFFER_TRACE(bh, "unmapped");
1874 ext3_get_block(inode, iblock, bh, 0);
1875
1876 if (!buffer_mapped(bh)) {
1877 BUFFER_TRACE(bh, "still unmapped");
1878 goto unlock;
1879 }
1880 }
1881
1882
1883 if (PageUptodate(page))
1884 set_buffer_uptodate(bh);
1885
1886 if (!buffer_uptodate(bh)) {
1887 err = -EIO;
1888 ll_rw_block(READ, 1, &bh);
1889 wait_on_buffer(bh);
1890
1891 if (!buffer_uptodate(bh))
1892 goto unlock;
1893 }
1894
1895 if (ext3_should_journal_data(inode)) {
1896 BUFFER_TRACE(bh, "get write access");
1897 err = ext3_journal_get_write_access(handle, bh);
1898 if (err)
1899 goto unlock;
1900 }
1901
1902 zero_user(page, offset, length);
1903 BUFFER_TRACE(bh, "zeroed end of block");
1904
1905 err = 0;
1906 if (ext3_should_journal_data(inode)) {
1907 err = ext3_journal_dirty_metadata(handle, bh);
1908 } else {
1909 if (ext3_should_order_data(inode))
1910 err = ext3_journal_dirty_data(handle, bh);
1911 mark_buffer_dirty(bh);
1912 }
1913
1914unlock:
1915 unlock_page(page);
1916 page_cache_release(page);
1917 return err;
1918}
1919
1920
1921
1922
1923
1924
1925static inline int all_zeroes(__le32 *p, __le32 *q)
1926{
1927 while (p < q)
1928 if (*p++)
1929 return 0;
1930 return 1;
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
1965
1966
1967
1968static Indirect *ext3_find_shared(struct inode *inode, int depth,
1969 int offsets[4], Indirect chain[4], __le32 *top)
1970{
1971 Indirect *partial, *p;
1972 int k, err;
1973
1974 *top = 0;
1975
1976 for (k = depth; k > 1 && !offsets[k-1]; k--)
1977 ;
1978 partial = ext3_get_branch(inode, k, offsets, chain, &err);
1979
1980 if (!partial)
1981 partial = chain + k-1;
1982
1983
1984
1985
1986 if (!partial->key && *partial->p)
1987
1988 goto no_top;
1989 for (p=partial; p>chain && all_zeroes((__le32*)p->bh->b_data,p->p); p--)
1990 ;
1991
1992
1993
1994
1995
1996
1997 if (p == chain + k - 1 && p > chain) {
1998 p->p--;
1999 } else {
2000 *top = *p->p;
2001
2002#if 0
2003 *p->p = 0;
2004#endif
2005 }
2006
2007
2008 while(partial > p) {
2009 brelse(partial->bh);
2010 partial--;
2011 }
2012no_top:
2013 return partial;
2014}
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024static void ext3_clear_blocks(handle_t *handle, struct inode *inode,
2025 struct buffer_head *bh, ext3_fsblk_t block_to_free,
2026 unsigned long count, __le32 *first, __le32 *last)
2027{
2028 __le32 *p;
2029 if (try_to_extend_transaction(handle, inode)) {
2030 if (bh) {
2031 BUFFER_TRACE(bh, "call ext3_journal_dirty_metadata");
2032 ext3_journal_dirty_metadata(handle, bh);
2033 }
2034 ext3_mark_inode_dirty(handle, inode);
2035 ext3_journal_test_restart(handle, inode);
2036 if (bh) {
2037 BUFFER_TRACE(bh, "retaking write access");
2038 ext3_journal_get_write_access(handle, bh);
2039 }
2040 }
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050 for (p = first; p < last; p++) {
2051 u32 nr = le32_to_cpu(*p);
2052 if (nr) {
2053 struct buffer_head *bh;
2054
2055 *p = 0;
2056 bh = sb_find_get_block(inode->i_sb, nr);
2057 ext3_forget(handle, 0, inode, bh, nr);
2058 }
2059 }
2060
2061 ext3_free_blocks(handle, inode, block_to_free, count);
2062}
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083static void ext3_free_data(handle_t *handle, struct inode *inode,
2084 struct buffer_head *this_bh,
2085 __le32 *first, __le32 *last)
2086{
2087 ext3_fsblk_t block_to_free = 0;
2088 unsigned long count = 0;
2089 __le32 *block_to_free_p = NULL;
2090
2091
2092 ext3_fsblk_t nr;
2093 __le32 *p;
2094
2095 int err;
2096
2097 if (this_bh) {
2098 BUFFER_TRACE(this_bh, "get_write_access");
2099 err = ext3_journal_get_write_access(handle, this_bh);
2100
2101
2102 if (err)
2103 return;
2104 }
2105
2106 for (p = first; p < last; p++) {
2107 nr = le32_to_cpu(*p);
2108 if (nr) {
2109
2110 if (count == 0) {
2111 block_to_free = nr;
2112 block_to_free_p = p;
2113 count = 1;
2114 } else if (nr == block_to_free + count) {
2115 count++;
2116 } else {
2117 ext3_clear_blocks(handle, inode, this_bh,
2118 block_to_free,
2119 count, block_to_free_p, p);
2120 block_to_free = nr;
2121 block_to_free_p = p;
2122 count = 1;
2123 }
2124 }
2125 }
2126
2127 if (count > 0)
2128 ext3_clear_blocks(handle, inode, this_bh, block_to_free,
2129 count, block_to_free_p, p);
2130
2131 if (this_bh) {
2132 BUFFER_TRACE(this_bh, "call ext3_journal_dirty_metadata");
2133
2134
2135
2136
2137
2138
2139
2140 if (bh2jh(this_bh))
2141 ext3_journal_dirty_metadata(handle, this_bh);
2142 else
2143 ext3_error(inode->i_sb, "ext3_free_data",
2144 "circular indirect block detected, "
2145 "inode=%lu, block=%llu",
2146 inode->i_ino,
2147 (unsigned long long)this_bh->b_blocknr);
2148 }
2149}
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164static void ext3_free_branches(handle_t *handle, struct inode *inode,
2165 struct buffer_head *parent_bh,
2166 __le32 *first, __le32 *last, int depth)
2167{
2168 ext3_fsblk_t nr;
2169 __le32 *p;
2170
2171 if (is_handle_aborted(handle))
2172 return;
2173
2174 if (depth--) {
2175 struct buffer_head *bh;
2176 int addr_per_block = EXT3_ADDR_PER_BLOCK(inode->i_sb);
2177 p = last;
2178 while (--p >= first) {
2179 nr = le32_to_cpu(*p);
2180 if (!nr)
2181 continue;
2182
2183
2184 bh = sb_bread(inode->i_sb, nr);
2185
2186
2187
2188
2189
2190 if (!bh) {
2191 ext3_error(inode->i_sb, "ext3_free_branches",
2192 "Read failure, inode=%lu, block="E3FSBLK,
2193 inode->i_ino, nr);
2194 continue;
2195 }
2196
2197
2198 BUFFER_TRACE(bh, "free child branches");
2199 ext3_free_branches(handle, inode, bh,
2200 (__le32*)bh->b_data,
2201 (__le32*)bh->b_data + addr_per_block,
2202 depth);
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223 ext3_forget(handle, 1, inode, bh, bh->b_blocknr);
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241 if (is_handle_aborted(handle))
2242 return;
2243 if (try_to_extend_transaction(handle, inode)) {
2244 ext3_mark_inode_dirty(handle, inode);
2245 ext3_journal_test_restart(handle, inode);
2246 }
2247
2248 ext3_free_blocks(handle, inode, nr, 1);
2249
2250 if (parent_bh) {
2251
2252
2253
2254
2255 BUFFER_TRACE(parent_bh, "get_write_access");
2256 if (!ext3_journal_get_write_access(handle,
2257 parent_bh)){
2258 *p = 0;
2259 BUFFER_TRACE(parent_bh,
2260 "call ext3_journal_dirty_metadata");
2261 ext3_journal_dirty_metadata(handle,
2262 parent_bh);
2263 }
2264 }
2265 }
2266 } else {
2267
2268 BUFFER_TRACE(parent_bh, "free data blocks");
2269 ext3_free_data(handle, inode, parent_bh, first, last);
2270 }
2271}
2272
2273int ext3_can_truncate(struct inode *inode)
2274{
2275 if (IS_APPEND(inode) || IS_IMMUTABLE(inode))
2276 return 0;
2277 if (S_ISREG(inode->i_mode))
2278 return 1;
2279 if (S_ISDIR(inode->i_mode))
2280 return 1;
2281 if (S_ISLNK(inode->i_mode))
2282 return !ext3_inode_is_fast_symlink(inode);
2283 return 0;
2284}
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314void ext3_truncate(struct inode *inode)
2315{
2316 handle_t *handle;
2317 struct ext3_inode_info *ei = EXT3_I(inode);
2318 __le32 *i_data = ei->i_data;
2319 int addr_per_block = EXT3_ADDR_PER_BLOCK(inode->i_sb);
2320 struct address_space *mapping = inode->i_mapping;
2321 int offsets[4];
2322 Indirect chain[4];
2323 Indirect *partial;
2324 __le32 nr = 0;
2325 int n;
2326 long last_block;
2327 unsigned blocksize = inode->i_sb->s_blocksize;
2328 struct page *page;
2329
2330 if (!ext3_can_truncate(inode))
2331 return;
2332
2333
2334
2335
2336
2337 if ((inode->i_size & (blocksize - 1)) == 0) {
2338
2339 page = NULL;
2340 } else {
2341 page = grab_cache_page(mapping,
2342 inode->i_size >> PAGE_CACHE_SHIFT);
2343 if (!page)
2344 return;
2345 }
2346
2347 handle = start_transaction(inode);
2348 if (IS_ERR(handle)) {
2349 if (page) {
2350 clear_highpage(page);
2351 flush_dcache_page(page);
2352 unlock_page(page);
2353 page_cache_release(page);
2354 }
2355 return;
2356 }
2357
2358 last_block = (inode->i_size + blocksize-1)
2359 >> EXT3_BLOCK_SIZE_BITS(inode->i_sb);
2360
2361 if (page)
2362 ext3_block_truncate_page(handle, page, mapping, inode->i_size);
2363
2364 n = ext3_block_to_path(inode, last_block, offsets, NULL);
2365 if (n == 0)
2366 goto out_stop;
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377 if (ext3_orphan_add(handle, inode))
2378 goto out_stop;
2379
2380
2381
2382
2383
2384
2385
2386
2387 ei->i_disksize = inode->i_size;
2388
2389
2390
2391
2392
2393 mutex_lock(&ei->truncate_mutex);
2394
2395 if (n == 1) {
2396 ext3_free_data(handle, inode, NULL, i_data+offsets[0],
2397 i_data + EXT3_NDIR_BLOCKS);
2398 goto do_indirects;
2399 }
2400
2401 partial = ext3_find_shared(inode, n, offsets, chain, &nr);
2402
2403 if (nr) {
2404 if (partial == chain) {
2405
2406 ext3_free_branches(handle, inode, NULL,
2407 &nr, &nr+1, (chain+n-1) - partial);
2408 *partial->p = 0;
2409
2410
2411
2412
2413 } else {
2414
2415 BUFFER_TRACE(partial->bh, "get_write_access");
2416 ext3_free_branches(handle, inode, partial->bh,
2417 partial->p,
2418 partial->p+1, (chain+n-1) - partial);
2419 }
2420 }
2421
2422 while (partial > chain) {
2423 ext3_free_branches(handle, inode, partial->bh, partial->p + 1,
2424 (__le32*)partial->bh->b_data+addr_per_block,
2425 (chain+n-1) - partial);
2426 BUFFER_TRACE(partial->bh, "call brelse");
2427 brelse (partial->bh);
2428 partial--;
2429 }
2430do_indirects:
2431
2432 switch (offsets[0]) {
2433 default:
2434 nr = i_data[EXT3_IND_BLOCK];
2435 if (nr) {
2436 ext3_free_branches(handle, inode, NULL, &nr, &nr+1, 1);
2437 i_data[EXT3_IND_BLOCK] = 0;
2438 }
2439 case EXT3_IND_BLOCK:
2440 nr = i_data[EXT3_DIND_BLOCK];
2441 if (nr) {
2442 ext3_free_branches(handle, inode, NULL, &nr, &nr+1, 2);
2443 i_data[EXT3_DIND_BLOCK] = 0;
2444 }
2445 case EXT3_DIND_BLOCK:
2446 nr = i_data[EXT3_TIND_BLOCK];
2447 if (nr) {
2448 ext3_free_branches(handle, inode, NULL, &nr, &nr+1, 3);
2449 i_data[EXT3_TIND_BLOCK] = 0;
2450 }
2451 case EXT3_TIND_BLOCK:
2452 ;
2453 }
2454
2455 ext3_discard_reservation(inode);
2456
2457 mutex_unlock(&ei->truncate_mutex);
2458 inode->i_mtime = inode->i_ctime = CURRENT_TIME_SEC;
2459 ext3_mark_inode_dirty(handle, inode);
2460
2461
2462
2463
2464
2465 if (IS_SYNC(inode))
2466 handle->h_sync = 1;
2467out_stop:
2468
2469
2470
2471
2472
2473
2474
2475 if (inode->i_nlink)
2476 ext3_orphan_del(handle, inode);
2477
2478 ext3_journal_stop(handle);
2479}
2480
2481static ext3_fsblk_t ext3_get_inode_block(struct super_block *sb,
2482 unsigned long ino, struct ext3_iloc *iloc)
2483{
2484 unsigned long block_group;
2485 unsigned long offset;
2486 ext3_fsblk_t block;
2487 struct ext3_group_desc *gdp;
2488
2489 if (!ext3_valid_inum(sb, ino)) {
2490
2491
2492
2493
2494
2495 return 0;
2496 }
2497
2498 block_group = (ino - 1) / EXT3_INODES_PER_GROUP(sb);
2499 gdp = ext3_get_group_desc(sb, block_group, NULL);
2500 if (!gdp)
2501 return 0;
2502
2503
2504
2505 offset = ((ino - 1) % EXT3_INODES_PER_GROUP(sb)) *
2506 EXT3_INODE_SIZE(sb);
2507 block = le32_to_cpu(gdp->bg_inode_table) +
2508 (offset >> EXT3_BLOCK_SIZE_BITS(sb));
2509
2510 iloc->block_group = block_group;
2511 iloc->offset = offset & (EXT3_BLOCK_SIZE(sb) - 1);
2512 return block;
2513}
2514
2515
2516
2517
2518
2519
2520
2521static int __ext3_get_inode_loc(struct inode *inode,
2522 struct ext3_iloc *iloc, int in_mem)
2523{
2524 ext3_fsblk_t block;
2525 struct buffer_head *bh;
2526
2527 block = ext3_get_inode_block(inode->i_sb, inode->i_ino, iloc);
2528 if (!block)
2529 return -EIO;
2530
2531 bh = sb_getblk(inode->i_sb, block);
2532 if (!bh) {
2533 ext3_error (inode->i_sb, "ext3_get_inode_loc",
2534 "unable to read inode block - "
2535 "inode=%lu, block="E3FSBLK,
2536 inode->i_ino, block);
2537 return -EIO;
2538 }
2539 if (!buffer_uptodate(bh)) {
2540 lock_buffer(bh);
2541
2542
2543
2544
2545
2546
2547
2548 if (buffer_write_io_error(bh) && !buffer_uptodate(bh))
2549 set_buffer_uptodate(bh);
2550
2551 if (buffer_uptodate(bh)) {
2552
2553 unlock_buffer(bh);
2554 goto has_buffer;
2555 }
2556
2557
2558
2559
2560
2561
2562 if (in_mem) {
2563 struct buffer_head *bitmap_bh;
2564 struct ext3_group_desc *desc;
2565 int inodes_per_buffer;
2566 int inode_offset, i;
2567 int block_group;
2568 int start;
2569
2570 block_group = (inode->i_ino - 1) /
2571 EXT3_INODES_PER_GROUP(inode->i_sb);
2572 inodes_per_buffer = bh->b_size /
2573 EXT3_INODE_SIZE(inode->i_sb);
2574 inode_offset = ((inode->i_ino - 1) %
2575 EXT3_INODES_PER_GROUP(inode->i_sb));
2576 start = inode_offset & ~(inodes_per_buffer - 1);
2577
2578
2579 desc = ext3_get_group_desc(inode->i_sb,
2580 block_group, NULL);
2581 if (!desc)
2582 goto make_io;
2583
2584 bitmap_bh = sb_getblk(inode->i_sb,
2585 le32_to_cpu(desc->bg_inode_bitmap));
2586 if (!bitmap_bh)
2587 goto make_io;
2588
2589
2590
2591
2592
2593
2594 if (!buffer_uptodate(bitmap_bh)) {
2595 brelse(bitmap_bh);
2596 goto make_io;
2597 }
2598 for (i = start; i < start + inodes_per_buffer; i++) {
2599 if (i == inode_offset)
2600 continue;
2601 if (ext3_test_bit(i, bitmap_bh->b_data))
2602 break;
2603 }
2604 brelse(bitmap_bh);
2605 if (i == start + inodes_per_buffer) {
2606
2607 memset(bh->b_data, 0, bh->b_size);
2608 set_buffer_uptodate(bh);
2609 unlock_buffer(bh);
2610 goto has_buffer;
2611 }
2612 }
2613
2614make_io:
2615
2616
2617
2618
2619
2620 get_bh(bh);
2621 bh->b_end_io = end_buffer_read_sync;
2622 submit_bh(READ_META, bh);
2623 wait_on_buffer(bh);
2624 if (!buffer_uptodate(bh)) {
2625 ext3_error(inode->i_sb, "ext3_get_inode_loc",
2626 "unable to read inode block - "
2627 "inode=%lu, block="E3FSBLK,
2628 inode->i_ino, block);
2629 brelse(bh);
2630 return -EIO;
2631 }
2632 }
2633has_buffer:
2634 iloc->bh = bh;
2635 return 0;
2636}
2637
2638int ext3_get_inode_loc(struct inode *inode, struct ext3_iloc *iloc)
2639{
2640
2641 return __ext3_get_inode_loc(inode, iloc,
2642 !(EXT3_I(inode)->i_state & EXT3_STATE_XATTR));
2643}
2644
2645void ext3_set_inode_flags(struct inode *inode)
2646{
2647 unsigned int flags = EXT3_I(inode)->i_flags;
2648
2649 inode->i_flags &= ~(S_SYNC|S_APPEND|S_IMMUTABLE|S_NOATIME|S_DIRSYNC);
2650 if (flags & EXT3_SYNC_FL)
2651 inode->i_flags |= S_SYNC;
2652 if (flags & EXT3_APPEND_FL)
2653 inode->i_flags |= S_APPEND;
2654 if (flags & EXT3_IMMUTABLE_FL)
2655 inode->i_flags |= S_IMMUTABLE;
2656 if (flags & EXT3_NOATIME_FL)
2657 inode->i_flags |= S_NOATIME;
2658 if (flags & EXT3_DIRSYNC_FL)
2659 inode->i_flags |= S_DIRSYNC;
2660}
2661
2662
2663void ext3_get_inode_flags(struct ext3_inode_info *ei)
2664{
2665 unsigned int flags = ei->vfs_inode.i_flags;
2666
2667 ei->i_flags &= ~(EXT3_SYNC_FL|EXT3_APPEND_FL|
2668 EXT3_IMMUTABLE_FL|EXT3_NOATIME_FL|EXT3_DIRSYNC_FL);
2669 if (flags & S_SYNC)
2670 ei->i_flags |= EXT3_SYNC_FL;
2671 if (flags & S_APPEND)
2672 ei->i_flags |= EXT3_APPEND_FL;
2673 if (flags & S_IMMUTABLE)
2674 ei->i_flags |= EXT3_IMMUTABLE_FL;
2675 if (flags & S_NOATIME)
2676 ei->i_flags |= EXT3_NOATIME_FL;
2677 if (flags & S_DIRSYNC)
2678 ei->i_flags |= EXT3_DIRSYNC_FL;
2679}
2680
2681struct inode *ext3_iget(struct super_block *sb, unsigned long ino)
2682{
2683 struct ext3_iloc iloc;
2684 struct ext3_inode *raw_inode;
2685 struct ext3_inode_info *ei;
2686 struct buffer_head *bh;
2687 struct inode *inode;
2688 long ret;
2689 int block;
2690
2691 inode = iget_locked(sb, ino);
2692 if (!inode)
2693 return ERR_PTR(-ENOMEM);
2694 if (!(inode->i_state & I_NEW))
2695 return inode;
2696
2697 ei = EXT3_I(inode);
2698#ifdef CONFIG_EXT3_FS_POSIX_ACL
2699 ei->i_acl = EXT3_ACL_NOT_CACHED;
2700 ei->i_default_acl = EXT3_ACL_NOT_CACHED;
2701#endif
2702 ei->i_block_alloc_info = NULL;
2703
2704 ret = __ext3_get_inode_loc(inode, &iloc, 0);
2705 if (ret < 0)
2706 goto bad_inode;
2707 bh = iloc.bh;
2708 raw_inode = ext3_raw_inode(&iloc);
2709 inode->i_mode = le16_to_cpu(raw_inode->i_mode);
2710 inode->i_uid = (uid_t)le16_to_cpu(raw_inode->i_uid_low);
2711 inode->i_gid = (gid_t)le16_to_cpu(raw_inode->i_gid_low);
2712 if(!(test_opt (inode->i_sb, NO_UID32))) {
2713 inode->i_uid |= le16_to_cpu(raw_inode->i_uid_high) << 16;
2714 inode->i_gid |= le16_to_cpu(raw_inode->i_gid_high) << 16;
2715 }
2716 inode->i_nlink = le16_to_cpu(raw_inode->i_links_count);
2717 inode->i_size = le32_to_cpu(raw_inode->i_size);
2718 inode->i_atime.tv_sec = (signed)le32_to_cpu(raw_inode->i_atime);
2719 inode->i_ctime.tv_sec = (signed)le32_to_cpu(raw_inode->i_ctime);
2720 inode->i_mtime.tv_sec = (signed)le32_to_cpu(raw_inode->i_mtime);
2721 inode->i_atime.tv_nsec = inode->i_ctime.tv_nsec = inode->i_mtime.tv_nsec = 0;
2722
2723 ei->i_state = 0;
2724 ei->i_dir_start_lookup = 0;
2725 ei->i_dtime = le32_to_cpu(raw_inode->i_dtime);
2726
2727
2728
2729
2730
2731 if (inode->i_nlink == 0) {
2732 if (inode->i_mode == 0 ||
2733 !(EXT3_SB(inode->i_sb)->s_mount_state & EXT3_ORPHAN_FS)) {
2734
2735 brelse (bh);
2736 ret = -ESTALE;
2737 goto bad_inode;
2738 }
2739
2740
2741
2742
2743 }
2744 inode->i_blocks = le32_to_cpu(raw_inode->i_blocks);
2745 ei->i_flags = le32_to_cpu(raw_inode->i_flags);
2746#ifdef EXT3_FRAGMENTS
2747 ei->i_faddr = le32_to_cpu(raw_inode->i_faddr);
2748 ei->i_frag_no = raw_inode->i_frag;
2749 ei->i_frag_size = raw_inode->i_fsize;
2750#endif
2751 ei->i_file_acl = le32_to_cpu(raw_inode->i_file_acl);
2752 if (!S_ISREG(inode->i_mode)) {
2753 ei->i_dir_acl = le32_to_cpu(raw_inode->i_dir_acl);
2754 } else {
2755 inode->i_size |=
2756 ((__u64)le32_to_cpu(raw_inode->i_size_high)) << 32;
2757 }
2758 ei->i_disksize = inode->i_size;
2759 inode->i_generation = le32_to_cpu(raw_inode->i_generation);
2760 ei->i_block_group = iloc.block_group;
2761
2762
2763
2764
2765 for (block = 0; block < EXT3_N_BLOCKS; block++)
2766 ei->i_data[block] = raw_inode->i_block[block];
2767 INIT_LIST_HEAD(&ei->i_orphan);
2768
2769 if (inode->i_ino >= EXT3_FIRST_INO(inode->i_sb) + 1 &&
2770 EXT3_INODE_SIZE(inode->i_sb) > EXT3_GOOD_OLD_INODE_SIZE) {
2771
2772
2773
2774
2775
2776 ei->i_extra_isize = le16_to_cpu(raw_inode->i_extra_isize);
2777 if (EXT3_GOOD_OLD_INODE_SIZE + ei->i_extra_isize >
2778 EXT3_INODE_SIZE(inode->i_sb)) {
2779 brelse (bh);
2780 ret = -EIO;
2781 goto bad_inode;
2782 }
2783 if (ei->i_extra_isize == 0) {
2784
2785 ei->i_extra_isize = sizeof(struct ext3_inode) -
2786 EXT3_GOOD_OLD_INODE_SIZE;
2787 } else {
2788 __le32 *magic = (void *)raw_inode +
2789 EXT3_GOOD_OLD_INODE_SIZE +
2790 ei->i_extra_isize;
2791 if (*magic == cpu_to_le32(EXT3_XATTR_MAGIC))
2792 ei->i_state |= EXT3_STATE_XATTR;
2793 }
2794 } else
2795 ei->i_extra_isize = 0;
2796
2797 if (S_ISREG(inode->i_mode)) {
2798 inode->i_op = &ext3_file_inode_operations;
2799 inode->i_fop = &ext3_file_operations;
2800 ext3_set_aops(inode);
2801 } else if (S_ISDIR(inode->i_mode)) {
2802 inode->i_op = &ext3_dir_inode_operations;
2803 inode->i_fop = &ext3_dir_operations;
2804 } else if (S_ISLNK(inode->i_mode)) {
2805 if (ext3_inode_is_fast_symlink(inode))
2806 inode->i_op = &ext3_fast_symlink_inode_operations;
2807 else {
2808 inode->i_op = &ext3_symlink_inode_operations;
2809 ext3_set_aops(inode);
2810 }
2811 } else {
2812 inode->i_op = &ext3_special_inode_operations;
2813 if (raw_inode->i_block[0])
2814 init_special_inode(inode, inode->i_mode,
2815 old_decode_dev(le32_to_cpu(raw_inode->i_block[0])));
2816 else
2817 init_special_inode(inode, inode->i_mode,
2818 new_decode_dev(le32_to_cpu(raw_inode->i_block[1])));
2819 }
2820 brelse (iloc.bh);
2821 ext3_set_inode_flags(inode);
2822 unlock_new_inode(inode);
2823 return inode;
2824
2825bad_inode:
2826 iget_failed(inode);
2827 return ERR_PTR(ret);
2828}
2829
2830
2831
2832
2833
2834
2835
2836
2837static int ext3_do_update_inode(handle_t *handle,
2838 struct inode *inode,
2839 struct ext3_iloc *iloc)
2840{
2841 struct ext3_inode *raw_inode = ext3_raw_inode(iloc);
2842 struct ext3_inode_info *ei = EXT3_I(inode);
2843 struct buffer_head *bh = iloc->bh;
2844 int err = 0, rc, block;
2845
2846
2847
2848 if (ei->i_state & EXT3_STATE_NEW)
2849 memset(raw_inode, 0, EXT3_SB(inode->i_sb)->s_inode_size);
2850
2851 ext3_get_inode_flags(ei);
2852 raw_inode->i_mode = cpu_to_le16(inode->i_mode);
2853 if(!(test_opt(inode->i_sb, NO_UID32))) {
2854 raw_inode->i_uid_low = cpu_to_le16(low_16_bits(inode->i_uid));
2855 raw_inode->i_gid_low = cpu_to_le16(low_16_bits(inode->i_gid));
2856
2857
2858
2859
2860 if(!ei->i_dtime) {
2861 raw_inode->i_uid_high =
2862 cpu_to_le16(high_16_bits(inode->i_uid));
2863 raw_inode->i_gid_high =
2864 cpu_to_le16(high_16_bits(inode->i_gid));
2865 } else {
2866 raw_inode->i_uid_high = 0;
2867 raw_inode->i_gid_high = 0;
2868 }
2869 } else {
2870 raw_inode->i_uid_low =
2871 cpu_to_le16(fs_high2lowuid(inode->i_uid));
2872 raw_inode->i_gid_low =
2873 cpu_to_le16(fs_high2lowgid(inode->i_gid));
2874 raw_inode->i_uid_high = 0;
2875 raw_inode->i_gid_high = 0;
2876 }
2877 raw_inode->i_links_count = cpu_to_le16(inode->i_nlink);
2878 raw_inode->i_size = cpu_to_le32(ei->i_disksize);
2879 raw_inode->i_atime = cpu_to_le32(inode->i_atime.tv_sec);
2880 raw_inode->i_ctime = cpu_to_le32(inode->i_ctime.tv_sec);
2881 raw_inode->i_mtime = cpu_to_le32(inode->i_mtime.tv_sec);
2882 raw_inode->i_blocks = cpu_to_le32(inode->i_blocks);
2883 raw_inode->i_dtime = cpu_to_le32(ei->i_dtime);
2884 raw_inode->i_flags = cpu_to_le32(ei->i_flags);
2885#ifdef EXT3_FRAGMENTS
2886 raw_inode->i_faddr = cpu_to_le32(ei->i_faddr);
2887 raw_inode->i_frag = ei->i_frag_no;
2888 raw_inode->i_fsize = ei->i_frag_size;
2889#endif
2890 raw_inode->i_file_acl = cpu_to_le32(ei->i_file_acl);
2891 if (!S_ISREG(inode->i_mode)) {
2892 raw_inode->i_dir_acl = cpu_to_le32(ei->i_dir_acl);
2893 } else {
2894 raw_inode->i_size_high =
2895 cpu_to_le32(ei->i_disksize >> 32);
2896 if (ei->i_disksize > 0x7fffffffULL) {
2897 struct super_block *sb = inode->i_sb;
2898 if (!EXT3_HAS_RO_COMPAT_FEATURE(sb,
2899 EXT3_FEATURE_RO_COMPAT_LARGE_FILE) ||
2900 EXT3_SB(sb)->s_es->s_rev_level ==
2901 cpu_to_le32(EXT3_GOOD_OLD_REV)) {
2902
2903
2904
2905 err = ext3_journal_get_write_access(handle,
2906 EXT3_SB(sb)->s_sbh);
2907 if (err)
2908 goto out_brelse;
2909 ext3_update_dynamic_rev(sb);
2910 EXT3_SET_RO_COMPAT_FEATURE(sb,
2911 EXT3_FEATURE_RO_COMPAT_LARGE_FILE);
2912 sb->s_dirt = 1;
2913 handle->h_sync = 1;
2914 err = ext3_journal_dirty_metadata(handle,
2915 EXT3_SB(sb)->s_sbh);
2916 }
2917 }
2918 }
2919 raw_inode->i_generation = cpu_to_le32(inode->i_generation);
2920 if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode)) {
2921 if (old_valid_dev(inode->i_rdev)) {
2922 raw_inode->i_block[0] =
2923 cpu_to_le32(old_encode_dev(inode->i_rdev));
2924 raw_inode->i_block[1] = 0;
2925 } else {
2926 raw_inode->i_block[0] = 0;
2927 raw_inode->i_block[1] =
2928 cpu_to_le32(new_encode_dev(inode->i_rdev));
2929 raw_inode->i_block[2] = 0;
2930 }
2931 } else for (block = 0; block < EXT3_N_BLOCKS; block++)
2932 raw_inode->i_block[block] = ei->i_data[block];
2933
2934 if (ei->i_extra_isize)
2935 raw_inode->i_extra_isize = cpu_to_le16(ei->i_extra_isize);
2936
2937 BUFFER_TRACE(bh, "call ext3_journal_dirty_metadata");
2938 rc = ext3_journal_dirty_metadata(handle, bh);
2939 if (!err)
2940 err = rc;
2941 ei->i_state &= ~EXT3_STATE_NEW;
2942
2943out_brelse:
2944 brelse (bh);
2945 ext3_std_error(inode->i_sb, err);
2946 return err;
2947}
2948
2949
2950
2951
2952
2953
2954
2955
2956
2957
2958
2959
2960
2961
2962
2963
2964
2965
2966
2967
2968
2969
2970
2971
2972
2973
2974
2975
2976
2977
2978
2979
2980
2981
2982
2983
2984int ext3_write_inode(struct inode *inode, int wait)
2985{
2986 if (current->flags & PF_MEMALLOC)
2987 return 0;
2988
2989 if (ext3_journal_current_handle()) {
2990 jbd_debug(1, "called recursively, non-PF_MEMALLOC!\n");
2991 dump_stack();
2992 return -EIO;
2993 }
2994
2995 if (!wait)
2996 return 0;
2997
2998 return ext3_force_commit(inode->i_sb);
2999}
3000
3001
3002
3003
3004
3005
3006
3007
3008
3009
3010
3011
3012
3013
3014
3015
3016
3017
3018int ext3_setattr(struct dentry *dentry, struct iattr *attr)
3019{
3020 struct inode *inode = dentry->d_inode;
3021 int error, rc = 0;
3022 const unsigned int ia_valid = attr->ia_valid;
3023
3024 error = inode_change_ok(inode, attr);
3025 if (error)
3026 return error;
3027
3028 if ((ia_valid & ATTR_UID && attr->ia_uid != inode->i_uid) ||
3029 (ia_valid & ATTR_GID && attr->ia_gid != inode->i_gid)) {
3030 handle_t *handle;
3031
3032
3033
3034 handle = ext3_journal_start(inode, 2*(EXT3_QUOTA_INIT_BLOCKS(inode->i_sb)+
3035 EXT3_QUOTA_DEL_BLOCKS(inode->i_sb))+3);
3036 if (IS_ERR(handle)) {
3037 error = PTR_ERR(handle);
3038 goto err_out;
3039 }
3040 error = DQUOT_TRANSFER(inode, attr) ? -EDQUOT : 0;
3041 if (error) {
3042 ext3_journal_stop(handle);
3043 return error;
3044 }
3045
3046
3047 if (attr->ia_valid & ATTR_UID)
3048 inode->i_uid = attr->ia_uid;
3049 if (attr->ia_valid & ATTR_GID)
3050 inode->i_gid = attr->ia_gid;
3051 error = ext3_mark_inode_dirty(handle, inode);
3052 ext3_journal_stop(handle);
3053 }
3054
3055 if (S_ISREG(inode->i_mode) &&
3056 attr->ia_valid & ATTR_SIZE && attr->ia_size < inode->i_size) {
3057 handle_t *handle;
3058
3059 handle = ext3_journal_start(inode, 3);
3060 if (IS_ERR(handle)) {
3061 error = PTR_ERR(handle);
3062 goto err_out;
3063 }
3064
3065 error = ext3_orphan_add(handle, inode);
3066 EXT3_I(inode)->i_disksize = attr->ia_size;
3067 rc = ext3_mark_inode_dirty(handle, inode);
3068 if (!error)
3069 error = rc;
3070 ext3_journal_stop(handle);
3071 }
3072
3073 rc = inode_setattr(inode, attr);
3074
3075
3076
3077
3078 if (inode->i_nlink)
3079 ext3_orphan_del(NULL, inode);
3080
3081 if (!rc && (ia_valid & ATTR_MODE))
3082 rc = ext3_acl_chmod(inode);
3083
3084err_out:
3085 ext3_std_error(inode->i_sb, error);
3086 if (!error)
3087 error = rc;
3088 return error;
3089}
3090
3091
3092
3093
3094
3095
3096
3097
3098
3099
3100
3101
3102
3103
3104
3105
3106
3107
3108
3109
3110
3111
3112
3113
3114
3115
3116
3117
3118
3119static int ext3_writepage_trans_blocks(struct inode *inode)
3120{
3121 int bpp = ext3_journal_blocks_per_page(inode);
3122 int indirects = (EXT3_NDIR_BLOCKS % bpp) ? 5 : 3;
3123 int ret;
3124
3125 if (ext3_should_journal_data(inode))
3126 ret = 3 * (bpp + indirects) + 2;
3127 else
3128 ret = 2 * (bpp + indirects) + 2;
3129
3130#ifdef CONFIG_QUOTA
3131
3132
3133 ret += 2*EXT3_QUOTA_TRANS_BLOCKS(inode->i_sb);
3134#endif
3135
3136 return ret;
3137}
3138
3139
3140
3141
3142
3143int ext3_mark_iloc_dirty(handle_t *handle,
3144 struct inode *inode, struct ext3_iloc *iloc)
3145{
3146 int err = 0;
3147
3148
3149 get_bh(iloc->bh);
3150
3151
3152 err = ext3_do_update_inode(handle, inode, iloc);
3153 put_bh(iloc->bh);
3154 return err;
3155}
3156
3157
3158
3159
3160
3161
3162int
3163ext3_reserve_inode_write(handle_t *handle, struct inode *inode,
3164 struct ext3_iloc *iloc)
3165{
3166 int err = 0;
3167 if (handle) {
3168 err = ext3_get_inode_loc(inode, iloc);
3169 if (!err) {
3170 BUFFER_TRACE(iloc->bh, "get_write_access");
3171 err = ext3_journal_get_write_access(handle, iloc->bh);
3172 if (err) {
3173 brelse(iloc->bh);
3174 iloc->bh = NULL;
3175 }
3176 }
3177 }
3178 ext3_std_error(inode->i_sb, err);
3179 return err;
3180}
3181
3182
3183
3184
3185
3186
3187
3188
3189
3190
3191
3192
3193
3194
3195
3196
3197
3198
3199
3200
3201
3202
3203int ext3_mark_inode_dirty(handle_t *handle, struct inode *inode)
3204{
3205 struct ext3_iloc iloc;
3206 int err;
3207
3208 might_sleep();
3209 err = ext3_reserve_inode_write(handle, inode, &iloc);
3210 if (!err)
3211 err = ext3_mark_iloc_dirty(handle, inode, &iloc);
3212 return err;
3213}
3214
3215
3216
3217
3218
3219
3220
3221
3222
3223
3224
3225
3226
3227
3228
3229void ext3_dirty_inode(struct inode *inode)
3230{
3231 handle_t *current_handle = ext3_journal_current_handle();
3232 handle_t *handle;
3233
3234 handle = ext3_journal_start(inode, 2);
3235 if (IS_ERR(handle))
3236 goto out;
3237 if (current_handle &&
3238 current_handle->h_transaction != handle->h_transaction) {
3239
3240 printk(KERN_EMERG "%s: transactions do not match!\n",
3241 __func__);
3242 } else {
3243 jbd_debug(5, "marking dirty. outer handle=%p\n",
3244 current_handle);
3245 ext3_mark_inode_dirty(handle, inode);
3246 }
3247 ext3_journal_stop(handle);
3248out:
3249 return;
3250}
3251
3252#if 0
3253
3254
3255
3256
3257
3258
3259
3260static int ext3_pin_inode(handle_t *handle, struct inode *inode)
3261{
3262 struct ext3_iloc iloc;
3263
3264 int err = 0;
3265 if (handle) {
3266 err = ext3_get_inode_loc(inode, &iloc);
3267 if (!err) {
3268 BUFFER_TRACE(iloc.bh, "get_write_access");
3269 err = journal_get_write_access(handle, iloc.bh);
3270 if (!err)
3271 err = ext3_journal_dirty_metadata(handle,
3272 iloc.bh);
3273 brelse(iloc.bh);
3274 }
3275 }
3276 ext3_std_error(inode->i_sb, err);
3277 return err;
3278}
3279#endif
3280
3281int ext3_change_inode_journal_flag(struct inode *inode, int val)
3282{
3283 journal_t *journal;
3284 handle_t *handle;
3285 int err;
3286
3287
3288
3289
3290
3291
3292
3293
3294
3295
3296
3297 journal = EXT3_JOURNAL(inode);
3298 if (is_journal_aborted(journal))
3299 return -EROFS;
3300
3301 journal_lock_updates(journal);
3302 journal_flush(journal);
3303
3304
3305
3306
3307
3308
3309
3310
3311
3312 if (val)
3313 EXT3_I(inode)->i_flags |= EXT3_JOURNAL_DATA_FL;
3314 else
3315 EXT3_I(inode)->i_flags &= ~EXT3_JOURNAL_DATA_FL;
3316 ext3_set_aops(inode);
3317
3318 journal_unlock_updates(journal);
3319
3320
3321
3322 handle = ext3_journal_start(inode, 1);
3323 if (IS_ERR(handle))
3324 return PTR_ERR(handle);
3325
3326 err = ext3_mark_inode_dirty(handle, inode);
3327 handle->h_sync = 1;
3328 ext3_journal_stop(handle);
3329 ext3_std_error(inode->i_sb, err);
3330
3331 return err;
3332}
3333