hc
2024-02-20 102a0743326a03cd1a1202ceda21e175b7d3575c
kernel/fs/hfsplus/ioctl.c
....@@ -57,9 +57,8 @@
5757 return 0;
5858 }
5959
60
-static int hfsplus_ioctl_getflags(struct file *file, int __user *user_flags)
60
+static inline unsigned int hfsplus_getflags(struct inode *inode)
6161 {
62
- struct inode *inode = file_inode(file);
6362 struct hfsplus_inode_info *hip = HFSPLUS_I(inode);
6463 unsigned int flags = 0;
6564
....@@ -69,6 +68,13 @@
6968 flags |= FS_APPEND_FL;
7069 if (hip->userflags & HFSPLUS_FLG_NODUMP)
7170 flags |= FS_NODUMP_FL;
71
+ return flags;
72
+}
73
+
74
+static int hfsplus_ioctl_getflags(struct file *file, int __user *user_flags)
75
+{
76
+ struct inode *inode = file_inode(file);
77
+ unsigned int flags = hfsplus_getflags(inode);
7278
7379 return put_user(flags, user_flags);
7480 }
....@@ -78,6 +84,7 @@
7884 struct inode *inode = file_inode(file);
7985 struct hfsplus_inode_info *hip = HFSPLUS_I(inode);
8086 unsigned int flags, new_fl = 0;
87
+ unsigned int oldflags = hfsplus_getflags(inode);
8188 int err = 0;
8289
8390 err = mnt_want_write_file(file);
....@@ -96,13 +103,9 @@
96103
97104 inode_lock(inode);
98105
99
- if ((flags & (FS_IMMUTABLE_FL|FS_APPEND_FL)) ||
100
- inode->i_flags & (S_IMMUTABLE|S_APPEND)) {
101
- if (!capable(CAP_LINUX_IMMUTABLE)) {
102
- err = -EPERM;
103
- goto out_unlock_inode;
104
- }
105
- }
106
+ err = vfs_ioc_setflags_prepare(inode, oldflags, flags);
107
+ if (err)
108
+ goto out_unlock_inode;
106109
107110 /* don't silently ignore unsupported ext2 flags */
108111 if (flags & ~(FS_IMMUTABLE_FL|FS_APPEND_FL|FS_NODUMP_FL)) {