diff options
Diffstat (limited to 'fs/udf/file.c')
| -rw-r--r-- | fs/udf/file.c | 31 | 
1 files changed, 20 insertions, 11 deletions
diff --git a/fs/udf/file.c b/fs/udf/file.c index c02a27a19c6..d80738fdf42 100644 --- a/fs/udf/file.c +++ b/fs/udf/file.c @@ -119,8 +119,8 @@ static int udf_adinicb_write_end(struct file *file,  }  static ssize_t udf_adinicb_direct_IO(int rw, struct kiocb *iocb, -				     const struct iovec *iov, -				     loff_t offset, unsigned long nr_segs) +				     struct iov_iter *iter, +				     loff_t offset)  {  	/* Fallback to buffered I/O. */  	return 0; @@ -134,8 +134,7 @@ const struct address_space_operations udf_adinicb_aops = {  	.direct_IO	= udf_adinicb_direct_IO,  }; -static ssize_t udf_file_aio_write(struct kiocb *iocb, const struct iovec *iov, -				  unsigned long nr_segs, loff_t ppos) +static ssize_t udf_file_write_iter(struct kiocb *iocb, struct iov_iter *from)  {  	ssize_t retval;  	struct file *file = iocb->ki_filp; @@ -144,18 +143,20 @@ static ssize_t udf_file_aio_write(struct kiocb *iocb, const struct iovec *iov,  	size_t count = iocb->ki_nbytes;  	struct udf_inode_info *iinfo = UDF_I(inode); +	mutex_lock(&inode->i_mutex);  	down_write(&iinfo->i_data_sem);  	if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB) {  		if (file->f_flags & O_APPEND)  			pos = inode->i_size;  		else -			pos = ppos; +			pos = iocb->ki_pos;  		if (inode->i_sb->s_blocksize <  				(udf_file_entry_alloc_offset(inode) +  						pos + count)) {  			err = udf_expand_file_adinicb(inode);  			if (err) { +				mutex_unlock(&inode->i_mutex);  				udf_debug("udf_expand_adinicb: err=%d\n", err);  				return err;  			} @@ -169,9 +170,17 @@ static ssize_t udf_file_aio_write(struct kiocb *iocb, const struct iovec *iov,  	} else  		up_write(&iinfo->i_data_sem); -	retval = generic_file_aio_write(iocb, iov, nr_segs, ppos); -	if (retval > 0) +	retval = __generic_file_write_iter(iocb, from); +	mutex_unlock(&inode->i_mutex); + +	if (retval > 0) { +		ssize_t err; +  		mark_inode_dirty(inode); +		err = generic_write_sync(file, iocb->ki_pos - retval, retval); +		if (err < 0) +			retval = err; +	}  	return retval;  } @@ -242,13 +251,13 @@ static int udf_release_file(struct inode *inode, struct file *filp)  }  const struct file_operations udf_file_operations = { -	.read			= do_sync_read, -	.aio_read		= generic_file_aio_read, +	.read			= new_sync_read, +	.read_iter		= generic_file_read_iter,  	.unlocked_ioctl		= udf_ioctl,  	.open			= generic_file_open,  	.mmap			= generic_file_mmap, -	.write			= do_sync_write, -	.aio_write		= udf_file_aio_write, +	.write			= new_sync_write, +	.write_iter		= udf_file_write_iter,  	.release		= udf_release_file,  	.fsync			= generic_file_fsync,  	.splice_read		= generic_file_splice_read,  | 
