diff options
Diffstat (limited to 'fs/ext4/inode.c')
| -rw-r--r-- | fs/ext4/inode.c | 201 |
1 files changed, 89 insertions, 112 deletions
diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index 2c8caa51addb..5352db1a3086 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c | |||
| @@ -71,58 +71,6 @@ static int ext4_inode_is_fast_symlink(struct inode *inode) | |||
| 71 | } | 71 | } |
| 72 | 72 | ||
| 73 | /* | 73 | /* |
| 74 | * The ext4 forget function must perform a revoke if we are freeing data | ||
| 75 | * which has been journaled. Metadata (eg. indirect blocks) must be | ||
| 76 | * revoked in all cases. | ||
| 77 | * | ||
| 78 | * "bh" may be NULL: a metadata block may have been freed from memory | ||
| 79 | * but there may still be a record of it in the journal, and that record | ||
| 80 | * still needs to be revoked. | ||
| 81 | * | ||
| 82 | * If the handle isn't valid we're not journaling, but we still need to | ||
| 83 | * call into ext4_journal_revoke() to put the buffer head. | ||
| 84 | */ | ||
| 85 | int ext4_forget(handle_t *handle, int is_metadata, struct inode *inode, | ||
| 86 | struct buffer_head *bh, ext4_fsblk_t blocknr) | ||
| 87 | { | ||
| 88 | int err; | ||
| 89 | |||
| 90 | might_sleep(); | ||
| 91 | |||
| 92 | BUFFER_TRACE(bh, "enter"); | ||
| 93 | |||
| 94 | jbd_debug(4, "forgetting bh %p: is_metadata = %d, mode %o, " | ||
| 95 | "data mode %x\n", | ||
| 96 | bh, is_metadata, inode->i_mode, | ||
| 97 | test_opt(inode->i_sb, DATA_FLAGS)); | ||
| 98 | |||
| 99 | /* Never use the revoke function if we are doing full data | ||
| 100 | * journaling: there is no need to, and a V1 superblock won't | ||
| 101 | * support it. Otherwise, only skip the revoke on un-journaled | ||
| 102 | * data blocks. */ | ||
| 103 | |||
| 104 | if (test_opt(inode->i_sb, DATA_FLAGS) == EXT4_MOUNT_JOURNAL_DATA || | ||
| 105 | (!is_metadata && !ext4_should_journal_data(inode))) { | ||
| 106 | if (bh) { | ||
| 107 | BUFFER_TRACE(bh, "call jbd2_journal_forget"); | ||
| 108 | return ext4_journal_forget(handle, bh); | ||
| 109 | } | ||
| 110 | return 0; | ||
| 111 | } | ||
| 112 | |||
| 113 | /* | ||
| 114 | * data!=journal && (is_metadata || should_journal_data(inode)) | ||
| 115 | */ | ||
| 116 | BUFFER_TRACE(bh, "call ext4_journal_revoke"); | ||
| 117 | err = ext4_journal_revoke(handle, blocknr, bh); | ||
| 118 | if (err) | ||
| 119 | ext4_abort(inode->i_sb, __func__, | ||
| 120 | "error %d when attempting revoke", err); | ||
| 121 | BUFFER_TRACE(bh, "exit"); | ||
| 122 | return err; | ||
| 123 | } | ||
| 124 | |||
| 125 | /* | ||
| 126 | * Work out how many blocks we need to proceed with the next chunk of a | 74 | * Work out how many blocks we need to proceed with the next chunk of a |
| 127 | * truncate transaction. | 75 | * truncate transaction. |
| 128 | */ | 76 | */ |
| @@ -721,7 +669,7 @@ allocated: | |||
| 721 | return ret; | 669 | return ret; |
| 722 | failed_out: | 670 | failed_out: |
| 723 | for (i = 0; i < index; i++) | 671 | for (i = 0; i < index; i++) |
| 724 | ext4_free_blocks(handle, inode, new_blocks[i], 1, 0); | 672 | ext4_free_blocks(handle, inode, 0, new_blocks[i], 1, 0); |
| 725 | return ret; | 673 | return ret; |
| 726 | } | 674 | } |
| 727 | 675 | ||
| @@ -817,14 +765,20 @@ static int ext4_alloc_branch(handle_t *handle, struct inode *inode, | |||
| 817 | return err; | 765 | return err; |
| 818 | failed: | 766 | failed: |
| 819 | /* Allocation failed, free what we already allocated */ | 767 | /* Allocation failed, free what we already allocated */ |
| 768 | ext4_free_blocks(handle, inode, 0, new_blocks[0], 1, 0); | ||
| 820 | for (i = 1; i <= n ; i++) { | 769 | for (i = 1; i <= n ; i++) { |
| 821 | BUFFER_TRACE(branch[i].bh, "call jbd2_journal_forget"); | 770 | /* |
| 822 | ext4_journal_forget(handle, branch[i].bh); | 771 | * branch[i].bh is newly allocated, so there is no |
| 772 | * need to revoke the block, which is why we don't | ||
| 773 | * need to set EXT4_FREE_BLOCKS_METADATA. | ||
| 774 | */ | ||
| 775 | ext4_free_blocks(handle, inode, 0, new_blocks[i], 1, | ||
| 776 | EXT4_FREE_BLOCKS_FORGET); | ||
| 823 | } | 777 | } |
| 824 | for (i = 0; i < indirect_blks; i++) | 778 | for (i = n+1; i < indirect_blks; i++) |
| 825 | ext4_free_blocks(handle, inode, new_blocks[i], 1, 0); | 779 | ext4_free_blocks(handle, inode, 0, new_blocks[i], 1, 0); |
| 826 | 780 | ||
| 827 | ext4_free_blocks(handle, inode, new_blocks[i], num, 0); | 781 | ext4_free_blocks(handle, inode, 0, new_blocks[i], num, 0); |
| 828 | 782 | ||
| 829 | return err; | 783 | return err; |
| 830 | } | 784 | } |
| @@ -903,12 +857,16 @@ static int ext4_splice_branch(handle_t *handle, struct inode *inode, | |||
| 903 | 857 | ||
| 904 | err_out: | 858 | err_out: |
| 905 | for (i = 1; i <= num; i++) { | 859 | for (i = 1; i <= num; i++) { |
| 906 | BUFFER_TRACE(where[i].bh, "call jbd2_journal_forget"); | 860 | /* |
| 907 | ext4_journal_forget(handle, where[i].bh); | 861 | * branch[i].bh is newly allocated, so there is no |
| 908 | ext4_free_blocks(handle, inode, | 862 | * need to revoke the block, which is why we don't |
| 909 | le32_to_cpu(where[i-1].key), 1, 0); | 863 | * need to set EXT4_FREE_BLOCKS_METADATA. |
| 864 | */ | ||
| 865 | ext4_free_blocks(handle, inode, where[i].bh, 0, 1, | ||
| 866 | EXT4_FREE_BLOCKS_FORGET); | ||
| 910 | } | 867 | } |
| 911 | ext4_free_blocks(handle, inode, le32_to_cpu(where[num].key), blks, 0); | 868 | ext4_free_blocks(handle, inode, 0, le32_to_cpu(where[num].key), |
| 869 | blks, 0); | ||
| 912 | 870 | ||
| 913 | return err; | 871 | return err; |
| 914 | } | 872 | } |
| @@ -1021,10 +979,12 @@ static int ext4_ind_get_blocks(handle_t *handle, struct inode *inode, | |||
| 1021 | if (!err) | 979 | if (!err) |
| 1022 | err = ext4_splice_branch(handle, inode, iblock, | 980 | err = ext4_splice_branch(handle, inode, iblock, |
| 1023 | partial, indirect_blks, count); | 981 | partial, indirect_blks, count); |
| 1024 | else | 982 | if (err) |
| 1025 | goto cleanup; | 983 | goto cleanup; |
| 1026 | 984 | ||
| 1027 | set_buffer_new(bh_result); | 985 | set_buffer_new(bh_result); |
| 986 | |||
| 987 | ext4_update_inode_fsync_trans(handle, inode, 1); | ||
| 1028 | got_it: | 988 | got_it: |
| 1029 | map_bh(bh_result, inode->i_sb, le32_to_cpu(chain[depth-1].key)); | 989 | map_bh(bh_result, inode->i_sb, le32_to_cpu(chain[depth-1].key)); |
| 1030 | if (count > blocks_to_boundary) | 990 | if (count > blocks_to_boundary) |
| @@ -1052,7 +1012,7 @@ qsize_t ext4_get_reserved_space(struct inode *inode) | |||
| 1052 | EXT4_I(inode)->i_reserved_meta_blocks; | 1012 | EXT4_I(inode)->i_reserved_meta_blocks; |
| 1053 | spin_unlock(&EXT4_I(inode)->i_block_reservation_lock); | 1013 | spin_unlock(&EXT4_I(inode)->i_block_reservation_lock); |
| 1054 | 1014 | ||
| 1055 | return total; | 1015 | return (total << inode->i_blkbits); |
| 1056 | } | 1016 | } |
| 1057 | /* | 1017 | /* |
| 1058 | * Calculate the number of metadata blocks need to reserve | 1018 | * Calculate the number of metadata blocks need to reserve |
| @@ -1534,6 +1494,16 @@ static int do_journal_get_write_access(handle_t *handle, | |||
| 1534 | return ext4_journal_get_write_access(handle, bh); | 1494 | return ext4_journal_get_write_access(handle, bh); |
| 1535 | } | 1495 | } |
| 1536 | 1496 | ||
| 1497 | /* | ||
| 1498 | * Truncate blocks that were not used by write. We have to truncate the | ||
| 1499 | * pagecache as well so that corresponding buffers get properly unmapped. | ||
| 1500 | */ | ||
| 1501 | static void ext4_truncate_failed_write(struct inode *inode) | ||
| 1502 | { | ||
| 1503 | truncate_inode_pages(inode->i_mapping, inode->i_size); | ||
| 1504 | ext4_truncate(inode); | ||
| 1505 | } | ||
| 1506 | |||
| 1537 | static int ext4_write_begin(struct file *file, struct address_space *mapping, | 1507 | static int ext4_write_begin(struct file *file, struct address_space *mapping, |
| 1538 | loff_t pos, unsigned len, unsigned flags, | 1508 | loff_t pos, unsigned len, unsigned flags, |
| 1539 | struct page **pagep, void **fsdata) | 1509 | struct page **pagep, void **fsdata) |
| @@ -1599,7 +1569,7 @@ retry: | |||
| 1599 | 1569 | ||
| 1600 | ext4_journal_stop(handle); | 1570 | ext4_journal_stop(handle); |
| 1601 | if (pos + len > inode->i_size) { | 1571 | if (pos + len > inode->i_size) { |
| 1602 | ext4_truncate(inode); | 1572 | ext4_truncate_failed_write(inode); |
| 1603 | /* | 1573 | /* |
| 1604 | * If truncate failed early the inode might | 1574 | * If truncate failed early the inode might |
| 1605 | * still be on the orphan list; we need to | 1575 | * still be on the orphan list; we need to |
| @@ -1709,7 +1679,7 @@ static int ext4_ordered_write_end(struct file *file, | |||
| 1709 | ret = ret2; | 1679 | ret = ret2; |
| 1710 | 1680 | ||
| 1711 | if (pos + len > inode->i_size) { | 1681 | if (pos + len > inode->i_size) { |
| 1712 | ext4_truncate(inode); | 1682 | ext4_truncate_failed_write(inode); |
| 1713 | /* | 1683 | /* |
| 1714 | * If truncate failed early the inode might still be | 1684 | * If truncate failed early the inode might still be |
| 1715 | * on the orphan list; we need to make sure the inode | 1685 | * on the orphan list; we need to make sure the inode |
| @@ -1751,7 +1721,7 @@ static int ext4_writeback_write_end(struct file *file, | |||
| 1751 | ret = ret2; | 1721 | ret = ret2; |
| 1752 | 1722 | ||
| 1753 | if (pos + len > inode->i_size) { | 1723 | if (pos + len > inode->i_size) { |
| 1754 | ext4_truncate(inode); | 1724 | ext4_truncate_failed_write(inode); |
| 1755 | /* | 1725 | /* |
| 1756 | * If truncate failed early the inode might still be | 1726 | * If truncate failed early the inode might still be |
| 1757 | * on the orphan list; we need to make sure the inode | 1727 | * on the orphan list; we need to make sure the inode |
| @@ -1814,7 +1784,7 @@ static int ext4_journalled_write_end(struct file *file, | |||
| 1814 | if (!ret) | 1784 | if (!ret) |
| 1815 | ret = ret2; | 1785 | ret = ret2; |
| 1816 | if (pos + len > inode->i_size) { | 1786 | if (pos + len > inode->i_size) { |
| 1817 | ext4_truncate(inode); | 1787 | ext4_truncate_failed_write(inode); |
| 1818 | /* | 1788 | /* |
| 1819 | * If truncate failed early the inode might still be | 1789 | * If truncate failed early the inode might still be |
| 1820 | * on the orphan list; we need to make sure the inode | 1790 | * on the orphan list; we need to make sure the inode |
| @@ -2600,7 +2570,6 @@ static int bput_one(handle_t *handle, struct buffer_head *bh) | |||
| 2600 | } | 2570 | } |
| 2601 | 2571 | ||
| 2602 | static int __ext4_journalled_writepage(struct page *page, | 2572 | static int __ext4_journalled_writepage(struct page *page, |
| 2603 | struct writeback_control *wbc, | ||
| 2604 | unsigned int len) | 2573 | unsigned int len) |
| 2605 | { | 2574 | { |
| 2606 | struct address_space *mapping = page->mapping; | 2575 | struct address_space *mapping = page->mapping; |
| @@ -2758,7 +2727,7 @@ static int ext4_writepage(struct page *page, | |||
| 2758 | * doesn't seem much point in redirtying the page here. | 2727 | * doesn't seem much point in redirtying the page here. |
| 2759 | */ | 2728 | */ |
| 2760 | ClearPageChecked(page); | 2729 | ClearPageChecked(page); |
| 2761 | return __ext4_journalled_writepage(page, wbc, len); | 2730 | return __ext4_journalled_writepage(page, len); |
| 2762 | } | 2731 | } |
| 2763 | 2732 | ||
| 2764 | if (test_opt(inode->i_sb, NOBH) && ext4_should_writeback_data(inode)) | 2733 | if (test_opt(inode->i_sb, NOBH) && ext4_should_writeback_data(inode)) |
| @@ -2788,7 +2757,7 @@ static int ext4_da_writepages_trans_blocks(struct inode *inode) | |||
| 2788 | * number of contiguous block. So we will limit | 2757 | * number of contiguous block. So we will limit |
| 2789 | * number of contiguous block to a sane value | 2758 | * number of contiguous block to a sane value |
| 2790 | */ | 2759 | */ |
| 2791 | if (!(inode->i_flags & EXT4_EXTENTS_FL) && | 2760 | if (!(EXT4_I(inode)->i_flags & EXT4_EXTENTS_FL) && |
| 2792 | (max_blocks > EXT4_MAX_TRANS_DATA)) | 2761 | (max_blocks > EXT4_MAX_TRANS_DATA)) |
| 2793 | max_blocks = EXT4_MAX_TRANS_DATA; | 2762 | max_blocks = EXT4_MAX_TRANS_DATA; |
| 2794 | 2763 | ||
| @@ -2933,7 +2902,7 @@ retry: | |||
| 2933 | ret = write_cache_pages(mapping, wbc, __mpage_da_writepage, | 2902 | ret = write_cache_pages(mapping, wbc, __mpage_da_writepage, |
| 2934 | &mpd); | 2903 | &mpd); |
| 2935 | /* | 2904 | /* |
| 2936 | * If we have a contigous extent of pages and we | 2905 | * If we have a contiguous extent of pages and we |
| 2937 | * haven't done the I/O yet, map the blocks and submit | 2906 | * haven't done the I/O yet, map the blocks and submit |
| 2938 | * them for I/O. | 2907 | * them for I/O. |
| 2939 | */ | 2908 | */ |
| @@ -3091,7 +3060,7 @@ retry: | |||
| 3091 | * i_size_read because we hold i_mutex. | 3060 | * i_size_read because we hold i_mutex. |
| 3092 | */ | 3061 | */ |
| 3093 | if (pos + len > inode->i_size) | 3062 | if (pos + len > inode->i_size) |
| 3094 | ext4_truncate(inode); | 3063 | ext4_truncate_failed_write(inode); |
| 3095 | } | 3064 | } |
| 3096 | 3065 | ||
| 3097 | if (ret == -ENOSPC && ext4_should_retry_alloc(inode->i_sb, &retries)) | 3066 | if (ret == -ENOSPC && ext4_should_retry_alloc(inode->i_sb, &retries)) |
| @@ -4064,7 +4033,7 @@ static Indirect *ext4_find_shared(struct inode *inode, int depth, | |||
| 4064 | int k, err; | 4033 | int k, err; |
| 4065 | 4034 | ||
| 4066 | *top = 0; | 4035 | *top = 0; |
| 4067 | /* Make k index the deepest non-null offest + 1 */ | 4036 | /* Make k index the deepest non-null offset + 1 */ |
| 4068 | for (k = depth; k > 1 && !offsets[k-1]; k--) | 4037 | for (k = depth; k > 1 && !offsets[k-1]; k--) |
| 4069 | ; | 4038 | ; |
| 4070 | partial = ext4_get_branch(inode, k, offsets, chain, &err); | 4039 | partial = ext4_get_branch(inode, k, offsets, chain, &err); |
| @@ -4120,6 +4089,11 @@ static void ext4_clear_blocks(handle_t *handle, struct inode *inode, | |||
| 4120 | __le32 *last) | 4089 | __le32 *last) |
| 4121 | { | 4090 | { |
| 4122 | __le32 *p; | 4091 | __le32 *p; |
| 4092 | int flags = EXT4_FREE_BLOCKS_FORGET; | ||
| 4093 | |||
| 4094 | if (S_ISDIR(inode->i_mode) || S_ISLNK(inode->i_mode)) | ||
| 4095 | flags |= EXT4_FREE_BLOCKS_METADATA; | ||
| 4096 | |||
| 4123 | if (try_to_extend_transaction(handle, inode)) { | 4097 | if (try_to_extend_transaction(handle, inode)) { |
| 4124 | if (bh) { | 4098 | if (bh) { |
| 4125 | BUFFER_TRACE(bh, "call ext4_handle_dirty_metadata"); | 4099 | BUFFER_TRACE(bh, "call ext4_handle_dirty_metadata"); |
| @@ -4134,27 +4108,10 @@ static void ext4_clear_blocks(handle_t *handle, struct inode *inode, | |||
| 4134 | } | 4108 | } |
| 4135 | } | 4109 | } |
| 4136 | 4110 | ||
| 4137 | /* | 4111 | for (p = first; p < last; p++) |
| 4138 | * Any buffers which are on the journal will be in memory. We | 4112 | *p = 0; |
| 4139 | * find them on the hash table so jbd2_journal_revoke() will | ||
| 4140 | * run jbd2_journal_forget() on them. We've already detached | ||
| 4141 | * each block from the file, so bforget() in | ||
| 4142 | * jbd2_journal_forget() should be safe. | ||
| 4143 | * | ||
| 4144 | * AKPM: turn on bforget in jbd2_journal_forget()!!! | ||
| 4145 | */ | ||
| 4146 | for (p = first; p < last; p++) { | ||
| 4147 | u32 nr = le32_to_cpu(*p); | ||
| 4148 | if (nr) { | ||
| 4149 | struct buffer_head *tbh; | ||
| 4150 | |||
| 4151 | *p = 0; | ||
| 4152 | tbh = sb_find_get_block(inode->i_sb, nr); | ||
| 4153 | ext4_forget(handle, 0, inode, tbh, nr); | ||
| 4154 | } | ||
| 4155 | } | ||
| 4156 | 4113 | ||
| 4157 | ext4_free_blocks(handle, inode, block_to_free, count, 0); | 4114 | ext4_free_blocks(handle, inode, 0, block_to_free, count, flags); |
| 4158 | } | 4115 | } |
| 4159 | 4116 | ||
| 4160 | /** | 4117 | /** |
| @@ -4342,7 +4299,8 @@ static void ext4_free_branches(handle_t *handle, struct inode *inode, | |||
| 4342 | blocks_for_truncate(inode)); | 4299 | blocks_for_truncate(inode)); |
| 4343 | } | 4300 | } |
| 4344 | 4301 | ||
| 4345 | ext4_free_blocks(handle, inode, nr, 1, 1); | 4302 | ext4_free_blocks(handle, inode, 0, nr, 1, |
| 4303 | EXT4_FREE_BLOCKS_METADATA); | ||
| 4346 | 4304 | ||
| 4347 | if (parent_bh) { | 4305 | if (parent_bh) { |
| 4348 | /* | 4306 | /* |
| @@ -4781,8 +4739,8 @@ struct inode *ext4_iget(struct super_block *sb, unsigned long ino) | |||
| 4781 | struct ext4_iloc iloc; | 4739 | struct ext4_iloc iloc; |
| 4782 | struct ext4_inode *raw_inode; | 4740 | struct ext4_inode *raw_inode; |
| 4783 | struct ext4_inode_info *ei; | 4741 | struct ext4_inode_info *ei; |
| 4784 | struct buffer_head *bh; | ||
| 4785 | struct inode *inode; | 4742 | struct inode *inode; |
| 4743 | journal_t *journal = EXT4_SB(sb)->s_journal; | ||
| 4786 | long ret; | 4744 | long ret; |
| 4787 | int block; | 4745 | int block; |
| 4788 | 4746 | ||
| @@ -4793,11 +4751,11 @@ struct inode *ext4_iget(struct super_block *sb, unsigned long ino) | |||
| 4793 | return inode; | 4751 | return inode; |
| 4794 | 4752 | ||
| 4795 | ei = EXT4_I(inode); | 4753 | ei = EXT4_I(inode); |
| 4754 | iloc.bh = 0; | ||
| 4796 | 4755 | ||
| 4797 | ret = __ext4_get_inode_loc(inode, &iloc, 0); | 4756 | ret = __ext4_get_inode_loc(inode, &iloc, 0); |
| 4798 | if (ret < 0) | 4757 | if (ret < 0) |
| 4799 | goto bad_inode; | 4758 | goto bad_inode; |
| 4800 | bh = iloc.bh; | ||
| 4801 | raw_inode = ext4_raw_inode(&iloc); | 4759 | raw_inode = ext4_raw_inode(&iloc); |
| 4802 | inode->i_mode = le16_to_cpu(raw_inode->i_mode); | 4760 | inode->i_mode = le16_to_cpu(raw_inode->i_mode); |
| 4803 | inode->i_uid = (uid_t)le16_to_cpu(raw_inode->i_uid_low); | 4761 | inode->i_uid = (uid_t)le16_to_cpu(raw_inode->i_uid_low); |
| @@ -4820,7 +4778,6 @@ struct inode *ext4_iget(struct super_block *sb, unsigned long ino) | |||
| 4820 | if (inode->i_mode == 0 || | 4778 | if (inode->i_mode == 0 || |
| 4821 | !(EXT4_SB(inode->i_sb)->s_mount_state & EXT4_ORPHAN_FS)) { | 4779 | !(EXT4_SB(inode->i_sb)->s_mount_state & EXT4_ORPHAN_FS)) { |
| 4822 | /* this inode is deleted */ | 4780 | /* this inode is deleted */ |
| 4823 | brelse(bh); | ||
| 4824 | ret = -ESTALE; | 4781 | ret = -ESTALE; |
| 4825 | goto bad_inode; | 4782 | goto bad_inode; |
| 4826 | } | 4783 | } |
| @@ -4848,11 +4805,35 @@ struct inode *ext4_iget(struct super_block *sb, unsigned long ino) | |||
| 4848 | ei->i_data[block] = raw_inode->i_block[block]; | 4805 | ei->i_data[block] = raw_inode->i_block[block]; |
| 4849 | INIT_LIST_HEAD(&ei->i_orphan); | 4806 | INIT_LIST_HEAD(&ei->i_orphan); |
| 4850 | 4807 | ||
| 4808 | /* | ||
| 4809 | * Set transaction id's of transactions that have to be committed | ||
| 4810 | * to finish f[data]sync. We set them to currently running transaction | ||
| 4811 | * as we cannot be sure that the inode or some of its metadata isn't | ||
| 4812 | * part of the transaction - the inode could have been reclaimed and | ||
| 4813 | * now it is reread from disk. | ||
| 4814 | */ | ||
| 4815 | if (journal) { | ||
| 4816 | transaction_t *transaction; | ||
| 4817 | tid_t tid; | ||
| 4818 | |||
| 4819 | spin_lock(&journal->j_state_lock); | ||
| 4820 | if (journal->j_running_transaction) | ||
| 4821 | transaction = journal->j_running_transaction; | ||
| 4822 | else | ||
| 4823 | transaction = journal->j_committing_transaction; | ||
| 4824 | if (transaction) | ||
| 4825 | tid = transaction->t_tid; | ||
| 4826 | else | ||
| 4827 | tid = journal->j_commit_sequence; | ||
| 4828 | spin_unlock(&journal->j_state_lock); | ||
| 4829 | ei->i_sync_tid = tid; | ||
| 4830 | ei->i_datasync_tid = tid; | ||
| 4831 | } | ||
| 4832 | |||
| 4851 | if (EXT4_INODE_SIZE(inode->i_sb) > EXT4_GOOD_OLD_INODE_SIZE) { | 4833 | if (EXT4_INODE_SIZE(inode->i_sb) > EXT4_GOOD_OLD_INODE_SIZE) { |
| 4852 | ei->i_extra_isize = le16_to_cpu(raw_inode->i_extra_isize); | 4834 | ei->i_extra_isize = le16_to_cpu(raw_inode->i_extra_isize); |
| 4853 | if (EXT4_GOOD_OLD_INODE_SIZE + ei->i_extra_isize > | 4835 | if (EXT4_GOOD_OLD_INODE_SIZE + ei->i_extra_isize > |
| 4854 | EXT4_INODE_SIZE(inode->i_sb)) { | 4836 | EXT4_INODE_SIZE(inode->i_sb)) { |
| 4855 | brelse(bh); | ||
| 4856 | ret = -EIO; | 4837 | ret = -EIO; |
| 4857 | goto bad_inode; | 4838 | goto bad_inode; |
| 4858 | } | 4839 | } |
| @@ -4884,10 +4865,7 @@ struct inode *ext4_iget(struct super_block *sb, unsigned long ino) | |||
| 4884 | 4865 | ||
| 4885 | ret = 0; | 4866 | ret = 0; |
| 4886 | if (ei->i_file_acl && | 4867 | if (ei->i_file_acl && |
| 4887 | ((ei->i_file_acl < | 4868 | !ext4_data_block_valid(EXT4_SB(sb), ei->i_file_acl, 1)) { |
| 4888 | (le32_to_cpu(EXT4_SB(sb)->s_es->s_first_data_block) + | ||
| 4889 | EXT4_SB(sb)->s_gdb_count)) || | ||
| 4890 | (ei->i_file_acl >= ext4_blocks_count(EXT4_SB(sb)->s_es)))) { | ||
| 4891 | ext4_error(sb, __func__, | 4869 | ext4_error(sb, __func__, |
| 4892 | "bad extended attribute block %llu in inode #%lu", | 4870 | "bad extended attribute block %llu in inode #%lu", |
| 4893 | ei->i_file_acl, inode->i_ino); | 4871 | ei->i_file_acl, inode->i_ino); |
| @@ -4905,10 +4883,8 @@ struct inode *ext4_iget(struct super_block *sb, unsigned long ino) | |||
| 4905 | /* Validate block references which are part of inode */ | 4883 | /* Validate block references which are part of inode */ |
| 4906 | ret = ext4_check_inode_blockref(inode); | 4884 | ret = ext4_check_inode_blockref(inode); |
| 4907 | } | 4885 | } |
| 4908 | if (ret) { | 4886 | if (ret) |
| 4909 | brelse(bh); | ||
| 4910 | goto bad_inode; | 4887 | goto bad_inode; |
| 4911 | } | ||
| 4912 | 4888 | ||
| 4913 | if (S_ISREG(inode->i_mode)) { | 4889 | if (S_ISREG(inode->i_mode)) { |
| 4914 | inode->i_op = &ext4_file_inode_operations; | 4890 | inode->i_op = &ext4_file_inode_operations; |
| @@ -4936,7 +4912,6 @@ struct inode *ext4_iget(struct super_block *sb, unsigned long ino) | |||
| 4936 | init_special_inode(inode, inode->i_mode, | 4912 | init_special_inode(inode, inode->i_mode, |
| 4937 | new_decode_dev(le32_to_cpu(raw_inode->i_block[1]))); | 4913 | new_decode_dev(le32_to_cpu(raw_inode->i_block[1]))); |
| 4938 | } else { | 4914 | } else { |
| 4939 | brelse(bh); | ||
| 4940 | ret = -EIO; | 4915 | ret = -EIO; |
| 4941 | ext4_error(inode->i_sb, __func__, | 4916 | ext4_error(inode->i_sb, __func__, |
| 4942 | "bogus i_mode (%o) for inode=%lu", | 4917 | "bogus i_mode (%o) for inode=%lu", |
| @@ -4949,6 +4924,7 @@ struct inode *ext4_iget(struct super_block *sb, unsigned long ino) | |||
| 4949 | return inode; | 4924 | return inode; |
| 4950 | 4925 | ||
| 4951 | bad_inode: | 4926 | bad_inode: |
| 4927 | brelse(iloc.bh); | ||
| 4952 | iget_failed(inode); | 4928 | iget_failed(inode); |
| 4953 | return ERR_PTR(ret); | 4929 | return ERR_PTR(ret); |
| 4954 | } | 4930 | } |
| @@ -5108,6 +5084,7 @@ static int ext4_do_update_inode(handle_t *handle, | |||
| 5108 | err = rc; | 5084 | err = rc; |
| 5109 | ei->i_state &= ~EXT4_STATE_NEW; | 5085 | ei->i_state &= ~EXT4_STATE_NEW; |
| 5110 | 5086 | ||
| 5087 | ext4_update_inode_fsync_trans(handle, inode, 0); | ||
| 5111 | out_brelse: | 5088 | out_brelse: |
| 5112 | brelse(bh); | 5089 | brelse(bh); |
| 5113 | ext4_std_error(inode->i_sb, err); | 5090 | ext4_std_error(inode->i_sb, err); |
| @@ -5227,8 +5204,8 @@ int ext4_setattr(struct dentry *dentry, struct iattr *attr) | |||
| 5227 | 5204 | ||
| 5228 | /* (user+group)*(old+new) structure, inode write (sb, | 5205 | /* (user+group)*(old+new) structure, inode write (sb, |
| 5229 | * inode block, ? - but truncate inode update has it) */ | 5206 | * inode block, ? - but truncate inode update has it) */ |
| 5230 | handle = ext4_journal_start(inode, 2*(EXT4_QUOTA_INIT_BLOCKS(inode->i_sb)+ | 5207 | handle = ext4_journal_start(inode, (EXT4_MAXQUOTAS_INIT_BLOCKS(inode->i_sb)+ |
| 5231 | EXT4_QUOTA_DEL_BLOCKS(inode->i_sb))+3); | 5208 | EXT4_MAXQUOTAS_DEL_BLOCKS(inode->i_sb))+3); |
| 5232 | if (IS_ERR(handle)) { | 5209 | if (IS_ERR(handle)) { |
| 5233 | error = PTR_ERR(handle); | 5210 | error = PTR_ERR(handle); |
| 5234 | goto err_out; | 5211 | goto err_out; |
| @@ -5376,7 +5353,7 @@ static int ext4_index_trans_blocks(struct inode *inode, int nrblocks, int chunk) | |||
| 5376 | * worse case, the indexs blocks spread over different block groups | 5353 | * worse case, the indexs blocks spread over different block groups |
| 5377 | * | 5354 | * |
| 5378 | * If datablocks are discontiguous, they are possible to spread over | 5355 | * If datablocks are discontiguous, they are possible to spread over |
| 5379 | * different block groups too. If they are contiugous, with flexbg, | 5356 | * different block groups too. If they are contiuguous, with flexbg, |
| 5380 | * they could still across block group boundary. | 5357 | * they could still across block group boundary. |
| 5381 | * | 5358 | * |
| 5382 | * Also account for superblock, inode, quota and xattr blocks | 5359 | * Also account for superblock, inode, quota and xattr blocks |
| @@ -5452,7 +5429,7 @@ int ext4_writepage_trans_blocks(struct inode *inode) | |||
| 5452 | * Calculate the journal credits for a chunk of data modification. | 5429 | * Calculate the journal credits for a chunk of data modification. |
| 5453 | * | 5430 | * |
| 5454 | * This is called from DIO, fallocate or whoever calling | 5431 | * This is called from DIO, fallocate or whoever calling |
| 5455 | * ext4_get_blocks() to map/allocate a chunk of contigous disk blocks. | 5432 | * ext4_get_blocks() to map/allocate a chunk of contiguous disk blocks. |
| 5456 | * | 5433 | * |
| 5457 | * journal buffers for data blocks are not included here, as DIO | 5434 | * journal buffers for data blocks are not included here, as DIO |
| 5458 | * and fallocate do no need to journal data buffers. | 5435 | * and fallocate do no need to journal data buffers. |
