aboutsummaryrefslogtreecommitdiffstats
path: root/fs/udf/file.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/udf/file.c')
-rw-r--r--fs/udf/file.c25
1 files changed, 11 insertions, 14 deletions
diff --git a/fs/udf/file.c b/fs/udf/file.c
index f77f7681288f..5dadad9960b9 100644
--- a/fs/udf/file.c
+++ b/fs/udf/file.c
@@ -99,8 +99,7 @@ static int udf_adinicb_write_begin(struct file *file,
99 return 0; 99 return 0;
100} 100}
101 101
102static ssize_t udf_adinicb_direct_IO(int rw, struct kiocb *iocb, 102static ssize_t udf_adinicb_direct_IO(struct kiocb *iocb, struct iov_iter *iter,
103 struct iov_iter *iter,
104 loff_t offset) 103 loff_t offset)
105{ 104{
106 /* Fallback to buffered I/O. */ 105 /* Fallback to buffered I/O. */
@@ -120,21 +119,21 @@ static ssize_t udf_file_write_iter(struct kiocb *iocb, struct iov_iter *from)
120 ssize_t retval; 119 ssize_t retval;
121 struct file *file = iocb->ki_filp; 120 struct file *file = iocb->ki_filp;
122 struct inode *inode = file_inode(file); 121 struct inode *inode = file_inode(file);
123 int err, pos;
124 size_t count = iov_iter_count(from);
125 struct udf_inode_info *iinfo = UDF_I(inode); 122 struct udf_inode_info *iinfo = UDF_I(inode);
123 int err;
126 124
127 mutex_lock(&inode->i_mutex); 125 mutex_lock(&inode->i_mutex);
126
127 retval = generic_write_checks(iocb, from);
128 if (retval <= 0)
129 goto out;
130
128 down_write(&iinfo->i_data_sem); 131 down_write(&iinfo->i_data_sem);
129 if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB) { 132 if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB) {
130 if (file->f_flags & O_APPEND) 133 loff_t end = iocb->ki_pos + iov_iter_count(from);
131 pos = inode->i_size;
132 else
133 pos = iocb->ki_pos;
134 134
135 if (inode->i_sb->s_blocksize < 135 if (inode->i_sb->s_blocksize <
136 (udf_file_entry_alloc_offset(inode) + 136 (udf_file_entry_alloc_offset(inode) + end)) {
137 pos + count)) {
138 err = udf_expand_file_adinicb(inode); 137 err = udf_expand_file_adinicb(inode);
139 if (err) { 138 if (err) {
140 mutex_unlock(&inode->i_mutex); 139 mutex_unlock(&inode->i_mutex);
@@ -142,16 +141,14 @@ static ssize_t udf_file_write_iter(struct kiocb *iocb, struct iov_iter *from)
142 return err; 141 return err;
143 } 142 }
144 } else { 143 } else {
145 if (pos + count > inode->i_size) 144 iinfo->i_lenAlloc = max(end, inode->i_size);
146 iinfo->i_lenAlloc = pos + count;
147 else
148 iinfo->i_lenAlloc = inode->i_size;
149 up_write(&iinfo->i_data_sem); 145 up_write(&iinfo->i_data_sem);
150 } 146 }
151 } else 147 } else
152 up_write(&iinfo->i_data_sem); 148 up_write(&iinfo->i_data_sem);
153 149
154 retval = __generic_file_write_iter(iocb, from); 150 retval = __generic_file_write_iter(iocb, from);
151out:
155 mutex_unlock(&inode->i_mutex); 152 mutex_unlock(&inode->i_mutex);
156 153
157 if (retval > 0) { 154 if (retval > 0) {