diff options
Diffstat (limited to 'fs/ext3/fsync.c')
| -rw-r--r-- | fs/ext3/fsync.c | 18 | 
1 files changed, 16 insertions, 2 deletions
| diff --git a/fs/ext3/fsync.c b/fs/ext3/fsync.c index 09b13bb34c94..0bcf63adb80a 100644 --- a/fs/ext3/fsync.c +++ b/fs/ext3/fsync.c @@ -43,7 +43,7 @@   * inode to disk.   */ -int ext3_sync_file(struct file *file, int datasync) +int ext3_sync_file(struct file *file, loff_t start, loff_t end, int datasync)  {  	struct inode *inode = file->f_mapping->host;  	struct ext3_inode_info *ei = EXT3_I(inode); @@ -54,6 +54,17 @@ int ext3_sync_file(struct file *file, int datasync)  	if (inode->i_sb->s_flags & MS_RDONLY)  		return 0; +	ret = filemap_write_and_wait_range(inode->i_mapping, start, end); +	if (ret) +		return ret; + +	/* +	 * Taking the mutex here just to keep consistent with how fsync was +	 * called previously, however it looks like we don't need to take +	 * i_mutex at all. +	 */ +	mutex_lock(&inode->i_mutex); +  	J_ASSERT(ext3_journal_current_handle() == NULL);  	/* @@ -70,8 +81,10 @@ int ext3_sync_file(struct file *file, int datasync)  	 *  (they were dirtied by commit).  But that's OK - the blocks are  	 *  safe in-journal, which is all fsync() needs to ensure.  	 */ -	if (ext3_should_journal_data(inode)) +	if (ext3_should_journal_data(inode)) { +		mutex_unlock(&inode->i_mutex);  		return ext3_force_commit(inode->i_sb); +	}  	if (datasync)  		commit_tid = atomic_read(&ei->i_datasync_tid); @@ -91,5 +104,6 @@ int ext3_sync_file(struct file *file, int datasync)  	 */  	if (needs_barrier)  		blkdev_issue_flush(inode->i_sb->s_bdev, GFP_KERNEL, NULL); +	mutex_unlock(&inode->i_mutex);  	return ret;  } |