Home Home > GIT Browse
summaryrefslogtreecommitdiff
blob: 34a6b126a3a98338e1504b1b1ce2b6969294b0b7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
/* SPDX-License-Identifier: GPL-2.0 */
/*
 * QNX6 file system, Linux implementation.
 *
 * Version : 1.0.0
 *
 * History :
 *
 * 01-02-2012 by Kai Bankett (chaosman@ontika.net) : first release.
 * 16-02-2012 page map extension by Al Viro
 *
 */

#ifdef pr_fmt
#undef pr_fmt
#endif

#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt

#include <linux/fs.h>
#include <linux/pagemap.h>

typedef __u16 __bitwise __fs16;
typedef __u32 __bitwise __fs32;
typedef __u64 __bitwise __fs64;

#include <linux/qnx6_fs.h>

struct qnx6_sb_info {
	struct buffer_head	*sb_buf;	/* superblock buffer */
	struct qnx6_super_block	*sb;		/* our superblock */
	int			s_blks_off;	/* blkoffset fs-startpoint */
	int			s_ptrbits;	/* indirect pointer bitfield */
	unsigned long		s_mount_opt;	/* all mount options */
	int			s_bytesex;	/* holds endianess info */
	struct inode *		inodes;
	struct inode *		longfile;
};

struct qnx6_inode_info {
	__fs32			di_block_ptr[QNX6_NO_DIRECT_POINTERS];
	__u8			di_filelevels;
	__u32			i_dir_start_lookup;
	struct inode		vfs_inode;
};

extern struct inode *qnx6_iget(struct super_block *sb, unsigned ino);
extern struct dentry *qnx6_lookup(struct inode *dir, struct dentry *dentry,
					unsigned int flags);

#ifdef CONFIG_QNX6FS_DEBUG
extern void qnx6_superblock_debug(struct qnx6_super_block *,
						struct super_block *);
#endif

extern const struct inode_operations qnx6_dir_inode_operations;
extern const struct file_operations qnx6_dir_operations;

static inline struct qnx6_sb_info *QNX6_SB(struct super_block *sb)
{
	return sb->s_fs_info;
}

static inline struct qnx6_inode_info *QNX6_I(struct inode *inode)
{
	return container_of(inode, struct qnx6_inode_info, vfs_inode);
}

#define clear_opt(o, opt)		(o &= ~(QNX6_MOUNT_##opt))
#define set_opt(o, opt)			(o |= (QNX6_MOUNT_##opt))
#define test_opt(sb, opt)		(QNX6_SB(sb)->s_mount_opt & \
					 QNX6_MOUNT_##opt)
enum {
	BYTESEX_LE,
	BYTESEX_BE,
};

static inline __u64 fs64_to_cpu(struct qnx6_sb_info *sbi, __fs64 n)
{
	if (sbi->s_bytesex == BYTESEX_LE)
		return le64_to_cpu((__force __le64)n);
	else
		return be64_to_cpu((__force __be64)n);
}

static inline __fs64 cpu_to_fs64(struct qnx6_sb_info *sbi, __u64 n)
{
	if (sbi->s_bytesex == BYTESEX_LE)
		return (__force __fs64)cpu_to_le64(n);
	else
		return (__force __fs64)cpu_to_be64(n);
}

static inline __u32 fs32_to_cpu(struct qnx6_sb_info *sbi, __fs32 n)
{
	if (sbi->s_bytesex == BYTESEX_LE)
		return le32_to_cpu((__force __le32)n);
	else
		return be32_to_cpu((__force __be32)n);
}

static inline __fs32 cpu_to_fs32(struct qnx6_sb_info *sbi, __u32 n)
{
	if (sbi->s_bytesex == BYTESEX_LE)
		return (__force __fs32)cpu_to_le32(n);
	else
		return (__force __fs32)cpu_to_be32(n);
}

static inline __u16 fs16_to_cpu(struct qnx6_sb_info *sbi, __fs16 n)
{
	if (sbi->s_bytesex == BYTESEX_LE)
		return le16_to_cpu((__force __le16)n);
	else
		return be16_to_cpu((__force __be16)n);
}

static inline __fs16 cpu_to_fs16(struct qnx6_sb_info *sbi, __u16 n)
{
	if (sbi->s_bytesex == BYTESEX_LE)
		return (__force __fs16)cpu_to_le16(n);
	else
		return (__force __fs16)cpu_to_be16(n);
}

extern struct qnx6_super_block *qnx6_mmi_fill_super(struct super_block *s,
						    int silent);

static inline void qnx6_put_page(struct page *page)
{
	kunmap(page);
	put_page(page);
}

extern unsigned qnx6_find_entry(int len, struct inode *dir, const char *name,
				struct page **res_page);