1 /* SPDX-License-Identifier: GPL-2.0 */
3 * QNX6 file system, Linux implementation.
9 * 01-02-2012 by Kai Bankett (chaosman@ontika.net) : first release.
10 * 16-02-2012 page map extension by Al Viro
18 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
21 #include <linux/pagemap.h>
23 typedef __u16 __bitwise __fs16
;
24 typedef __u32 __bitwise __fs32
;
25 typedef __u64 __bitwise __fs64
;
27 #include <linux/qnx6_fs.h>
30 struct buffer_head
*sb_buf
; /* superblock buffer */
31 struct qnx6_super_block
*sb
; /* our superblock */
32 int s_blks_off
; /* blkoffset fs-startpoint */
33 int s_ptrbits
; /* indirect pointer bitfield */
34 unsigned long s_mount_opt
; /* all mount options */
35 int s_bytesex
; /* holds endianess info */
36 struct inode
* inodes
;
37 struct inode
* longfile
;
40 struct qnx6_inode_info
{
41 __fs32 di_block_ptr
[QNX6_NO_DIRECT_POINTERS
];
43 __u32 i_dir_start_lookup
;
44 struct inode vfs_inode
;
47 extern struct inode
*qnx6_iget(struct super_block
*sb
, unsigned ino
);
48 extern struct dentry
*qnx6_lookup(struct inode
*dir
, struct dentry
*dentry
,
51 #ifdef CONFIG_QNX6FS_DEBUG
52 extern void qnx6_superblock_debug(struct qnx6_super_block
*,
53 struct super_block
*);
56 extern const struct inode_operations qnx6_dir_inode_operations
;
57 extern const struct file_operations qnx6_dir_operations
;
59 static inline struct qnx6_sb_info
*QNX6_SB(struct super_block
*sb
)
64 static inline struct qnx6_inode_info
*QNX6_I(struct inode
*inode
)
66 return container_of(inode
, struct qnx6_inode_info
, vfs_inode
);
69 #define clear_opt(o, opt) (o &= ~(QNX6_MOUNT_##opt))
70 #define set_opt(o, opt) (o |= (QNX6_MOUNT_##opt))
71 #define test_opt(sb, opt) (QNX6_SB(sb)->s_mount_opt & \
78 static inline __u64
fs64_to_cpu(struct qnx6_sb_info
*sbi
, __fs64 n
)
80 if (sbi
->s_bytesex
== BYTESEX_LE
)
81 return le64_to_cpu((__force __le64
)n
);
83 return be64_to_cpu((__force __be64
)n
);
86 static inline __fs64
cpu_to_fs64(struct qnx6_sb_info
*sbi
, __u64 n
)
88 if (sbi
->s_bytesex
== BYTESEX_LE
)
89 return (__force __fs64
)cpu_to_le64(n
);
91 return (__force __fs64
)cpu_to_be64(n
);
94 static inline __u32
fs32_to_cpu(struct qnx6_sb_info
*sbi
, __fs32 n
)
96 if (sbi
->s_bytesex
== BYTESEX_LE
)
97 return le32_to_cpu((__force __le32
)n
);
99 return be32_to_cpu((__force __be32
)n
);
102 static inline __fs32
cpu_to_fs32(struct qnx6_sb_info
*sbi
, __u32 n
)
104 if (sbi
->s_bytesex
== BYTESEX_LE
)
105 return (__force __fs32
)cpu_to_le32(n
);
107 return (__force __fs32
)cpu_to_be32(n
);
110 static inline __u16
fs16_to_cpu(struct qnx6_sb_info
*sbi
, __fs16 n
)
112 if (sbi
->s_bytesex
== BYTESEX_LE
)
113 return le16_to_cpu((__force __le16
)n
);
115 return be16_to_cpu((__force __be16
)n
);
118 static inline __fs16
cpu_to_fs16(struct qnx6_sb_info
*sbi
, __u16 n
)
120 if (sbi
->s_bytesex
== BYTESEX_LE
)
121 return (__force __fs16
)cpu_to_le16(n
);
123 return (__force __fs16
)cpu_to_be16(n
);
126 extern struct qnx6_super_block
*qnx6_mmi_fill_super(struct super_block
*s
,
129 static inline void qnx6_put_page(struct page
*page
)
135 extern unsigned qnx6_find_entry(int len
, struct inode
*dir
, const char *name
,
136 struct page
**res_page
);