diff options
Diffstat (limited to 'fs/nilfs2/file.c')
| -rw-r--r-- | fs/nilfs2/file.c | 12 | 
1 files changed, 10 insertions, 2 deletions
diff --git a/fs/nilfs2/file.c b/fs/nilfs2/file.c index d7eeca62feb..26601529dc1 100644 --- a/fs/nilfs2/file.c +++ b/fs/nilfs2/file.c @@ -27,7 +27,7 @@  #include "nilfs.h"  #include "segment.h" -int nilfs_sync_file(struct file *file, int datasync) +int nilfs_sync_file(struct file *file, loff_t start, loff_t end, int datasync)  {  	/*  	 * Called from fsync() system call @@ -40,8 +40,15 @@ int nilfs_sync_file(struct file *file, int datasync)  	struct inode *inode = file->f_mapping->host;  	int err; -	if (!nilfs_inode_dirty(inode)) +	err = filemap_write_and_wait_range(inode->i_mapping, start, end); +	if (err) +		return err; +	mutex_lock(&inode->i_mutex); + +	if (!nilfs_inode_dirty(inode)) { +		mutex_unlock(&inode->i_mutex);  		return 0; +	}  	if (datasync)  		err = nilfs_construct_dsync_segment(inode->i_sb, inode, 0, @@ -49,6 +56,7 @@ int nilfs_sync_file(struct file *file, int datasync)  	else  		err = nilfs_construct_segment(inode->i_sb); +	mutex_unlock(&inode->i_mutex);  	return err;  }  |