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 | |
| 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>
| -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); |
