diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2015-04-07 15:26:36 -0400 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2015-04-11 22:29:50 -0400 |
commit | 165f1a6e300d5a1ffb57cf9a9c8762de731228f2 (patch) | |
tree | fadc5427bf20e6b335d157c725d60374300794bd /fs/udf | |
parent | 6b775b18eecf60b8a44723e05f8eb6251b71a7a9 (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.c | 34 |
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); |
164 | out: | 158 | out: |
165 | mutex_unlock(&inode->i_mutex); | 159 | mutex_unlock(&inode->i_mutex); |