| /* SPDX-License-Identifier: GPL-2.0 */ |
| #ifndef _BCACHEFS_FS_IOCTL_H |
| #define _BCACHEFS_FS_IOCTL_H |
| |
| /* Inode flags: */ |
| |
| /* bcachefs inode flags -> vfs inode flags: */ |
| static const __maybe_unused unsigned bch_flags_to_vfs[] = { |
| [__BCH_INODE_sync] = S_SYNC, |
| [__BCH_INODE_immutable] = S_IMMUTABLE, |
| [__BCH_INODE_append] = S_APPEND, |
| [__BCH_INODE_noatime] = S_NOATIME, |
| }; |
| |
| /* bcachefs inode flags -> FS_IOC_GETFLAGS: */ |
| static const __maybe_unused unsigned bch_flags_to_uflags[] = { |
| [__BCH_INODE_sync] = FS_SYNC_FL, |
| [__BCH_INODE_immutable] = FS_IMMUTABLE_FL, |
| [__BCH_INODE_append] = FS_APPEND_FL, |
| [__BCH_INODE_nodump] = FS_NODUMP_FL, |
| [__BCH_INODE_noatime] = FS_NOATIME_FL, |
| }; |
| |
| /* bcachefs inode flags -> FS_IOC_FSGETXATTR: */ |
| static const __maybe_unused unsigned bch_flags_to_xflags[] = { |
| [__BCH_INODE_sync] = FS_XFLAG_SYNC, |
| [__BCH_INODE_immutable] = FS_XFLAG_IMMUTABLE, |
| [__BCH_INODE_append] = FS_XFLAG_APPEND, |
| [__BCH_INODE_nodump] = FS_XFLAG_NODUMP, |
| [__BCH_INODE_noatime] = FS_XFLAG_NOATIME, |
| //[__BCH_INODE_PROJINHERIT] = FS_XFLAG_PROJINHERIT; |
| }; |
| |
| #define set_flags(_map, _in, _out) \ |
| do { \ |
| unsigned _i; \ |
| \ |
| for (_i = 0; _i < ARRAY_SIZE(_map); _i++) \ |
| if ((_in) & (1 << _i)) \ |
| (_out) |= _map[_i]; \ |
| else \ |
| (_out) &= ~_map[_i]; \ |
| } while (0) |
| |
| #define map_flags(_map, _in) \ |
| ({ \ |
| unsigned _out = 0; \ |
| \ |
| set_flags(_map, _in, _out); \ |
| _out; \ |
| }) |
| |
| #define map_flags_rev(_map, _in) \ |
| ({ \ |
| unsigned _i, _out = 0; \ |
| \ |
| for (_i = 0; _i < ARRAY_SIZE(_map); _i++) \ |
| if ((_in) & _map[_i]) { \ |
| (_out) |= 1 << _i; \ |
| (_in) &= ~_map[_i]; \ |
| } \ |
| (_out); \ |
| }) |
| |
| #define map_defined(_map) \ |
| ({ \ |
| unsigned _in = ~0; \ |
| \ |
| map_flags_rev(_map, _in); \ |
| }) |
| |
| /* Set VFS inode flags from bcachefs inode: */ |
| static inline void bch2_inode_flags_to_vfs(struct bch_inode_info *inode) |
| { |
| set_flags(bch_flags_to_vfs, inode->ei_inode.bi_flags, inode->v.i_flags); |
| } |
| |
| long bch2_fs_file_ioctl(struct file *, unsigned, unsigned long); |
| long bch2_compat_fs_ioctl(struct file *, unsigned, unsigned long); |
| |
| #endif /* _BCACHEFS_FS_IOCTL_H */ |