1 | /* SPDX-License-Identifier: GPL-2.0 */ |
2 | #ifndef _BCACHEFS_FS_IOCTL_H |
3 | #define _BCACHEFS_FS_IOCTL_H |
4 | |
5 | /* Inode flags: */ |
6 | |
7 | /* bcachefs inode flags -> vfs inode flags: */ |
8 | static const __maybe_unused unsigned bch_flags_to_vfs[] = { |
9 | [__BCH_INODE_sync] = S_SYNC, |
10 | [__BCH_INODE_immutable] = S_IMMUTABLE, |
11 | [__BCH_INODE_append] = S_APPEND, |
12 | [__BCH_INODE_noatime] = S_NOATIME, |
13 | }; |
14 | |
15 | /* bcachefs inode flags -> FS_IOC_GETFLAGS: */ |
16 | static const __maybe_unused unsigned bch_flags_to_uflags[] = { |
17 | [__BCH_INODE_sync] = FS_SYNC_FL, |
18 | [__BCH_INODE_immutable] = FS_IMMUTABLE_FL, |
19 | [__BCH_INODE_append] = FS_APPEND_FL, |
20 | [__BCH_INODE_nodump] = FS_NODUMP_FL, |
21 | [__BCH_INODE_noatime] = FS_NOATIME_FL, |
22 | }; |
23 | |
24 | /* bcachefs inode flags -> FS_IOC_FSGETXATTR: */ |
25 | static const __maybe_unused unsigned bch_flags_to_xflags[] = { |
26 | [__BCH_INODE_sync] = FS_XFLAG_SYNC, |
27 | [__BCH_INODE_immutable] = FS_XFLAG_IMMUTABLE, |
28 | [__BCH_INODE_append] = FS_XFLAG_APPEND, |
29 | [__BCH_INODE_nodump] = FS_XFLAG_NODUMP, |
30 | [__BCH_INODE_noatime] = FS_XFLAG_NOATIME, |
31 | //[__BCH_INODE_PROJINHERIT] = FS_XFLAG_PROJINHERIT; |
32 | }; |
33 | |
34 | #define set_flags(_map, _in, _out) \ |
35 | do { \ |
36 | unsigned _i; \ |
37 | \ |
38 | for (_i = 0; _i < ARRAY_SIZE(_map); _i++) \ |
39 | if ((_in) & (1 << _i)) \ |
40 | (_out) |= _map[_i]; \ |
41 | else \ |
42 | (_out) &= ~_map[_i]; \ |
43 | } while (0) |
44 | |
45 | #define map_flags(_map, _in) \ |
46 | ({ \ |
47 | unsigned _out = 0; \ |
48 | \ |
49 | set_flags(_map, _in, _out); \ |
50 | _out; \ |
51 | }) |
52 | |
53 | #define map_flags_rev(_map, _in) \ |
54 | ({ \ |
55 | unsigned _i, _out = 0; \ |
56 | \ |
57 | for (_i = 0; _i < ARRAY_SIZE(_map); _i++) \ |
58 | if ((_in) & _map[_i]) { \ |
59 | (_out) |= 1 << _i; \ |
60 | (_in) &= ~_map[_i]; \ |
61 | } \ |
62 | (_out); \ |
63 | }) |
64 | |
65 | #define map_defined(_map) \ |
66 | ({ \ |
67 | unsigned _in = ~0; \ |
68 | \ |
69 | map_flags_rev(_map, _in); \ |
70 | }) |
71 | |
72 | /* Set VFS inode flags from bcachefs inode: */ |
73 | static inline void bch2_inode_flags_to_vfs(struct bch_inode_info *inode) |
74 | { |
75 | set_flags(bch_flags_to_vfs, inode->ei_inode.bi_flags, inode->v.i_flags); |
76 | } |
77 | |
78 | long bch2_fs_file_ioctl(struct file *, unsigned, unsigned long); |
79 | long bch2_compat_fs_ioctl(struct file *, unsigned, unsigned long); |
80 | |
81 | #endif /* _BCACHEFS_FS_IOCTL_H */ |
82 | |