xref: /linux/fs/bcachefs/fs-ioctl.h (revision ad30469a841b50dbb541df4d6971d891f703c297)
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