hc
2024-05-10 748e4f3d702def1a4bff191e0cf93b6a05340f01
kernel/fs/fat/file.c
....@@ -1,3 +1,4 @@
1
+// SPDX-License-Identifier: GPL-2.0-only
12 /*
23 * linux/fs/fat/file.c
34 *
....@@ -24,9 +25,9 @@
2425 {
2526 u32 attr;
2627
27
- inode_lock(inode);
28
+ inode_lock_shared(inode);
2829 attr = fat_make_attrs(inode);
29
- inode_unlock(inode);
30
+ inode_unlock_shared(inode);
3031
3132 return put_user(attr, user_attr);
3233 }
....@@ -171,15 +172,6 @@
171172 }
172173 }
173174
174
-#ifdef CONFIG_COMPAT
175
-static long fat_generic_compat_ioctl(struct file *filp, unsigned int cmd,
176
- unsigned long arg)
177
-
178
-{
179
- return fat_generic_ioctl(filp, cmd, (unsigned long)compat_ptr(arg));
180
-}
181
-#endif
182
-
183175 static int fat_file_release(struct inode *inode, struct file *filp)
184176 {
185177 if ((filp->f_mode & FMODE_WRITE) &&
....@@ -203,7 +195,7 @@
203195 if (err)
204196 return err;
205197
206
- return blkdev_issue_flush(inode->i_sb->s_bdev, GFP_KERNEL, NULL);
198
+ return blkdev_issue_flush(inode->i_sb->s_bdev, GFP_KERNEL);
207199 }
208200
209201
....@@ -214,11 +206,10 @@
214206 .mmap = generic_file_mmap,
215207 .release = fat_file_release,
216208 .unlocked_ioctl = fat_generic_ioctl,
217
-#ifdef CONFIG_COMPAT
218
- .compat_ioctl = fat_generic_compat_ioctl,
219
-#endif
209
+ .compat_ioctl = compat_ptr_ioctl,
220210 .fsync = fat_file_fsync,
221211 .splice_read = generic_file_splice_read,
212
+ .splice_write = iter_file_splice_write,
222213 .fallocate = fat_fallocate,
223214 };
224215
....@@ -232,7 +223,7 @@
232223 if (err)
233224 goto out;
234225
235
- inode->i_ctime = inode->i_mtime = current_time(inode);
226
+ fat_truncate_time(inode, NULL, S_CTIME|S_MTIME);
236227 mark_inode_dirty(inode);
237228 if (IS_SYNC(inode)) {
238229 int err2;
....@@ -335,7 +326,7 @@
335326 MSDOS_I(inode)->i_logstart = 0;
336327 }
337328 MSDOS_I(inode)->i_attrs |= ATTR_ARCH;
338
- inode->i_ctime = inode->i_mtime = current_time(inode);
329
+ fat_truncate_time(inode, NULL, S_CTIME|S_MTIME);
339330 if (wait) {
340331 err = fat_sync_inode(inode);
341332 if (err) {
....@@ -547,6 +538,18 @@
547538 up_write(&MSDOS_I(inode)->truncate_lock);
548539 }
549540
541
+ /*
542
+ * setattr_copy can't truncate these appropriately, so we'll
543
+ * copy them ourselves
544
+ */
545
+ if (attr->ia_valid & ATTR_ATIME)
546
+ fat_truncate_time(inode, &attr->ia_atime, S_ATIME);
547
+ if (attr->ia_valid & ATTR_CTIME)
548
+ fat_truncate_time(inode, &attr->ia_ctime, S_CTIME);
549
+ if (attr->ia_valid & ATTR_MTIME)
550
+ fat_truncate_time(inode, &attr->ia_mtime, S_MTIME);
551
+ attr->ia_valid &= ~(ATTR_ATIME|ATTR_CTIME|ATTR_MTIME);
552
+
550553 setattr_copy(inode, attr);
551554 mark_inode_dirty(inode);
552555 out:
....@@ -557,4 +560,5 @@
557560 const struct inode_operations fat_file_inode_operations = {
558561 .setattr = fat_setattr,
559562 .getattr = fat_getattr,
563
+ .update_time = fat_update_time,
560564 };