diff options
Diffstat (limited to 'fs/ext4/inode.c')
| -rw-r--r-- | fs/ext4/inode.c | 47 | 
1 files changed, 17 insertions, 30 deletions
diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index d8de607849df..325c038e7b23 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c @@ -3950,20 +3950,19 @@ int ext4_update_disksize_before_punch(struct inode *inode, loff_t offset,  	return ret;  } -static void ext4_wait_dax_page(struct ext4_inode_info *ei) +static void ext4_wait_dax_page(struct inode *inode)  { -	up_write(&ei->i_mmap_sem); +	filemap_invalidate_unlock(inode->i_mapping);  	schedule(); -	down_write(&ei->i_mmap_sem); +	filemap_invalidate_lock(inode->i_mapping);  }  int ext4_break_layouts(struct inode *inode)  { -	struct ext4_inode_info *ei = EXT4_I(inode);  	struct page *page;  	int error; -	if (WARN_ON_ONCE(!rwsem_is_locked(&ei->i_mmap_sem))) +	if (WARN_ON_ONCE(!rwsem_is_locked(&inode->i_mapping->invalidate_lock)))  		return -EINVAL;  	do { @@ -3974,7 +3973,7 @@ int ext4_break_layouts(struct inode *inode)  		error = ___wait_var_event(&page->_refcount,  				atomic_read(&page->_refcount) == 1,  				TASK_INTERRUPTIBLE, 0, 0, -				ext4_wait_dax_page(ei)); +				ext4_wait_dax_page(inode));  	} while (error == 0);  	return error; @@ -4005,9 +4004,9 @@ int ext4_punch_hole(struct inode *inode, loff_t offset, loff_t length)  	ext4_clear_inode_state(inode, EXT4_STATE_MAY_INLINE_DATA);  	if (ext4_has_inline_data(inode)) { -		down_write(&EXT4_I(inode)->i_mmap_sem); +		filemap_invalidate_lock(mapping);  		ret = ext4_convert_inline_data(inode); -		up_write(&EXT4_I(inode)->i_mmap_sem); +		filemap_invalidate_unlock(mapping);  		if (ret)  			return ret;  	} @@ -4058,7 +4057,7 @@ int ext4_punch_hole(struct inode *inode, loff_t offset, loff_t length)  	 * Prevent page faults from reinstantiating pages we have released from  	 * page cache.  	 */ -	down_write(&EXT4_I(inode)->i_mmap_sem); +	filemap_invalidate_lock(mapping);  	ret = ext4_break_layouts(inode);  	if (ret) @@ -4131,7 +4130,7 @@ int ext4_punch_hole(struct inode *inode, loff_t offset, loff_t length)  out_stop:  	ext4_journal_stop(handle);  out_dio: -	up_write(&EXT4_I(inode)->i_mmap_sem); +	filemap_invalidate_unlock(mapping);  out_mutex:  	inode_unlock(inode);  	return ret; @@ -5426,11 +5425,11 @@ int ext4_setattr(struct user_namespace *mnt_userns, struct dentry *dentry,  			inode_dio_wait(inode);  		} -		down_write(&EXT4_I(inode)->i_mmap_sem); +		filemap_invalidate_lock(inode->i_mapping);  		rc = ext4_break_layouts(inode);  		if (rc) { -			up_write(&EXT4_I(inode)->i_mmap_sem); +			filemap_invalidate_unlock(inode->i_mapping);  			goto err_out;  		} @@ -5506,7 +5505,7 @@ int ext4_setattr(struct user_namespace *mnt_userns, struct dentry *dentry,  				error = rc;  		}  out_mmap_sem: -		up_write(&EXT4_I(inode)->i_mmap_sem); +		filemap_invalidate_unlock(inode->i_mapping);  	}  	if (!error) { @@ -5983,10 +5982,10 @@ int ext4_change_inode_journal_flag(struct inode *inode, int val)  	 * data (and journalled aops don't know how to handle these cases).  	 */  	if (val) { -		down_write(&EXT4_I(inode)->i_mmap_sem); +		filemap_invalidate_lock(inode->i_mapping);  		err = filemap_write_and_wait(inode->i_mapping);  		if (err < 0) { -			up_write(&EXT4_I(inode)->i_mmap_sem); +			filemap_invalidate_unlock(inode->i_mapping);  			return err;  		}  	} @@ -6019,7 +6018,7 @@ int ext4_change_inode_journal_flag(struct inode *inode, int val)  	percpu_up_write(&sbi->s_writepages_rwsem);  	if (val) -		up_write(&EXT4_I(inode)->i_mmap_sem); +		filemap_invalidate_unlock(inode->i_mapping);  	/* Finally we can mark the inode as dirty. */ @@ -6063,7 +6062,7 @@ vm_fault_t ext4_page_mkwrite(struct vm_fault *vmf)  	sb_start_pagefault(inode->i_sb);  	file_update_time(vma->vm_file); -	down_read(&EXT4_I(inode)->i_mmap_sem); +	filemap_invalidate_lock_shared(mapping);  	err = ext4_convert_inline_data(inode);  	if (err) @@ -6176,7 +6175,7 @@ retry_alloc:  out_ret:  	ret = block_page_mkwrite_return(err);  out: -	up_read(&EXT4_I(inode)->i_mmap_sem); +	filemap_invalidate_unlock_shared(mapping);  	sb_end_pagefault(inode->i_sb);  	return ret;  out_error: @@ -6184,15 +6183,3 @@ out_error:  	ext4_journal_stop(handle);  	goto out;  } - -vm_fault_t ext4_filemap_fault(struct vm_fault *vmf) -{ -	struct inode *inode = file_inode(vmf->vma->vm_file); -	vm_fault_t ret; - -	down_read(&EXT4_I(inode)->i_mmap_sem); -	ret = filemap_fault(vmf); -	up_read(&EXT4_I(inode)->i_mmap_sem); - -	return ret; -}  | 
