mirror of
https://github.com/team-infusion-developers/android_kernel_samsung_msm8976.git
synced 2024-11-07 04:09:21 +00:00
ext4: Assure that metadata blocks are written during fsync in no journal mode
When there is no journal present, we must attach buffer heads associated with extent tree and indirect blocks to the inode's mapping->private_list via mark_buffer_dirty_inode() so that ext4_sync_file() --- which is called to service fsync() and fdatasync() system calls --- can write out the inode's metadata blocks by calling sync_mapping_buffers(). Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
This commit is contained in:
parent
c7acb4c166
commit
fe188c0e08
2 changed files with 11 additions and 3 deletions
|
@ -89,7 +89,10 @@ int __ext4_handle_dirty_metadata(const char *where, handle_t *handle,
|
|||
ext4_journal_abort_handle(where, __func__, bh,
|
||||
handle, err);
|
||||
} else {
|
||||
mark_buffer_dirty(bh);
|
||||
if (inode && bh)
|
||||
mark_buffer_dirty_inode(bh, inode);
|
||||
else
|
||||
mark_buffer_dirty(bh);
|
||||
if (inode && inode_needs_sync(inode)) {
|
||||
sync_dirty_buffer(bh);
|
||||
if (buffer_req(bh) && !buffer_uptodate(bh)) {
|
||||
|
|
|
@ -50,7 +50,7 @@ int ext4_sync_file(struct file *file, struct dentry *dentry, int datasync)
|
|||
{
|
||||
struct inode *inode = dentry->d_inode;
|
||||
journal_t *journal = EXT4_SB(inode->i_sb)->s_journal;
|
||||
int ret = 0;
|
||||
int err, ret = 0;
|
||||
|
||||
J_ASSERT(ext4_journal_current_handle() == NULL);
|
||||
|
||||
|
@ -79,6 +79,9 @@ int ext4_sync_file(struct file *file, struct dentry *dentry, int datasync)
|
|||
goto out;
|
||||
}
|
||||
|
||||
if (!journal)
|
||||
ret = sync_mapping_buffers(inode->i_mapping);
|
||||
|
||||
if (datasync && !(inode->i_state & I_DIRTY_DATASYNC))
|
||||
goto out;
|
||||
|
||||
|
@ -91,7 +94,9 @@ int ext4_sync_file(struct file *file, struct dentry *dentry, int datasync)
|
|||
.sync_mode = WB_SYNC_ALL,
|
||||
.nr_to_write = 0, /* sys_fsync did this */
|
||||
};
|
||||
ret = sync_inode(inode, &wbc);
|
||||
err = sync_inode(inode, &wbc);
|
||||
if (ret == 0)
|
||||
ret = err;
|
||||
}
|
||||
out:
|
||||
if (journal && (journal->j_flags & JBD2_BARRIER))
|
||||
|
|
Loading…
Reference in a new issue