diff options
author | Toshi Kani <toshi.kani@hpe.com> | 2018-09-15 21:37:59 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2018-09-29 02:56:02 -0700 |
commit | ec215095ac28e564e1eddf333fd85394b6908be4 (patch) | |
tree | 45d07ccf82208f0666eafe8511bf39485773cf89 /fs | |
parent | e2dd3371bfd1bb30163d0cac205aa212be4bdf36 (diff) | |
download | linux-stable-ec215095ac28e564e1eddf333fd85394b6908be4.tar.gz linux-stable-ec215095ac28e564e1eddf333fd85394b6908be4.tar.bz2 linux-stable-ec215095ac28e564e1eddf333fd85394b6908be4.zip |
ext4, dax: set ext4_dax_aops for dax files
commit cce6c9f7e6029caee45c459db5b3e78fec6973cb upstream.
Sync syscall to DAX file needs to flush processor cache, but it
currently does not flush to existing DAX files. This is because
'ext4_da_aops' is set to address_space_operations of existing DAX
files, instead of 'ext4_dax_aops', since S_DAX flag is set after
ext4_set_aops() in the open path.
New file
--------
lookup_open
ext4_create
__ext4_new_inode
ext4_set_inode_flags // Set S_DAX flag
ext4_set_aops // Set aops to ext4_dax_aops
Existing file
-------------
lookup_open
ext4_lookup
ext4_iget
ext4_set_aops // Set aops to ext4_da_aops
ext4_set_inode_flags // Set S_DAX flag
Change ext4_iget() to initialize i_flags before ext4_set_aops().
Fixes: 5f0663bb4a64 ("ext4, dax: introduce ext4_dax_aops")
Signed-off-by: Toshi Kani <toshi.kani@hpe.com>
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
Suggested-by: Jan Kara <jack@suse.cz>
Cc: stable@vger.kernel.org
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'fs')
-rw-r--r-- | fs/ext4/inode.c | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index 6042c019ea54..2276137d0083 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c @@ -4861,6 +4861,7 @@ struct inode *ext4_iget(struct super_block *sb, unsigned long ino) * not initialized on a new filesystem. */ } ei->i_flags = le32_to_cpu(raw_inode->i_flags); + ext4_set_inode_flags(inode); inode->i_blocks = ext4_inode_blocks(raw_inode, ei); ei->i_file_acl = le32_to_cpu(raw_inode->i_file_acl_lo); if (ext4_has_feature_64bit(sb)) @@ -5010,7 +5011,6 @@ struct inode *ext4_iget(struct super_block *sb, unsigned long ino) goto bad_inode; } brelse(iloc.bh); - ext4_set_inode_flags(inode); unlock_new_inode(inode); return inode; |