| .. | .. |
|---|
| 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)) { |
|---|