|
15 | 15 | #include <linux/blkdev.h> |
16 | 16 | #include <asm/current.h> |
17 | 17 | #include <linux/uaccess.h> |
| 18 | +#include <linux/fileattr.h> |
18 | 19 |
|
19 | 20 | #include "jfs_filsys.h" |
20 | 21 | #include "jfs_debug.h" |
@@ -56,69 +57,56 @@ static long jfs_map_ext2(unsigned long flags, int from) |
56 | 57 | return mapped; |
57 | 58 | } |
58 | 59 |
|
| 60 | +int jfs_fileattr_get(struct dentry *dentry, struct fileattr *fa) |
| 61 | +{ |
| 62 | + struct jfs_inode_info *jfs_inode = JFS_IP(d_inode(dentry)); |
| 63 | + unsigned int flags = jfs_inode->mode2 & JFS_FL_USER_VISIBLE; |
59 | 64 |
|
60 | | -long jfs_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) |
| 65 | + if (d_is_special(dentry)) |
| 66 | + return -ENOTTY; |
| 67 | + |
| 68 | + fileattr_fill_flags(fa, jfs_map_ext2(flags, 0)); |
| 69 | + |
| 70 | + return 0; |
| 71 | +} |
| 72 | + |
| 73 | +int jfs_fileattr_set(struct user_namespace *mnt_userns, |
| 74 | + struct dentry *dentry, struct fileattr *fa) |
61 | 75 | { |
62 | | - struct inode *inode = file_inode(filp); |
| 76 | + struct inode *inode = d_inode(dentry); |
63 | 77 | struct jfs_inode_info *jfs_inode = JFS_IP(inode); |
64 | 78 | unsigned int flags; |
65 | 79 |
|
66 | | - switch (cmd) { |
67 | | - case JFS_IOC_GETFLAGS: |
68 | | - flags = jfs_inode->mode2 & JFS_FL_USER_VISIBLE; |
69 | | - flags = jfs_map_ext2(flags, 0); |
70 | | - return put_user(flags, (int __user *) arg); |
71 | | - case JFS_IOC_SETFLAGS: { |
72 | | - unsigned int oldflags; |
73 | | - int err; |
74 | | - |
75 | | - err = mnt_want_write_file(filp); |
76 | | - if (err) |
77 | | - return err; |
78 | | - |
79 | | - if (!inode_owner_or_capable(&init_user_ns, inode)) { |
80 | | - err = -EACCES; |
81 | | - goto setflags_out; |
82 | | - } |
83 | | - if (get_user(flags, (int __user *) arg)) { |
84 | | - err = -EFAULT; |
85 | | - goto setflags_out; |
86 | | - } |
| 80 | + if (d_is_special(dentry)) |
| 81 | + return -ENOTTY; |
87 | 82 |
|
88 | | - flags = jfs_map_ext2(flags, 1); |
89 | | - if (!S_ISDIR(inode->i_mode)) |
90 | | - flags &= ~JFS_DIRSYNC_FL; |
| 83 | + if (fileattr_has_fsx(fa)) |
| 84 | + return -EOPNOTSUPP; |
91 | 85 |
|
92 | | - /* Is it quota file? Do not allow user to mess with it */ |
93 | | - if (IS_NOQUOTA(inode)) { |
94 | | - err = -EPERM; |
95 | | - goto setflags_out; |
96 | | - } |
| 86 | + flags = jfs_map_ext2(fa->flags, 1); |
| 87 | + if (!S_ISDIR(inode->i_mode)) |
| 88 | + flags &= ~JFS_DIRSYNC_FL; |
97 | 89 |
|
98 | | - /* Lock against other parallel changes of flags */ |
99 | | - inode_lock(inode); |
| 90 | + /* Is it quota file? Do not allow user to mess with it */ |
| 91 | + if (IS_NOQUOTA(inode)) |
| 92 | + return -EPERM; |
100 | 93 |
|
101 | | - oldflags = jfs_map_ext2(jfs_inode->mode2 & JFS_FL_USER_VISIBLE, |
102 | | - 0); |
103 | | - err = vfs_ioc_setflags_prepare(inode, oldflags, flags); |
104 | | - if (err) { |
105 | | - inode_unlock(inode); |
106 | | - goto setflags_out; |
107 | | - } |
| 94 | + flags = flags & JFS_FL_USER_MODIFIABLE; |
| 95 | + flags |= jfs_inode->mode2 & ~JFS_FL_USER_MODIFIABLE; |
| 96 | + jfs_inode->mode2 = flags; |
108 | 97 |
|
109 | | - flags = flags & JFS_FL_USER_MODIFIABLE; |
110 | | - flags |= jfs_inode->mode2 & ~JFS_FL_USER_MODIFIABLE; |
111 | | - jfs_inode->mode2 = flags; |
112 | | - |
113 | | - jfs_set_inode_flags(inode); |
114 | | - inode_unlock(inode); |
115 | | - inode->i_ctime = current_time(inode); |
116 | | - mark_inode_dirty(inode); |
117 | | -setflags_out: |
118 | | - mnt_drop_write_file(filp); |
119 | | - return err; |
120 | | - } |
| 98 | + jfs_set_inode_flags(inode); |
| 99 | + inode->i_ctime = current_time(inode); |
| 100 | + mark_inode_dirty(inode); |
| 101 | + |
| 102 | + return 0; |
| 103 | +} |
| 104 | + |
| 105 | +long jfs_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) |
| 106 | +{ |
| 107 | + struct inode *inode = file_inode(filp); |
121 | 108 |
|
| 109 | + switch (cmd) { |
122 | 110 | case FITRIM: |
123 | 111 | { |
124 | 112 | struct super_block *sb = inode->i_sb; |
@@ -156,22 +144,3 @@ long jfs_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) |
156 | 144 | return -ENOTTY; |
157 | 145 | } |
158 | 146 | } |
159 | | - |
160 | | -#ifdef CONFIG_COMPAT |
161 | | -long jfs_compat_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) |
162 | | -{ |
163 | | - /* While these ioctl numbers defined with 'long' and have different |
164 | | - * numbers than the 64bit ABI, |
165 | | - * the actual implementation only deals with ints and is compatible. |
166 | | - */ |
167 | | - switch (cmd) { |
168 | | - case JFS_IOC_GETFLAGS32: |
169 | | - cmd = JFS_IOC_GETFLAGS; |
170 | | - break; |
171 | | - case JFS_IOC_SETFLAGS32: |
172 | | - cmd = JFS_IOC_SETFLAGS; |
173 | | - break; |
174 | | - } |
175 | | - return jfs_ioctl(filp, cmd, arg); |
176 | | -} |
177 | | -#endif |
0 commit comments