aboutsummaryrefslogtreecommitdiffstats
path: root/fs/ext4/inode.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/ext4/inode.c')
-rw-r--r--fs/ext4/inode.c20
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
4195static void ext4_wait_dax_page(struct ext4_inode_info *ei, bool *did_unlock) 4200static 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;