diff options
Diffstat (limited to 'fs/ext4/inode.c')
| -rw-r--r-- | fs/ext4/inode.c | 15 | 
1 files changed, 15 insertions, 0 deletions
| diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index 31db875bc7a1..ee4d907a4251 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c @@ -3394,6 +3394,19 @@ static int ext4_releasepage(struct page *page, gfp_t wait)  }  #ifdef CONFIG_FS_DAX +static bool ext4_inode_datasync_dirty(struct inode *inode) +{ +	journal_t *journal = EXT4_SB(inode->i_sb)->s_journal; + +	if (journal) +		return !jbd2_transaction_committed(journal, +					EXT4_I(inode)->i_datasync_tid); +	/* Any metadata buffers to write? */ +	if (!list_empty(&inode->i_mapping->private_list)) +		return true; +	return inode->i_state & I_DIRTY_DATASYNC; +} +  static int ext4_iomap_begin(struct inode *inode, loff_t offset, loff_t length,  			    unsigned flags, struct iomap *iomap)  { @@ -3466,6 +3479,8 @@ retry:  	}  	iomap->flags = 0; +	if (ext4_inode_datasync_dirty(inode)) +		iomap->flags |= IOMAP_F_DIRTY;  	iomap->bdev = inode->i_sb->s_bdev;  	iomap->dax_dev = sbi->s_daxdev;  	iomap->offset = first_block << blkbits; | 
