hc
2024-09-20 cf4ce59b3b70238352c7f1729f0f7223214828ad
kernel/fs/udf/file.c
....@@ -50,7 +50,7 @@
5050 * So just sample it once and use the same value everywhere.
5151 */
5252 kaddr = kmap_atomic(page);
53
- memcpy(kaddr, iinfo->i_ext.i_data + iinfo->i_lenEAttr, isize);
53
+ memcpy(kaddr, iinfo->i_data + iinfo->i_lenEAttr, isize);
5454 memset(kaddr + isize, 0, PAGE_SIZE - isize);
5555 flush_dcache_page(page);
5656 SetPageUptodate(page);
....@@ -76,8 +76,7 @@
7676 BUG_ON(!PageLocked(page));
7777
7878 kaddr = kmap_atomic(page);
79
- memcpy(iinfo->i_ext.i_data + iinfo->i_lenEAttr, kaddr,
80
- i_size_read(inode));
79
+ memcpy(iinfo->i_data + iinfo->i_lenEAttr, kaddr, i_size_read(inode));
8180 SetPageUptodate(page);
8281 kunmap_atomic(kaddr);
8382 mark_inode_dirty(inode);
....@@ -148,26 +147,24 @@
148147 goto out;
149148
150149 down_write(&iinfo->i_data_sem);
151
- if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB) {
152
- loff_t end = iocb->ki_pos + iov_iter_count(from);
153
-
154
- if (inode->i_sb->s_blocksize <
155
- (udf_file_entry_alloc_offset(inode) + end)) {
156
- err = udf_expand_file_adinicb(inode);
157
- if (err) {
158
- inode_unlock(inode);
159
- udf_debug("udf_expand_adinicb: err=%d\n", err);
160
- return err;
161
- }
162
- } else {
163
- iinfo->i_lenAlloc = max(end, inode->i_size);
164
- up_write(&iinfo->i_data_sem);
150
+ if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB &&
151
+ inode->i_sb->s_blocksize < (udf_file_entry_alloc_offset(inode) +
152
+ iocb->ki_pos + iov_iter_count(from))) {
153
+ err = udf_expand_file_adinicb(inode);
154
+ if (err) {
155
+ inode_unlock(inode);
156
+ udf_debug("udf_expand_adinicb: err=%d\n", err);
157
+ return err;
165158 }
166159 } else
167160 up_write(&iinfo->i_data_sem);
168161
169162 retval = __generic_file_write_iter(iocb, from);
170163 out:
164
+ down_write(&iinfo->i_data_sem);
165
+ if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB && retval > 0)
166
+ iinfo->i_lenAlloc = inode->i_size;
167
+ up_write(&iinfo->i_data_sem);
171168 inode_unlock(inode);
172169
173170 if (retval > 0) {
....@@ -215,7 +212,7 @@
215212 return put_user(UDF_I(inode)->i_lenEAttr, (int __user *)arg);
216213 case UDF_GETEABLOCK:
217214 return copy_to_user((char __user *)arg,
218
- UDF_I(inode)->i_ext.i_data,
215
+ UDF_I(inode)->i_data,
219216 UDF_I(inode)->i_lenEAttr) ? -EFAULT : 0;
220217 default:
221218 return -ENOIOCTLCMD;
....@@ -280,6 +277,9 @@
280277 return error;
281278 }
282279
280
+ if (attr->ia_valid & ATTR_MODE)
281
+ udf_update_extra_perms(inode, attr->ia_mode);
282
+
283283 setattr_copy(inode, attr);
284284 mark_inode_dirty(inode);
285285 return 0;