diff options
Diffstat (limited to 'fs/ext4/inode.c')
-rw-r--r-- | fs/ext4/inode.c | 20 |
1 files changed, 11 insertions, 9 deletions
diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index d0dd585add6a..d767e993591d 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c | |||
@@ -3413,12 +3413,16 @@ static int ext4_iomap_begin(struct inode *inode, loff_t offset, loff_t length, | |||
3413 | { | 3413 | { |
3414 | struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb); | 3414 | struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb); |
3415 | unsigned int blkbits = inode->i_blkbits; | 3415 | unsigned int blkbits = inode->i_blkbits; |
3416 | unsigned long first_block = offset >> blkbits; | 3416 | unsigned long first_block, last_block; |
3417 | unsigned long last_block = (offset + length - 1) >> blkbits; | ||
3418 | struct ext4_map_blocks map; | 3417 | struct ext4_map_blocks map; |
3419 | bool delalloc = false; | 3418 | bool delalloc = false; |
3420 | int ret; | 3419 | int ret; |
3421 | 3420 | ||
3421 | if ((offset >> blkbits) > EXT4_MAX_LOGICAL_BLOCK) | ||
3422 | return -EINVAL; | ||
3423 | first_block = offset >> blkbits; | ||
3424 | last_block = min_t(loff_t, (offset + length - 1) >> blkbits, | ||
3425 | EXT4_MAX_LOGICAL_BLOCK); | ||
3422 | 3426 | ||
3423 | if (flags & IOMAP_REPORT) { | 3427 | if (flags & IOMAP_REPORT) { |
3424 | if (ext4_has_inline_data(inode)) { | 3428 | if (ext4_has_inline_data(inode)) { |
@@ -3948,6 +3952,7 @@ static const struct address_space_operations ext4_dax_aops = { | |||
3948 | .writepages = ext4_dax_writepages, | 3952 | .writepages = ext4_dax_writepages, |
3949 | .direct_IO = noop_direct_IO, | 3953 | .direct_IO = noop_direct_IO, |
3950 | .set_page_dirty = noop_set_page_dirty, | 3954 | .set_page_dirty = noop_set_page_dirty, |
3955 | .bmap = ext4_bmap, | ||
3951 | .invalidatepage = noop_invalidatepage, | 3956 | .invalidatepage = noop_invalidatepage, |
3952 | }; | 3957 | }; |
3953 | 3958 | ||
@@ -4192,9 +4197,8 @@ int ext4_update_disksize_before_punch(struct inode *inode, loff_t offset, | |||
4192 | return 0; | 4197 | return 0; |
4193 | } | 4198 | } |
4194 | 4199 | ||
4195 | static void ext4_wait_dax_page(struct ext4_inode_info *ei, bool *did_unlock) | 4200 | static void ext4_wait_dax_page(struct ext4_inode_info *ei) |
4196 | { | 4201 | { |
4197 | *did_unlock = true; | ||
4198 | up_write(&ei->i_mmap_sem); | 4202 | up_write(&ei->i_mmap_sem); |
4199 | schedule(); | 4203 | schedule(); |
4200 | down_write(&ei->i_mmap_sem); | 4204 | down_write(&ei->i_mmap_sem); |
@@ -4204,14 +4208,12 @@ int ext4_break_layouts(struct inode *inode) | |||
4204 | { | 4208 | { |
4205 | struct ext4_inode_info *ei = EXT4_I(inode); | 4209 | struct ext4_inode_info *ei = EXT4_I(inode); |
4206 | struct page *page; | 4210 | struct page *page; |
4207 | bool retry; | ||
4208 | int error; | 4211 | int error; |
4209 | 4212 | ||
4210 | if (WARN_ON_ONCE(!rwsem_is_locked(&ei->i_mmap_sem))) | 4213 | if (WARN_ON_ONCE(!rwsem_is_locked(&ei->i_mmap_sem))) |
4211 | return -EINVAL; | 4214 | return -EINVAL; |
4212 | 4215 | ||
4213 | do { | 4216 | do { |
4214 | retry = false; | ||
4215 | page = dax_layout_busy_page(inode->i_mapping); | 4217 | page = dax_layout_busy_page(inode->i_mapping); |
4216 | if (!page) | 4218 | if (!page) |
4217 | return 0; | 4219 | return 0; |
@@ -4219,8 +4221,8 @@ int ext4_break_layouts(struct inode *inode) | |||
4219 | error = ___wait_var_event(&page->_refcount, | 4221 | error = ___wait_var_event(&page->_refcount, |
4220 | atomic_read(&page->_refcount) == 1, | 4222 | atomic_read(&page->_refcount) == 1, |
4221 | TASK_INTERRUPTIBLE, 0, 0, | 4223 | TASK_INTERRUPTIBLE, 0, 0, |
4222 | ext4_wait_dax_page(ei, &retry)); | 4224 | ext4_wait_dax_page(ei)); |
4223 | } while (error == 0 && retry); | 4225 | } while (error == 0); |
4224 | 4226 | ||
4225 | return error; | 4227 | return error; |
4226 | } | 4228 | } |
@@ -4895,6 +4897,7 @@ struct inode *ext4_iget(struct super_block *sb, unsigned long ino) | |||
4895 | * not initialized on a new filesystem. */ | 4897 | * not initialized on a new filesystem. */ |
4896 | } | 4898 | } |
4897 | ei->i_flags = le32_to_cpu(raw_inode->i_flags); | 4899 | ei->i_flags = le32_to_cpu(raw_inode->i_flags); |
4900 | ext4_set_inode_flags(inode); | ||
4898 | inode->i_blocks = ext4_inode_blocks(raw_inode, ei); | 4901 | inode->i_blocks = ext4_inode_blocks(raw_inode, ei); |
4899 | ei->i_file_acl = le32_to_cpu(raw_inode->i_file_acl_lo); | 4902 | ei->i_file_acl = le32_to_cpu(raw_inode->i_file_acl_lo); |
4900 | if (ext4_has_feature_64bit(sb)) | 4903 | if (ext4_has_feature_64bit(sb)) |
@@ -5041,7 +5044,6 @@ struct inode *ext4_iget(struct super_block *sb, unsigned long ino) | |||
5041 | goto bad_inode; | 5044 | goto bad_inode; |
5042 | } | 5045 | } |
5043 | brelse(iloc.bh); | 5046 | brelse(iloc.bh); |
5044 | ext4_set_inode_flags(inode); | ||
5045 | 5047 | ||
5046 | unlock_new_inode(inode); | 5048 | unlock_new_inode(inode); |
5047 | return inode; | 5049 | return inode; |