1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun * befs.h
4*4882a593Smuzhiyun *
5*4882a593Smuzhiyun * Copyright (C) 2001-2002 Will Dyson <will_dyson@pobox.com>
6*4882a593Smuzhiyun * Copyright (C) 1999 Makoto Kato (m_kato@ga2.so-net.ne.jp)
7*4882a593Smuzhiyun */
8*4882a593Smuzhiyun
9*4882a593Smuzhiyun #ifndef _LINUX_BEFS_H
10*4882a593Smuzhiyun #define _LINUX_BEFS_H
11*4882a593Smuzhiyun
12*4882a593Smuzhiyun #include "befs_fs_types.h"
13*4882a593Smuzhiyun
14*4882a593Smuzhiyun /* used in debug.c */
15*4882a593Smuzhiyun #define BEFS_VERSION "0.9.3"
16*4882a593Smuzhiyun
17*4882a593Smuzhiyun
18*4882a593Smuzhiyun typedef u64 befs_blocknr_t;
19*4882a593Smuzhiyun /*
20*4882a593Smuzhiyun * BeFS in memory structures
21*4882a593Smuzhiyun */
22*4882a593Smuzhiyun
23*4882a593Smuzhiyun struct befs_mount_options {
24*4882a593Smuzhiyun kgid_t gid;
25*4882a593Smuzhiyun kuid_t uid;
26*4882a593Smuzhiyun int use_gid;
27*4882a593Smuzhiyun int use_uid;
28*4882a593Smuzhiyun int debug;
29*4882a593Smuzhiyun char *iocharset;
30*4882a593Smuzhiyun };
31*4882a593Smuzhiyun
32*4882a593Smuzhiyun struct befs_sb_info {
33*4882a593Smuzhiyun u32 magic1;
34*4882a593Smuzhiyun u32 block_size;
35*4882a593Smuzhiyun u32 block_shift;
36*4882a593Smuzhiyun int byte_order;
37*4882a593Smuzhiyun befs_off_t num_blocks;
38*4882a593Smuzhiyun befs_off_t used_blocks;
39*4882a593Smuzhiyun u32 inode_size;
40*4882a593Smuzhiyun u32 magic2;
41*4882a593Smuzhiyun
42*4882a593Smuzhiyun /* Allocation group information */
43*4882a593Smuzhiyun u32 blocks_per_ag;
44*4882a593Smuzhiyun u32 ag_shift;
45*4882a593Smuzhiyun u32 num_ags;
46*4882a593Smuzhiyun
47*4882a593Smuzhiyun /* State of the superblock */
48*4882a593Smuzhiyun u32 flags;
49*4882a593Smuzhiyun
50*4882a593Smuzhiyun /* Journal log entry */
51*4882a593Smuzhiyun befs_block_run log_blocks;
52*4882a593Smuzhiyun befs_off_t log_start;
53*4882a593Smuzhiyun befs_off_t log_end;
54*4882a593Smuzhiyun
55*4882a593Smuzhiyun befs_inode_addr root_dir;
56*4882a593Smuzhiyun befs_inode_addr indices;
57*4882a593Smuzhiyun u32 magic3;
58*4882a593Smuzhiyun
59*4882a593Smuzhiyun struct befs_mount_options mount_opts;
60*4882a593Smuzhiyun struct nls_table *nls;
61*4882a593Smuzhiyun };
62*4882a593Smuzhiyun
63*4882a593Smuzhiyun struct befs_inode_info {
64*4882a593Smuzhiyun u32 i_flags;
65*4882a593Smuzhiyun u32 i_type;
66*4882a593Smuzhiyun
67*4882a593Smuzhiyun befs_inode_addr i_inode_num;
68*4882a593Smuzhiyun befs_inode_addr i_parent;
69*4882a593Smuzhiyun befs_inode_addr i_attribute;
70*4882a593Smuzhiyun
71*4882a593Smuzhiyun union {
72*4882a593Smuzhiyun befs_data_stream ds;
73*4882a593Smuzhiyun char symlink[BEFS_SYMLINK_LEN];
74*4882a593Smuzhiyun } i_data;
75*4882a593Smuzhiyun
76*4882a593Smuzhiyun struct inode vfs_inode;
77*4882a593Smuzhiyun };
78*4882a593Smuzhiyun
79*4882a593Smuzhiyun enum befs_err {
80*4882a593Smuzhiyun BEFS_OK,
81*4882a593Smuzhiyun BEFS_ERR,
82*4882a593Smuzhiyun BEFS_BAD_INODE,
83*4882a593Smuzhiyun BEFS_BT_END,
84*4882a593Smuzhiyun BEFS_BT_EMPTY,
85*4882a593Smuzhiyun BEFS_BT_MATCH,
86*4882a593Smuzhiyun BEFS_BT_OVERFLOW,
87*4882a593Smuzhiyun BEFS_BT_NOT_FOUND
88*4882a593Smuzhiyun };
89*4882a593Smuzhiyun
90*4882a593Smuzhiyun
91*4882a593Smuzhiyun /****************************/
92*4882a593Smuzhiyun /* debug.c */
93*4882a593Smuzhiyun __printf(2, 3)
94*4882a593Smuzhiyun void befs_error(const struct super_block *sb, const char *fmt, ...);
95*4882a593Smuzhiyun __printf(2, 3)
96*4882a593Smuzhiyun void befs_warning(const struct super_block *sb, const char *fmt, ...);
97*4882a593Smuzhiyun __printf(2, 3)
98*4882a593Smuzhiyun void befs_debug(const struct super_block *sb, const char *fmt, ...);
99*4882a593Smuzhiyun
100*4882a593Smuzhiyun void befs_dump_super_block(const struct super_block *sb, befs_super_block *);
101*4882a593Smuzhiyun void befs_dump_inode(const struct super_block *sb, befs_inode *);
102*4882a593Smuzhiyun void befs_dump_index_entry(const struct super_block *sb, befs_disk_btree_super *);
103*4882a593Smuzhiyun void befs_dump_index_node(const struct super_block *sb, befs_btree_nodehead *);
104*4882a593Smuzhiyun /****************************/
105*4882a593Smuzhiyun
106*4882a593Smuzhiyun
107*4882a593Smuzhiyun /* Gets a pointer to the private portion of the super_block
108*4882a593Smuzhiyun * structure from the public part
109*4882a593Smuzhiyun */
110*4882a593Smuzhiyun static inline struct befs_sb_info *
BEFS_SB(const struct super_block * super)111*4882a593Smuzhiyun BEFS_SB(const struct super_block *super)
112*4882a593Smuzhiyun {
113*4882a593Smuzhiyun return (struct befs_sb_info *) super->s_fs_info;
114*4882a593Smuzhiyun }
115*4882a593Smuzhiyun
116*4882a593Smuzhiyun static inline struct befs_inode_info *
BEFS_I(const struct inode * inode)117*4882a593Smuzhiyun BEFS_I(const struct inode *inode)
118*4882a593Smuzhiyun {
119*4882a593Smuzhiyun return container_of(inode, struct befs_inode_info, vfs_inode);
120*4882a593Smuzhiyun }
121*4882a593Smuzhiyun
122*4882a593Smuzhiyun static inline befs_blocknr_t
iaddr2blockno(struct super_block * sb,const befs_inode_addr * iaddr)123*4882a593Smuzhiyun iaddr2blockno(struct super_block *sb, const befs_inode_addr *iaddr)
124*4882a593Smuzhiyun {
125*4882a593Smuzhiyun return ((iaddr->allocation_group << BEFS_SB(sb)->ag_shift) +
126*4882a593Smuzhiyun iaddr->start);
127*4882a593Smuzhiyun }
128*4882a593Smuzhiyun
129*4882a593Smuzhiyun static inline befs_inode_addr
blockno2iaddr(struct super_block * sb,befs_blocknr_t blockno)130*4882a593Smuzhiyun blockno2iaddr(struct super_block *sb, befs_blocknr_t blockno)
131*4882a593Smuzhiyun {
132*4882a593Smuzhiyun befs_inode_addr iaddr;
133*4882a593Smuzhiyun
134*4882a593Smuzhiyun iaddr.allocation_group = blockno >> BEFS_SB(sb)->ag_shift;
135*4882a593Smuzhiyun iaddr.start =
136*4882a593Smuzhiyun blockno - (iaddr.allocation_group << BEFS_SB(sb)->ag_shift);
137*4882a593Smuzhiyun iaddr.len = 1;
138*4882a593Smuzhiyun
139*4882a593Smuzhiyun return iaddr;
140*4882a593Smuzhiyun }
141*4882a593Smuzhiyun
142*4882a593Smuzhiyun static inline unsigned int
befs_iaddrs_per_block(struct super_block * sb)143*4882a593Smuzhiyun befs_iaddrs_per_block(struct super_block *sb)
144*4882a593Smuzhiyun {
145*4882a593Smuzhiyun return BEFS_SB(sb)->block_size / sizeof(befs_disk_inode_addr);
146*4882a593Smuzhiyun }
147*4882a593Smuzhiyun
148*4882a593Smuzhiyun #include "endian.h"
149*4882a593Smuzhiyun
150*4882a593Smuzhiyun #endif /* _LINUX_BEFS_H */
151