.. | .. |
---|
57 | 57 | return 0; |
---|
58 | 58 | } |
---|
59 | 59 | |
---|
60 | | -static int hfsplus_ioctl_getflags(struct file *file, int __user *user_flags) |
---|
| 60 | +static inline unsigned int hfsplus_getflags(struct inode *inode) |
---|
61 | 61 | { |
---|
62 | | - struct inode *inode = file_inode(file); |
---|
63 | 62 | struct hfsplus_inode_info *hip = HFSPLUS_I(inode); |
---|
64 | 63 | unsigned int flags = 0; |
---|
65 | 64 | |
---|
.. | .. |
---|
69 | 68 | flags |= FS_APPEND_FL; |
---|
70 | 69 | if (hip->userflags & HFSPLUS_FLG_NODUMP) |
---|
71 | 70 | 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); |
---|
72 | 78 | |
---|
73 | 79 | return put_user(flags, user_flags); |
---|
74 | 80 | } |
---|
.. | .. |
---|
78 | 84 | struct inode *inode = file_inode(file); |
---|
79 | 85 | struct hfsplus_inode_info *hip = HFSPLUS_I(inode); |
---|
80 | 86 | unsigned int flags, new_fl = 0; |
---|
| 87 | + unsigned int oldflags = hfsplus_getflags(inode); |
---|
81 | 88 | int err = 0; |
---|
82 | 89 | |
---|
83 | 90 | err = mnt_want_write_file(file); |
---|
.. | .. |
---|
96 | 103 | |
---|
97 | 104 | inode_lock(inode); |
---|
98 | 105 | |
---|
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; |
---|
106 | 109 | |
---|
107 | 110 | /* don't silently ignore unsupported ext2 flags */ |
---|
108 | 111 | if (flags & ~(FS_IMMUTABLE_FL|FS_APPEND_FL|FS_NODUMP_FL)) { |
---|