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/time.h>
26#include <linux/highuid.h>
27#include <linux/pagemap.h>
28#include <linux/dax.h>
29#include <linux/blkdev.h>
30#include <linux/quotaops.h>
31#include <linux/writeback.h>
32#include <linux/buffer_head.h>
33#include <linux/mpage.h>
34#include <linux/fiemap.h>
35#include <linux/iomap.h>
36#include <linux/namei.h>
37#include <linux/uio.h>
38#include "ext2.h"
39#include "acl.h"
40#include "xattr.h"
41
42static int __ext2_write_inode(struct inode *inode, int do_sync);
43
44
45
46
47static inline int ext2_inode_is_fast_symlink(struct inode *inode)
48{
49 int ea_blocks = EXT2_I(inode)->i_file_acl ?
50 (inode->i_sb->s_blocksize >> 9) : 0;
51
52 return (S_ISLNK(inode->i_mode) &&
53 inode->i_blocks - ea_blocks == 0);
54}
55
56static void ext2_truncate_blocks(struct inode *inode, loff_t offset);
57
58static void ext2_write_failed(struct address_space *mapping, loff_t to)
59{
60 struct inode *inode = mapping->host;
61
62 if (to > inode->i_size) {
63 truncate_pagecache(inode, inode->i_size);
64 ext2_truncate_blocks(inode, inode->i_size);
65 }
66}
67
68
69
70
71void ext2_evict_inode(struct inode * inode)
72{
73 struct ext2_block_alloc_info *rsv;
74 int want_delete = 0;
75
76 if (!inode->i_nlink && !is_bad_inode(inode)) {
77 want_delete = 1;
78 dquot_initialize(inode);
79 } else {
80 dquot_drop(inode);
81 }
82
83 truncate_inode_pages_final(&inode->i_data);
84
85 if (want_delete) {
86 sb_start_intwrite(inode->i_sb);
87
88 EXT2_I(inode)->i_dtime = get_seconds();
89 mark_inode_dirty(inode);
90 __ext2_write_inode(inode, inode_needs_sync(inode));
91
92 inode->i_size = 0;
93 if (inode->i_blocks)
94 ext2_truncate_blocks(inode, 0);
95 ext2_xattr_delete_inode(inode);
96 }
97
98 invalidate_inode_buffers(inode);
99 clear_inode(inode);
100
101 ext2_discard_reservation(inode);
102 rsv = EXT2_I(inode)->i_block_alloc_info;
103 EXT2_I(inode)->i_block_alloc_info = NULL;
104 if (unlikely(rsv))
105 kfree(rsv);
106
107 if (want_delete) {
108 ext2_free_inode(inode);
109 sb_end_intwrite(inode->i_sb);
110 }
111}
112
113typedef struct {
114 __le32 *p;
115 __le32 key;
116 struct buffer_head *bh;
117} Indirect;
118
119static inline void add_chain(Indirect *p, struct buffer_head *bh, __le32 *v)
120{
121 p->key = *(p->p = v);
122 p->bh = bh;
123}
124
125static inline int verify_chain(Indirect *from, Indirect *to)
126{
127 while (from <= to && from->key == *from->p)
128 from++;
129 return (from > to);
130}
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162static int ext2_block_to_path(struct inode *inode,
163 long i_block, int offsets[4], int *boundary)
164{
165 int ptrs = EXT2_ADDR_PER_BLOCK(inode->i_sb);
166 int ptrs_bits = EXT2_ADDR_PER_BLOCK_BITS(inode->i_sb);
167 const long direct_blocks = EXT2_NDIR_BLOCKS,
168 indirect_blocks = ptrs,
169 double_blocks = (1 << (ptrs_bits * 2));
170 int n = 0;
171 int final = 0;
172
173 if (i_block < 0) {
174 ext2_msg(inode->i_sb, KERN_WARNING,
175 "warning: %s: block < 0", __func__);
176 } else if (i_block < direct_blocks) {
177 offsets[n++] = i_block;
178 final = direct_blocks;
179 } else if ( (i_block -= direct_blocks) < indirect_blocks) {
180 offsets[n++] = EXT2_IND_BLOCK;
181 offsets[n++] = i_block;
182 final = ptrs;
183 } else if ((i_block -= indirect_blocks) < double_blocks) {
184 offsets[n++] = EXT2_DIND_BLOCK;
185 offsets[n++] = i_block >> ptrs_bits;
186 offsets[n++] = i_block & (ptrs - 1);
187 final = ptrs;
188 } else if (((i_block -= double_blocks) >> (ptrs_bits * 2)) < ptrs) {
189 offsets[n++] = EXT2_TIND_BLOCK;
190 offsets[n++] = i_block >> (ptrs_bits * 2);
191 offsets[n++] = (i_block >> ptrs_bits) & (ptrs - 1);
192 offsets[n++] = i_block & (ptrs - 1);
193 final = ptrs;
194 } else {
195 ext2_msg(inode->i_sb, KERN_WARNING,
196 "warning: %s: block is too big", __func__);
197 }
198 if (boundary)
199 *boundary = final - 1 - (i_block & (ptrs - 1));
200
201 return n;
202}
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233static Indirect *ext2_get_branch(struct inode *inode,
234 int depth,
235 int *offsets,
236 Indirect chain[4],
237 int *err)
238{
239 struct super_block *sb = inode->i_sb;
240 Indirect *p = chain;
241 struct buffer_head *bh;
242
243 *err = 0;
244
245 add_chain (chain, NULL, EXT2_I(inode)->i_data + *offsets);
246 if (!p->key)
247 goto no_block;
248 while (--depth) {
249 bh = sb_bread(sb, le32_to_cpu(p->key));
250 if (!bh)
251 goto failure;
252 read_lock(&EXT2_I(inode)->i_meta_lock);
253 if (!verify_chain(chain, p))
254 goto changed;
255 add_chain(++p, bh, (__le32*)bh->b_data + *++offsets);
256 read_unlock(&EXT2_I(inode)->i_meta_lock);
257 if (!p->key)
258 goto no_block;
259 }
260 return NULL;
261
262changed:
263 read_unlock(&EXT2_I(inode)->i_meta_lock);
264 brelse(bh);
265 *err = -EAGAIN;
266 goto no_block;
267failure:
268 *err = -EIO;
269no_block:
270 return p;
271}
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293static ext2_fsblk_t ext2_find_near(struct inode *inode, Indirect *ind)
294{
295 struct ext2_inode_info *ei = EXT2_I(inode);
296 __le32 *start = ind->bh ? (__le32 *) ind->bh->b_data : ei->i_data;
297 __le32 *p;
298 ext2_fsblk_t bg_start;
299 ext2_fsblk_t colour;
300
301
302 for (p = ind->p - 1; p >= start; p--)
303 if (*p)
304 return le32_to_cpu(*p);
305
306
307 if (ind->bh)
308 return ind->bh->b_blocknr;
309
310
311
312
313
314 bg_start = ext2_group_first_block_no(inode->i_sb, ei->i_block_group);
315 colour = (current->pid % 16) *
316 (EXT2_BLOCKS_PER_GROUP(inode->i_sb) / 16);
317 return bg_start + colour;
318}
319
320
321
322
323
324
325
326
327
328
329static inline ext2_fsblk_t ext2_find_goal(struct inode *inode, long block,
330 Indirect *partial)
331{
332 struct ext2_block_alloc_info *block_i;
333
334 block_i = EXT2_I(inode)->i_block_alloc_info;
335
336
337
338
339
340 if (block_i && (block == block_i->last_alloc_logical_block + 1)
341 && (block_i->last_alloc_physical_block != 0)) {
342 return block_i->last_alloc_physical_block + 1;
343 }
344
345 return ext2_find_near(inode, partial);
346}
347
348
349
350
351
352
353
354
355
356
357
358
359
360static int
361ext2_blks_to_allocate(Indirect * branch, int k, unsigned long blks,
362 int blocks_to_boundary)
363{
364 unsigned long count = 0;
365
366
367
368
369
370 if (k > 0) {
371
372 if (blks < blocks_to_boundary + 1)
373 count += blks;
374 else
375 count += blocks_to_boundary + 1;
376 return count;
377 }
378
379 count++;
380 while (count < blks && count <= blocks_to_boundary
381 && le32_to_cpu(*(branch[0].p + count)) == 0) {
382 count++;
383 }
384 return count;
385}
386
387
388
389
390
391
392
393
394
395
396
397static int ext2_alloc_blocks(struct inode *inode,
398 ext2_fsblk_t goal, int indirect_blks, int blks,
399 ext2_fsblk_t new_blocks[4], int *err)
400{
401 int target, i;
402 unsigned long count = 0;
403 int index = 0;
404 ext2_fsblk_t current_block = 0;
405 int ret = 0;
406
407
408
409
410
411
412
413
414
415 target = blks + indirect_blks;
416
417 while (1) {
418 count = target;
419
420 current_block = ext2_new_blocks(inode,goal,&count,err);
421 if (*err)
422 goto failed_out;
423
424 target -= count;
425
426 while (index < indirect_blks && count) {
427 new_blocks[index++] = current_block++;
428 count--;
429 }
430
431 if (count > 0)
432 break;
433 }
434
435
436 new_blocks[index] = current_block;
437
438
439 ret = count;
440 *err = 0;
441 return ret;
442failed_out:
443 for (i = 0; i <index; i++)
444 ext2_free_blocks(inode, new_blocks[i], 1);
445 if (index)
446 mark_inode_dirty(inode);
447 return ret;
448}
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475static int ext2_alloc_branch(struct inode *inode,
476 int indirect_blks, int *blks, ext2_fsblk_t goal,
477 int *offsets, Indirect *branch)
478{
479 int blocksize = inode->i_sb->s_blocksize;
480 int i, n = 0;
481 int err = 0;
482 struct buffer_head *bh;
483 int num;
484 ext2_fsblk_t new_blocks[4];
485 ext2_fsblk_t current_block;
486
487 num = ext2_alloc_blocks(inode, goal, indirect_blks,
488 *blks, new_blocks, &err);
489 if (err)
490 return err;
491
492 branch[0].key = cpu_to_le32(new_blocks[0]);
493
494
495
496 for (n = 1; n <= indirect_blks; n++) {
497
498
499
500
501
502 bh = sb_getblk(inode->i_sb, new_blocks[n-1]);
503 if (unlikely(!bh)) {
504 err = -ENOMEM;
505 goto failed;
506 }
507 branch[n].bh = bh;
508 lock_buffer(bh);
509 memset(bh->b_data, 0, blocksize);
510 branch[n].p = (__le32 *) bh->b_data + offsets[n];
511 branch[n].key = cpu_to_le32(new_blocks[n]);
512 *branch[n].p = branch[n].key;
513 if ( n == indirect_blks) {
514 current_block = new_blocks[n];
515
516
517
518
519
520 for (i=1; i < num; i++)
521 *(branch[n].p + i) = cpu_to_le32(++current_block);
522 }
523 set_buffer_uptodate(bh);
524 unlock_buffer(bh);
525 mark_buffer_dirty_inode(bh, inode);
526
527
528
529
530 if (S_ISDIR(inode->i_mode) && IS_DIRSYNC(inode))
531 sync_dirty_buffer(bh);
532 }
533 *blks = num;
534 return err;
535
536failed:
537 for (i = 1; i < n; i++)
538 bforget(branch[i].bh);
539 for (i = 0; i < indirect_blks; i++)
540 ext2_free_blocks(inode, new_blocks[i], 1);
541 ext2_free_blocks(inode, new_blocks[i], num);
542 return err;
543}
544
545
546
547
548
549
550
551
552
553
554
555
556
557static void ext2_splice_branch(struct inode *inode,
558 long block, Indirect *where, int num, int blks)
559{
560 int i;
561 struct ext2_block_alloc_info *block_i;
562 ext2_fsblk_t current_block;
563
564 block_i = EXT2_I(inode)->i_block_alloc_info;
565
566
567
568
569 *where->p = where->key;
570
571
572
573
574
575 if (num == 0 && blks > 1) {
576 current_block = le32_to_cpu(where->key) + 1;
577 for (i = 1; i < blks; i++)
578 *(where->p + i ) = cpu_to_le32(current_block++);
579 }
580
581
582
583
584
585
586 if (block_i) {
587 block_i->last_alloc_logical_block = block + blks - 1;
588 block_i->last_alloc_physical_block =
589 le32_to_cpu(where[num].key) + blks - 1;
590 }
591
592
593
594
595 if (where->bh)
596 mark_buffer_dirty_inode(where->bh, inode);
597
598 inode->i_ctime = current_time(inode);
599 mark_inode_dirty(inode);
600}
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620static int ext2_get_blocks(struct inode *inode,
621 sector_t iblock, unsigned long maxblocks,
622 u32 *bno, bool *new, bool *boundary,
623 int create)
624{
625 int err;
626 int offsets[4];
627 Indirect chain[4];
628 Indirect *partial;
629 ext2_fsblk_t goal;
630 int indirect_blks;
631 int blocks_to_boundary = 0;
632 int depth;
633 struct ext2_inode_info *ei = EXT2_I(inode);
634 int count = 0;
635 ext2_fsblk_t first_block = 0;
636
637 BUG_ON(maxblocks == 0);
638
639 depth = ext2_block_to_path(inode,iblock,offsets,&blocks_to_boundary);
640
641 if (depth == 0)
642 return -EIO;
643
644 partial = ext2_get_branch(inode, depth, offsets, chain, &err);
645
646 if (!partial) {
647 first_block = le32_to_cpu(chain[depth - 1].key);
648 count++;
649
650 while (count < maxblocks && count <= blocks_to_boundary) {
651 ext2_fsblk_t blk;
652
653 if (!verify_chain(chain, chain + depth - 1)) {
654
655
656
657
658
659
660 err = -EAGAIN;
661 count = 0;
662 break;
663 }
664 blk = le32_to_cpu(*(chain[depth-1].p + count));
665 if (blk == first_block + count)
666 count++;
667 else
668 break;
669 }
670 if (err != -EAGAIN)
671 goto got_it;
672 }
673
674
675 if (!create || err == -EIO)
676 goto cleanup;
677
678 mutex_lock(&ei->truncate_mutex);
679
680
681
682
683
684
685
686
687
688
689
690
691 if (err == -EAGAIN || !verify_chain(chain, partial)) {
692 while (partial > chain) {
693 brelse(partial->bh);
694 partial--;
695 }
696 partial = ext2_get_branch(inode, depth, offsets, chain, &err);
697 if (!partial) {
698 count++;
699 mutex_unlock(&ei->truncate_mutex);
700 if (err)
701 goto cleanup;
702 goto got_it;
703 }
704 }
705
706
707
708
709
710 if (S_ISREG(inode->i_mode) && (!ei->i_block_alloc_info))
711 ext2_init_block_alloc_info(inode);
712
713 goal = ext2_find_goal(inode, iblock, partial);
714
715
716 indirect_blks = (chain + depth) - partial - 1;
717
718
719
720
721 count = ext2_blks_to_allocate(partial, indirect_blks,
722 maxblocks, blocks_to_boundary);
723
724
725
726 err = ext2_alloc_branch(inode, indirect_blks, &count, goal,
727 offsets + (partial - chain), partial);
728
729 if (err) {
730 mutex_unlock(&ei->truncate_mutex);
731 goto cleanup;
732 }
733
734 if (IS_DAX(inode)) {
735
736
737
738
739 clean_bdev_aliases(inode->i_sb->s_bdev,
740 le32_to_cpu(chain[depth-1].key),
741 count);
742
743
744
745
746
747 err = sb_issue_zeroout(inode->i_sb,
748 le32_to_cpu(chain[depth-1].key), count,
749 GFP_NOFS);
750 if (err) {
751 mutex_unlock(&ei->truncate_mutex);
752 goto cleanup;
753 }
754 }
755 *new = true;
756
757 ext2_splice_branch(inode, iblock, partial, indirect_blks, count);
758 mutex_unlock(&ei->truncate_mutex);
759got_it:
760 if (count > blocks_to_boundary)
761 *boundary = true;
762 err = count;
763
764 partial = chain + depth - 1;
765cleanup:
766 while (partial > chain) {
767 brelse(partial->bh);
768 partial--;
769 }
770 if (err > 0)
771 *bno = le32_to_cpu(chain[depth-1].key);
772 return err;
773}
774
775int ext2_get_block(struct inode *inode, sector_t iblock,
776 struct buffer_head *bh_result, int create)
777{
778 unsigned max_blocks = bh_result->b_size >> inode->i_blkbits;
779 bool new = false, boundary = false;
780 u32 bno;
781 int ret;
782
783 ret = ext2_get_blocks(inode, iblock, max_blocks, &bno, &new, &boundary,
784 create);
785 if (ret <= 0)
786 return ret;
787
788 map_bh(bh_result, inode->i_sb, bno);
789 bh_result->b_size = (ret << inode->i_blkbits);
790 if (new)
791 set_buffer_new(bh_result);
792 if (boundary)
793 set_buffer_boundary(bh_result);
794 return 0;
795
796}
797
798#ifdef CONFIG_FS_DAX
799static int ext2_iomap_begin(struct inode *inode, loff_t offset, loff_t length,
800 unsigned flags, struct iomap *iomap)
801{
802 unsigned int blkbits = inode->i_blkbits;
803 unsigned long first_block = offset >> blkbits;
804 unsigned long max_blocks = (length + (1 << blkbits) - 1) >> blkbits;
805 bool new = false, boundary = false;
806 u32 bno;
807 int ret;
808
809 ret = ext2_get_blocks(inode, first_block, max_blocks,
810 &bno, &new, &boundary, flags & IOMAP_WRITE);
811 if (ret < 0)
812 return ret;
813
814 iomap->flags = 0;
815 iomap->bdev = inode->i_sb->s_bdev;
816 iomap->offset = (u64)first_block << blkbits;
817
818 if (ret == 0) {
819 iomap->type = IOMAP_HOLE;
820 iomap->blkno = IOMAP_NULL_BLOCK;
821 iomap->length = 1 << blkbits;
822 } else {
823 iomap->type = IOMAP_MAPPED;
824 iomap->blkno = (sector_t)bno << (blkbits - 9);
825 iomap->length = (u64)ret << blkbits;
826 iomap->flags |= IOMAP_F_MERGED;
827 }
828
829 if (new)
830 iomap->flags |= IOMAP_F_NEW;
831 return 0;
832}
833
834static int
835ext2_iomap_end(struct inode *inode, loff_t offset, loff_t length,
836 ssize_t written, unsigned flags, struct iomap *iomap)
837{
838 if (iomap->type == IOMAP_MAPPED &&
839 written < length &&
840 (flags & IOMAP_WRITE))
841 ext2_write_failed(inode->i_mapping, offset + length);
842 return 0;
843}
844
845const struct iomap_ops ext2_iomap_ops = {
846 .iomap_begin = ext2_iomap_begin,
847 .iomap_end = ext2_iomap_end,
848};
849#else
850
851const struct iomap_ops ext2_iomap_ops;
852#endif
853
854int ext2_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo,
855 u64 start, u64 len)
856{
857 return generic_block_fiemap(inode, fieinfo, start, len,
858 ext2_get_block);
859}
860
861static int ext2_writepage(struct page *page, struct writeback_control *wbc)
862{
863 return block_write_full_page(page, ext2_get_block, wbc);
864}
865
866static int ext2_readpage(struct file *file, struct page *page)
867{
868 return mpage_readpage(page, ext2_get_block);
869}
870
871static int
872ext2_readpages(struct file *file, struct address_space *mapping,
873 struct list_head *pages, unsigned nr_pages)
874{
875 return mpage_readpages(mapping, pages, nr_pages, ext2_get_block);
876}
877
878static int
879ext2_write_begin(struct file *file, struct address_space *mapping,
880 loff_t pos, unsigned len, unsigned flags,
881 struct page **pagep, void **fsdata)
882{
883 int ret;
884
885 ret = block_write_begin(mapping, pos, len, flags, pagep,
886 ext2_get_block);
887 if (ret < 0)
888 ext2_write_failed(mapping, pos + len);
889 return ret;
890}
891
892static int ext2_write_end(struct file *file, struct address_space *mapping,
893 loff_t pos, unsigned len, unsigned copied,
894 struct page *page, void *fsdata)
895{
896 int ret;
897
898 ret = generic_write_end(file, mapping, pos, len, copied, page, fsdata);
899 if (ret < len)
900 ext2_write_failed(mapping, pos + len);
901 return ret;
902}
903
904static int
905ext2_nobh_write_begin(struct file *file, struct address_space *mapping,
906 loff_t pos, unsigned len, unsigned flags,
907 struct page **pagep, void **fsdata)
908{
909 int ret;
910
911 ret = nobh_write_begin(mapping, pos, len, flags, pagep, fsdata,
912 ext2_get_block);
913 if (ret < 0)
914 ext2_write_failed(mapping, pos + len);
915 return ret;
916}
917
918static int ext2_nobh_writepage(struct page *page,
919 struct writeback_control *wbc)
920{
921 return nobh_writepage(page, ext2_get_block, wbc);
922}
923
924static sector_t ext2_bmap(struct address_space *mapping, sector_t block)
925{
926 return generic_block_bmap(mapping,block,ext2_get_block);
927}
928
929static ssize_t
930ext2_direct_IO(struct kiocb *iocb, struct iov_iter *iter)
931{
932 struct file *file = iocb->ki_filp;
933 struct address_space *mapping = file->f_mapping;
934 struct inode *inode = mapping->host;
935 size_t count = iov_iter_count(iter);
936 loff_t offset = iocb->ki_pos;
937 ssize_t ret;
938
939 if (WARN_ON_ONCE(IS_DAX(inode)))
940 return -EIO;
941
942 ret = blockdev_direct_IO(iocb, inode, iter, ext2_get_block);
943 if (ret < 0 && iov_iter_rw(iter) == WRITE)
944 ext2_write_failed(mapping, offset + count);
945 return ret;
946}
947
948static int
949ext2_writepages(struct address_space *mapping, struct writeback_control *wbc)
950{
951#ifdef CONFIG_FS_DAX
952 if (dax_mapping(mapping)) {
953 return dax_writeback_mapping_range(mapping,
954 mapping->host->i_sb->s_bdev,
955 wbc);
956 }
957#endif
958
959 return mpage_writepages(mapping, wbc, ext2_get_block);
960}
961
962const struct address_space_operations ext2_aops = {
963 .readpage = ext2_readpage,
964 .readpages = ext2_readpages,
965 .writepage = ext2_writepage,
966 .write_begin = ext2_write_begin,
967 .write_end = ext2_write_end,
968 .bmap = ext2_bmap,
969 .direct_IO = ext2_direct_IO,
970 .writepages = ext2_writepages,
971 .migratepage = buffer_migrate_page,
972 .is_partially_uptodate = block_is_partially_uptodate,
973 .error_remove_page = generic_error_remove_page,
974};
975
976const struct address_space_operations ext2_nobh_aops = {
977 .readpage = ext2_readpage,
978 .readpages = ext2_readpages,
979 .writepage = ext2_nobh_writepage,
980 .write_begin = ext2_nobh_write_begin,
981 .write_end = nobh_write_end,
982 .bmap = ext2_bmap,
983 .direct_IO = ext2_direct_IO,
984 .writepages = ext2_writepages,
985 .migratepage = buffer_migrate_page,
986 .error_remove_page = generic_error_remove_page,
987};
988
989
990
991
992
993
994static inline int all_zeroes(__le32 *p, __le32 *q)
995{
996 while (p < q)
997 if (*p++)
998 return 0;
999 return 1;
1000}
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036static Indirect *ext2_find_shared(struct inode *inode,
1037 int depth,
1038 int offsets[4],
1039 Indirect chain[4],
1040 __le32 *top)
1041{
1042 Indirect *partial, *p;
1043 int k, err;
1044
1045 *top = 0;
1046 for (k = depth; k > 1 && !offsets[k-1]; k--)
1047 ;
1048 partial = ext2_get_branch(inode, k, offsets, chain, &err);
1049 if (!partial)
1050 partial = chain + k-1;
1051
1052
1053
1054
1055 write_lock(&EXT2_I(inode)->i_meta_lock);
1056 if (!partial->key && *partial->p) {
1057 write_unlock(&EXT2_I(inode)->i_meta_lock);
1058 goto no_top;
1059 }
1060 for (p=partial; p>chain && all_zeroes((__le32*)p->bh->b_data,p->p); p--)
1061 ;
1062
1063
1064
1065
1066
1067
1068 if (p == chain + k - 1 && p > chain) {
1069 p->p--;
1070 } else {
1071 *top = *p->p;
1072 *p->p = 0;
1073 }
1074 write_unlock(&EXT2_I(inode)->i_meta_lock);
1075
1076 while(partial > p)
1077 {
1078 brelse(partial->bh);
1079 partial--;
1080 }
1081no_top:
1082 return partial;
1083}
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095static inline void ext2_free_data(struct inode *inode, __le32 *p, __le32 *q)
1096{
1097 unsigned long block_to_free = 0, count = 0;
1098 unsigned long nr;
1099
1100 for ( ; p < q ; p++) {
1101 nr = le32_to_cpu(*p);
1102 if (nr) {
1103 *p = 0;
1104
1105 if (count == 0)
1106 goto free_this;
1107 else if (block_to_free == nr - count)
1108 count++;
1109 else {
1110 ext2_free_blocks (inode, block_to_free, count);
1111 mark_inode_dirty(inode);
1112 free_this:
1113 block_to_free = nr;
1114 count = 1;
1115 }
1116 }
1117 }
1118 if (count > 0) {
1119 ext2_free_blocks (inode, block_to_free, count);
1120 mark_inode_dirty(inode);
1121 }
1122}
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135static void ext2_free_branches(struct inode *inode, __le32 *p, __le32 *q, int depth)
1136{
1137 struct buffer_head * bh;
1138 unsigned long nr;
1139
1140 if (depth--) {
1141 int addr_per_block = EXT2_ADDR_PER_BLOCK(inode->i_sb);
1142 for ( ; p < q ; p++) {
1143 nr = le32_to_cpu(*p);
1144 if (!nr)
1145 continue;
1146 *p = 0;
1147 bh = sb_bread(inode->i_sb, nr);
1148
1149
1150
1151
1152 if (!bh) {
1153 ext2_error(inode->i_sb, "ext2_free_branches",
1154 "Read failure, inode=%ld, block=%ld",
1155 inode->i_ino, nr);
1156 continue;
1157 }
1158 ext2_free_branches(inode,
1159 (__le32*)bh->b_data,
1160 (__le32*)bh->b_data + addr_per_block,
1161 depth);
1162 bforget(bh);
1163 ext2_free_blocks(inode, nr, 1);
1164 mark_inode_dirty(inode);
1165 }
1166 } else
1167 ext2_free_data(inode, p, q);
1168}
1169
1170
1171static void __ext2_truncate_blocks(struct inode *inode, loff_t offset)
1172{
1173 __le32 *i_data = EXT2_I(inode)->i_data;
1174 struct ext2_inode_info *ei = EXT2_I(inode);
1175 int addr_per_block = EXT2_ADDR_PER_BLOCK(inode->i_sb);
1176 int offsets[4];
1177 Indirect chain[4];
1178 Indirect *partial;
1179 __le32 nr = 0;
1180 int n;
1181 long iblock;
1182 unsigned blocksize;
1183 blocksize = inode->i_sb->s_blocksize;
1184 iblock = (offset + blocksize-1) >> EXT2_BLOCK_SIZE_BITS(inode->i_sb);
1185
1186#ifdef CONFIG_FS_DAX
1187 WARN_ON(!rwsem_is_locked(&ei->dax_sem));
1188#endif
1189
1190 n = ext2_block_to_path(inode, iblock, offsets, NULL);
1191 if (n == 0)
1192 return;
1193
1194
1195
1196
1197
1198 mutex_lock(&ei->truncate_mutex);
1199
1200 if (n == 1) {
1201 ext2_free_data(inode, i_data+offsets[0],
1202 i_data + EXT2_NDIR_BLOCKS);
1203 goto do_indirects;
1204 }
1205
1206 partial = ext2_find_shared(inode, n, offsets, chain, &nr);
1207
1208 if (nr) {
1209 if (partial == chain)
1210 mark_inode_dirty(inode);
1211 else
1212 mark_buffer_dirty_inode(partial->bh, inode);
1213 ext2_free_branches(inode, &nr, &nr+1, (chain+n-1) - partial);
1214 }
1215
1216 while (partial > chain) {
1217 ext2_free_branches(inode,
1218 partial->p + 1,
1219 (__le32*)partial->bh->b_data+addr_per_block,
1220 (chain+n-1) - partial);
1221 mark_buffer_dirty_inode(partial->bh, inode);
1222 brelse (partial->bh);
1223 partial--;
1224 }
1225do_indirects:
1226
1227 switch (offsets[0]) {
1228 default:
1229 nr = i_data[EXT2_IND_BLOCK];
1230 if (nr) {
1231 i_data[EXT2_IND_BLOCK] = 0;
1232 mark_inode_dirty(inode);
1233 ext2_free_branches(inode, &nr, &nr+1, 1);
1234 }
1235 case EXT2_IND_BLOCK:
1236 nr = i_data[EXT2_DIND_BLOCK];
1237 if (nr) {
1238 i_data[EXT2_DIND_BLOCK] = 0;
1239 mark_inode_dirty(inode);
1240 ext2_free_branches(inode, &nr, &nr+1, 2);
1241 }
1242 case EXT2_DIND_BLOCK:
1243 nr = i_data[EXT2_TIND_BLOCK];
1244 if (nr) {
1245 i_data[EXT2_TIND_BLOCK] = 0;
1246 mark_inode_dirty(inode);
1247 ext2_free_branches(inode, &nr, &nr+1, 3);
1248 }
1249 case EXT2_TIND_BLOCK:
1250 ;
1251 }
1252
1253 ext2_discard_reservation(inode);
1254
1255 mutex_unlock(&ei->truncate_mutex);
1256}
1257
1258static void ext2_truncate_blocks(struct inode *inode, loff_t offset)
1259{
1260
1261
1262
1263
1264
1265
1266
1267
1268 if (!(S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode) ||
1269 S_ISLNK(inode->i_mode)))
1270 return;
1271 if (ext2_inode_is_fast_symlink(inode))
1272 return;
1273 if (IS_APPEND(inode) || IS_IMMUTABLE(inode))
1274 return;
1275
1276 dax_sem_down_write(EXT2_I(inode));
1277 __ext2_truncate_blocks(inode, offset);
1278 dax_sem_up_write(EXT2_I(inode));
1279}
1280
1281static int ext2_setsize(struct inode *inode, loff_t newsize)
1282{
1283 int error;
1284
1285 if (!(S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode) ||
1286 S_ISLNK(inode->i_mode)))
1287 return -EINVAL;
1288 if (ext2_inode_is_fast_symlink(inode))
1289 return -EINVAL;
1290 if (IS_APPEND(inode) || IS_IMMUTABLE(inode))
1291 return -EPERM;
1292
1293 inode_dio_wait(inode);
1294
1295 if (IS_DAX(inode)) {
1296 error = iomap_zero_range(inode, newsize,
1297 PAGE_ALIGN(newsize) - newsize, NULL,
1298 &ext2_iomap_ops);
1299 } else if (test_opt(inode->i_sb, NOBH))
1300 error = nobh_truncate_page(inode->i_mapping,
1301 newsize, ext2_get_block);
1302 else
1303 error = block_truncate_page(inode->i_mapping,
1304 newsize, ext2_get_block);
1305 if (error)
1306 return error;
1307
1308 dax_sem_down_write(EXT2_I(inode));
1309 truncate_setsize(inode, newsize);
1310 __ext2_truncate_blocks(inode, newsize);
1311 dax_sem_up_write(EXT2_I(inode));
1312
1313 inode->i_mtime = inode->i_ctime = current_time(inode);
1314 if (inode_needs_sync(inode)) {
1315 sync_mapping_buffers(inode->i_mapping);
1316 sync_inode_metadata(inode, 1);
1317 } else {
1318 mark_inode_dirty(inode);
1319 }
1320
1321 return 0;
1322}
1323
1324static struct ext2_inode *ext2_get_inode(struct super_block *sb, ino_t ino,
1325 struct buffer_head **p)
1326{
1327 struct buffer_head * bh;
1328 unsigned long block_group;
1329 unsigned long block;
1330 unsigned long offset;
1331 struct ext2_group_desc * gdp;
1332
1333 *p = NULL;
1334 if ((ino != EXT2_ROOT_INO && ino < EXT2_FIRST_INO(sb)) ||
1335 ino > le32_to_cpu(EXT2_SB(sb)->s_es->s_inodes_count))
1336 goto Einval;
1337
1338 block_group = (ino - 1) / EXT2_INODES_PER_GROUP(sb);
1339 gdp = ext2_get_group_desc(sb, block_group, NULL);
1340 if (!gdp)
1341 goto Egdp;
1342
1343
1344
1345 offset = ((ino - 1) % EXT2_INODES_PER_GROUP(sb)) * EXT2_INODE_SIZE(sb);
1346 block = le32_to_cpu(gdp->bg_inode_table) +
1347 (offset >> EXT2_BLOCK_SIZE_BITS(sb));
1348 if (!(bh = sb_bread(sb, block)))
1349 goto Eio;
1350
1351 *p = bh;
1352 offset &= (EXT2_BLOCK_SIZE(sb) - 1);
1353 return (struct ext2_inode *) (bh->b_data + offset);
1354
1355Einval:
1356 ext2_error(sb, "ext2_get_inode", "bad inode number: %lu",
1357 (unsigned long) ino);
1358 return ERR_PTR(-EINVAL);
1359Eio:
1360 ext2_error(sb, "ext2_get_inode",
1361 "unable to read inode block - inode=%lu, block=%lu",
1362 (unsigned long) ino, block);
1363Egdp:
1364 return ERR_PTR(-EIO);
1365}
1366
1367void ext2_set_inode_flags(struct inode *inode)
1368{
1369 unsigned int flags = EXT2_I(inode)->i_flags;
1370
1371 inode->i_flags &= ~(S_SYNC | S_APPEND | S_IMMUTABLE | S_NOATIME |
1372 S_DIRSYNC | S_DAX);
1373 if (flags & EXT2_SYNC_FL)
1374 inode->i_flags |= S_SYNC;
1375 if (flags & EXT2_APPEND_FL)
1376 inode->i_flags |= S_APPEND;
1377 if (flags & EXT2_IMMUTABLE_FL)
1378 inode->i_flags |= S_IMMUTABLE;
1379 if (flags & EXT2_NOATIME_FL)
1380 inode->i_flags |= S_NOATIME;
1381 if (flags & EXT2_DIRSYNC_FL)
1382 inode->i_flags |= S_DIRSYNC;
1383 if (test_opt(inode->i_sb, DAX) && S_ISREG(inode->i_mode))
1384 inode->i_flags |= S_DAX;
1385}
1386
1387
1388void ext2_get_inode_flags(struct ext2_inode_info *ei)
1389{
1390 unsigned int flags = ei->vfs_inode.i_flags;
1391
1392 ei->i_flags &= ~(EXT2_SYNC_FL|EXT2_APPEND_FL|
1393 EXT2_IMMUTABLE_FL|EXT2_NOATIME_FL|EXT2_DIRSYNC_FL);
1394 if (flags & S_SYNC)
1395 ei->i_flags |= EXT2_SYNC_FL;
1396 if (flags & S_APPEND)
1397 ei->i_flags |= EXT2_APPEND_FL;
1398 if (flags & S_IMMUTABLE)
1399 ei->i_flags |= EXT2_IMMUTABLE_FL;
1400 if (flags & S_NOATIME)
1401 ei->i_flags |= EXT2_NOATIME_FL;
1402 if (flags & S_DIRSYNC)
1403 ei->i_flags |= EXT2_DIRSYNC_FL;
1404}
1405
1406struct inode *ext2_iget (struct super_block *sb, unsigned long ino)
1407{
1408 struct ext2_inode_info *ei;
1409 struct buffer_head * bh;
1410 struct ext2_inode *raw_inode;
1411 struct inode *inode;
1412 long ret = -EIO;
1413 int n;
1414 uid_t i_uid;
1415 gid_t i_gid;
1416
1417 inode = iget_locked(sb, ino);
1418 if (!inode)
1419 return ERR_PTR(-ENOMEM);
1420 if (!(inode->i_state & I_NEW))
1421 return inode;
1422
1423 ei = EXT2_I(inode);
1424 ei->i_block_alloc_info = NULL;
1425
1426 raw_inode = ext2_get_inode(inode->i_sb, ino, &bh);
1427 if (IS_ERR(raw_inode)) {
1428 ret = PTR_ERR(raw_inode);
1429 goto bad_inode;
1430 }
1431
1432 inode->i_mode = le16_to_cpu(raw_inode->i_mode);
1433 i_uid = (uid_t)le16_to_cpu(raw_inode->i_uid_low);
1434 i_gid = (gid_t)le16_to_cpu(raw_inode->i_gid_low);
1435 if (!(test_opt (inode->i_sb, NO_UID32))) {
1436 i_uid |= le16_to_cpu(raw_inode->i_uid_high) << 16;
1437 i_gid |= le16_to_cpu(raw_inode->i_gid_high) << 16;
1438 }
1439 i_uid_write(inode, i_uid);
1440 i_gid_write(inode, i_gid);
1441 set_nlink(inode, le16_to_cpu(raw_inode->i_links_count));
1442 inode->i_size = le32_to_cpu(raw_inode->i_size);
1443 inode->i_atime.tv_sec = (signed)le32_to_cpu(raw_inode->i_atime);
1444 inode->i_ctime.tv_sec = (signed)le32_to_cpu(raw_inode->i_ctime);
1445 inode->i_mtime.tv_sec = (signed)le32_to_cpu(raw_inode->i_mtime);
1446 inode->i_atime.tv_nsec = inode->i_mtime.tv_nsec = inode->i_ctime.tv_nsec = 0;
1447 ei->i_dtime = le32_to_cpu(raw_inode->i_dtime);
1448
1449
1450
1451
1452
1453 if (inode->i_nlink == 0 && (inode->i_mode == 0 || ei->i_dtime)) {
1454
1455 brelse (bh);
1456 ret = -ESTALE;
1457 goto bad_inode;
1458 }
1459 inode->i_blocks = le32_to_cpu(raw_inode->i_blocks);
1460 ei->i_flags = le32_to_cpu(raw_inode->i_flags);
1461 ei->i_faddr = le32_to_cpu(raw_inode->i_faddr);
1462 ei->i_frag_no = raw_inode->i_frag;
1463 ei->i_frag_size = raw_inode->i_fsize;
1464 ei->i_file_acl = le32_to_cpu(raw_inode->i_file_acl);
1465 ei->i_dir_acl = 0;
1466
1467 if (ei->i_file_acl &&
1468 !ext2_data_block_valid(EXT2_SB(sb), ei->i_file_acl, 1)) {
1469 ext2_error(sb, "ext2_iget", "bad extended attribute block %u",
1470 ei->i_file_acl);
1471 brelse(bh);
1472 ret = -EFSCORRUPTED;
1473 goto bad_inode;
1474 }
1475
1476 if (S_ISREG(inode->i_mode))
1477 inode->i_size |= ((__u64)le32_to_cpu(raw_inode->i_size_high)) << 32;
1478 else
1479 ei->i_dir_acl = le32_to_cpu(raw_inode->i_dir_acl);
1480 if (i_size_read(inode) < 0) {
1481 ret = -EFSCORRUPTED;
1482 goto bad_inode;
1483 }
1484 ei->i_dtime = 0;
1485 inode->i_generation = le32_to_cpu(raw_inode->i_generation);
1486 ei->i_state = 0;
1487 ei->i_block_group = (ino - 1) / EXT2_INODES_PER_GROUP(inode->i_sb);
1488 ei->i_dir_start_lookup = 0;
1489
1490
1491
1492
1493
1494 for (n = 0; n < EXT2_N_BLOCKS; n++)
1495 ei->i_data[n] = raw_inode->i_block[n];
1496
1497 if (S_ISREG(inode->i_mode)) {
1498 inode->i_op = &ext2_file_inode_operations;
1499 if (test_opt(inode->i_sb, NOBH)) {
1500 inode->i_mapping->a_ops = &ext2_nobh_aops;
1501 inode->i_fop = &ext2_file_operations;
1502 } else {
1503 inode->i_mapping->a_ops = &ext2_aops;
1504 inode->i_fop = &ext2_file_operations;
1505 }
1506 } else if (S_ISDIR(inode->i_mode)) {
1507 inode->i_op = &ext2_dir_inode_operations;
1508 inode->i_fop = &ext2_dir_operations;
1509 if (test_opt(inode->i_sb, NOBH))
1510 inode->i_mapping->a_ops = &ext2_nobh_aops;
1511 else
1512 inode->i_mapping->a_ops = &ext2_aops;
1513 } else if (S_ISLNK(inode->i_mode)) {
1514 if (ext2_inode_is_fast_symlink(inode)) {
1515 inode->i_link = (char *)ei->i_data;
1516 inode->i_op = &ext2_fast_symlink_inode_operations;
1517 nd_terminate_link(ei->i_data, inode->i_size,
1518 sizeof(ei->i_data) - 1);
1519 } else {
1520 inode->i_op = &ext2_symlink_inode_operations;
1521 inode_nohighmem(inode);
1522 if (test_opt(inode->i_sb, NOBH))
1523 inode->i_mapping->a_ops = &ext2_nobh_aops;
1524 else
1525 inode->i_mapping->a_ops = &ext2_aops;
1526 }
1527 } else {
1528 inode->i_op = &ext2_special_inode_operations;
1529 if (raw_inode->i_block[0])
1530 init_special_inode(inode, inode->i_mode,
1531 old_decode_dev(le32_to_cpu(raw_inode->i_block[0])));
1532 else
1533 init_special_inode(inode, inode->i_mode,
1534 new_decode_dev(le32_to_cpu(raw_inode->i_block[1])));
1535 }
1536 brelse (bh);
1537 ext2_set_inode_flags(inode);
1538 unlock_new_inode(inode);
1539 return inode;
1540
1541bad_inode:
1542 iget_failed(inode);
1543 return ERR_PTR(ret);
1544}
1545
1546static int __ext2_write_inode(struct inode *inode, int do_sync)
1547{
1548 struct ext2_inode_info *ei = EXT2_I(inode);
1549 struct super_block *sb = inode->i_sb;
1550 ino_t ino = inode->i_ino;
1551 uid_t uid = i_uid_read(inode);
1552 gid_t gid = i_gid_read(inode);
1553 struct buffer_head * bh;
1554 struct ext2_inode * raw_inode = ext2_get_inode(sb, ino, &bh);
1555 int n;
1556 int err = 0;
1557
1558 if (IS_ERR(raw_inode))
1559 return -EIO;
1560
1561
1562
1563 if (ei->i_state & EXT2_STATE_NEW)
1564 memset(raw_inode, 0, EXT2_SB(sb)->s_inode_size);
1565
1566 ext2_get_inode_flags(ei);
1567 raw_inode->i_mode = cpu_to_le16(inode->i_mode);
1568 if (!(test_opt(sb, NO_UID32))) {
1569 raw_inode->i_uid_low = cpu_to_le16(low_16_bits(uid));
1570 raw_inode->i_gid_low = cpu_to_le16(low_16_bits(gid));
1571
1572
1573
1574
1575 if (!ei->i_dtime) {
1576 raw_inode->i_uid_high = cpu_to_le16(high_16_bits(uid));
1577 raw_inode->i_gid_high = cpu_to_le16(high_16_bits(gid));
1578 } else {
1579 raw_inode->i_uid_high = 0;
1580 raw_inode->i_gid_high = 0;
1581 }
1582 } else {
1583 raw_inode->i_uid_low = cpu_to_le16(fs_high2lowuid(uid));
1584 raw_inode->i_gid_low = cpu_to_le16(fs_high2lowgid(gid));
1585 raw_inode->i_uid_high = 0;
1586 raw_inode->i_gid_high = 0;
1587 }
1588 raw_inode->i_links_count = cpu_to_le16(inode->i_nlink);
1589 raw_inode->i_size = cpu_to_le32(inode->i_size);
1590 raw_inode->i_atime = cpu_to_le32(inode->i_atime.tv_sec);
1591 raw_inode->i_ctime = cpu_to_le32(inode->i_ctime.tv_sec);
1592 raw_inode->i_mtime = cpu_to_le32(inode->i_mtime.tv_sec);
1593
1594 raw_inode->i_blocks = cpu_to_le32(inode->i_blocks);
1595 raw_inode->i_dtime = cpu_to_le32(ei->i_dtime);
1596 raw_inode->i_flags = cpu_to_le32(ei->i_flags);
1597 raw_inode->i_faddr = cpu_to_le32(ei->i_faddr);
1598 raw_inode->i_frag = ei->i_frag_no;
1599 raw_inode->i_fsize = ei->i_frag_size;
1600 raw_inode->i_file_acl = cpu_to_le32(ei->i_file_acl);
1601 if (!S_ISREG(inode->i_mode))
1602 raw_inode->i_dir_acl = cpu_to_le32(ei->i_dir_acl);
1603 else {
1604 raw_inode->i_size_high = cpu_to_le32(inode->i_size >> 32);
1605 if (inode->i_size > 0x7fffffffULL) {
1606 if (!EXT2_HAS_RO_COMPAT_FEATURE(sb,
1607 EXT2_FEATURE_RO_COMPAT_LARGE_FILE) ||
1608 EXT2_SB(sb)->s_es->s_rev_level ==
1609 cpu_to_le32(EXT2_GOOD_OLD_REV)) {
1610
1611
1612
1613 spin_lock(&EXT2_SB(sb)->s_lock);
1614 ext2_update_dynamic_rev(sb);
1615 EXT2_SET_RO_COMPAT_FEATURE(sb,
1616 EXT2_FEATURE_RO_COMPAT_LARGE_FILE);
1617 spin_unlock(&EXT2_SB(sb)->s_lock);
1618 ext2_write_super(sb);
1619 }
1620 }
1621 }
1622
1623 raw_inode->i_generation = cpu_to_le32(inode->i_generation);
1624 if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode)) {
1625 if (old_valid_dev(inode->i_rdev)) {
1626 raw_inode->i_block[0] =
1627 cpu_to_le32(old_encode_dev(inode->i_rdev));
1628 raw_inode->i_block[1] = 0;
1629 } else {
1630 raw_inode->i_block[0] = 0;
1631 raw_inode->i_block[1] =
1632 cpu_to_le32(new_encode_dev(inode->i_rdev));
1633 raw_inode->i_block[2] = 0;
1634 }
1635 } else for (n = 0; n < EXT2_N_BLOCKS; n++)
1636 raw_inode->i_block[n] = ei->i_data[n];
1637 mark_buffer_dirty(bh);
1638 if (do_sync) {
1639 sync_dirty_buffer(bh);
1640 if (buffer_req(bh) && !buffer_uptodate(bh)) {
1641 printk ("IO error syncing ext2 inode [%s:%08lx]\n",
1642 sb->s_id, (unsigned long) ino);
1643 err = -EIO;
1644 }
1645 }
1646 ei->i_state &= ~EXT2_STATE_NEW;
1647 brelse (bh);
1648 return err;
1649}
1650
1651int ext2_write_inode(struct inode *inode, struct writeback_control *wbc)
1652{
1653 return __ext2_write_inode(inode, wbc->sync_mode == WB_SYNC_ALL);
1654}
1655
1656int ext2_setattr(struct dentry *dentry, struct iattr *iattr)
1657{
1658 struct inode *inode = d_inode(dentry);
1659 int error;
1660
1661 error = setattr_prepare(dentry, iattr);
1662 if (error)
1663 return error;
1664
1665 if (is_quota_modification(inode, iattr)) {
1666 error = dquot_initialize(inode);
1667 if (error)
1668 return error;
1669 }
1670 if ((iattr->ia_valid & ATTR_UID && !uid_eq(iattr->ia_uid, inode->i_uid)) ||
1671 (iattr->ia_valid & ATTR_GID && !gid_eq(iattr->ia_gid, inode->i_gid))) {
1672 error = dquot_transfer(inode, iattr);
1673 if (error)
1674 return error;
1675 }
1676 if (iattr->ia_valid & ATTR_SIZE && iattr->ia_size != inode->i_size) {
1677 error = ext2_setsize(inode, iattr->ia_size);
1678 if (error)
1679 return error;
1680 }
1681 setattr_copy(inode, iattr);
1682 if (iattr->ia_valid & ATTR_MODE)
1683 error = posix_acl_chmod(inode, inode->i_mode);
1684 mark_inode_dirty(inode);
1685
1686 return error;
1687}
1688