diff options
Diffstat (limited to 'fs/udf/file.c')
| -rw-r--r-- | fs/udf/file.c | 14 | 
1 files changed, 12 insertions, 2 deletions
| diff --git a/fs/udf/file.c b/fs/udf/file.c index c02a27a19c6d..1037637957c7 100644 --- a/fs/udf/file.c +++ b/fs/udf/file.c @@ -144,6 +144,7 @@ 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) @@ -156,6 +157,7 @@ static ssize_t udf_file_aio_write(struct kiocb *iocb, const struct iovec *iov,  						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 +171,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_aio_write(iocb, iov, nr_segs, &iocb->ki_pos); +	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;  } |