aboutsummaryrefslogtreecommitdiffstats
path: root/fs/udf
diff options
context:
space:
mode:
authorAl Viro <viro@zeniv.linux.org.uk>2015-04-07 15:26:36 -0400
committerAl Viro <viro@zeniv.linux.org.uk>2015-04-11 22:29:50 -0400
commit165f1a6e300d5a1ffb57cf9a9c8762de731228f2 (patch)
treefadc5427bf20e6b335d157c725d60374300794bd /fs/udf
parent6b775b18eecf60b8a44723e05f8eb6251b71a7a9 (diff)
udf_file_write_iter: reorder and simplify
it's easier to do generic_write_checks() first Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'fs/udf')
-rw-r--r--fs/udf/file.c34
1 files changed, 14 insertions, 20 deletions
diff --git a/fs/udf/file.c b/fs/udf/file.c
index 6834509a7e5a..ccab8b78e363 100644
--- a/fs/udf/file.c
+++ b/fs/udf/file.c
@@ -120,21 +120,27 @@ static ssize_t udf_file_write_iter(struct kiocb *iocb, struct iov_iter *from)
120 ssize_t retval; 120 ssize_t retval;
121 struct file *file = iocb->ki_filp; 121 struct file *file = iocb->ki_filp;
122 struct inode *inode = file_inode(file); 122 struct inode *inode = file_inode(file);
123 int err, pos;
124 size_t count = iov_iter_count(from); 123 size_t count = iov_iter_count(from);
125 struct udf_inode_info *iinfo = UDF_I(inode); 124 struct udf_inode_info *iinfo = UDF_I(inode);
125 int err;
126 126
127 mutex_lock(&inode->i_mutex); 127 mutex_lock(&inode->i_mutex);
128
129 retval = generic_write_checks(file, &iocb->ki_pos, &count);
130 if (retval)
131 goto out;
132
133 if (count == 0)
134 goto out;
135
136 iov_iter_truncate(from, count);
137
128 down_write(&iinfo->i_data_sem); 138 down_write(&iinfo->i_data_sem);
129 if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB) { 139 if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB) {
130 if (file->f_flags & O_APPEND) 140 loff_t end = iocb->ki_pos + iov_iter_count(from);
131 pos = inode->i_size;
132 else
133 pos = iocb->ki_pos;
134 141
135 if (inode->i_sb->s_blocksize < 142 if (inode->i_sb->s_blocksize <
136 (udf_file_entry_alloc_offset(inode) + 143 (udf_file_entry_alloc_offset(inode) + end)) {
137 pos + count)) {
138 err = udf_expand_file_adinicb(inode); 144 err = udf_expand_file_adinicb(inode);
139 if (err) { 145 if (err) {
140 mutex_unlock(&inode->i_mutex); 146 mutex_unlock(&inode->i_mutex);
@@ -142,24 +148,12 @@ static ssize_t udf_file_write_iter(struct kiocb *iocb, struct iov_iter *from)
142 return err; 148 return err;
143 } 149 }
144 } else { 150 } else {
145 if (pos + count > inode->i_size) 151 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); 152 up_write(&iinfo->i_data_sem);
150 } 153 }
151 } else 154 } else
152 up_write(&iinfo->i_data_sem); 155 up_write(&iinfo->i_data_sem);
153 156
154 retval = generic_write_checks(file, &iocb->ki_pos, &count);
155 if (retval)
156 goto out;
157
158 if (count == 0)
159 goto out;
160
161 iov_iter_truncate(from, count);
162
163 retval = __generic_file_write_iter(iocb, from); 157 retval = __generic_file_write_iter(iocb, from);
164out: 158out:
165 mutex_unlock(&inode->i_mutex); 159 mutex_unlock(&inode->i_mutex);