diff options
Diffstat (limited to 'fs/exofs/file.c')
| -rw-r--r-- | fs/exofs/file.c | 34 | 
1 files changed, 14 insertions, 20 deletions
diff --git a/fs/exofs/file.c b/fs/exofs/file.c index b905c79b4f0..71bf8e4fb5d 100644 --- a/fs/exofs/file.c +++ b/fs/exofs/file.c @@ -42,25 +42,19 @@ static int exofs_release_file(struct inode *inode, struct file *filp)   *   Note, in exofs all metadata is written as part of inode, regardless.   *   The writeout is synchronous   */ -static int exofs_file_fsync(struct file *filp, int datasync) +static int exofs_file_fsync(struct file *filp, loff_t start, loff_t end, +			    int datasync)  { -	int ret;  	struct inode *inode = filp->f_mapping->host; -	struct super_block *sb; - -	if (!(inode->i_state & I_DIRTY)) -		return 0; -	if (datasync && !(inode->i_state & I_DIRTY_DATASYNC)) -		return 0; - -	ret = sync_inode_metadata(inode, 1); +	int ret; -	/* This is a good place to write the sb */ -	/* TODO: Sechedule an sb-sync on create */ -	sb = inode->i_sb; -	if (sb->s_dirt) -		exofs_sync_fs(sb, 1); +	ret = filemap_write_and_wait_range(inode->i_mapping, start, end); +	if (ret) +		return ret; +	mutex_lock(&inode->i_mutex); +	ret = sync_inode_metadata(filp->f_mapping->host, 1); +	mutex_unlock(&inode->i_mutex);  	return ret;  } @@ -73,17 +67,17 @@ static int exofs_flush(struct file *file, fl_owner_t id)  const struct file_operations exofs_file_operations = {  	.llseek		= generic_file_llseek, -	.read		= do_sync_read, -	.write		= do_sync_write, -	.aio_read	= generic_file_aio_read, -	.aio_write	= generic_file_aio_write, +	.read		= new_sync_read, +	.write		= new_sync_write, +	.read_iter	= generic_file_read_iter, +	.write_iter	= generic_file_write_iter,  	.mmap		= generic_file_mmap,  	.open		= generic_file_open,  	.release	= exofs_release_file,  	.fsync		= exofs_file_fsync,  	.flush		= exofs_flush,  	.splice_read	= generic_file_splice_read, -	.splice_write	= generic_file_splice_write, +	.splice_write	= iter_file_splice_write,  };  const struct inode_operations exofs_file_inode_operations = {  | 
