]> git.sesse.net Git - bcachefs-tools-debian/blob - c_src/libbcachefs/fs-ioctl.h
move Rust sources to top level, C sources into c_src
[bcachefs-tools-debian] / c_src / libbcachefs / fs-ioctl.h
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 */