1
2#include <linux/fs.h>
3#include <linux/buffer_head.h>
4#include <linux/exportfs.h>
5#include <linux/iso_fs.h>
6#include <asm/unaligned.h>
7
8enum isofs_file_format {
9 isofs_file_normal = 0,
10 isofs_file_sparse = 1,
11 isofs_file_compressed = 2,
12};
13
14
15
16
17struct iso_inode_info {
18 unsigned long i_iget5_block;
19 unsigned long i_iget5_offset;
20 unsigned int i_first_extent;
21 unsigned char i_file_format;
22 unsigned char i_format_parm[3];
23 unsigned long i_next_section_block;
24 unsigned long i_next_section_offset;
25 off_t i_section_size;
26 struct inode vfs_inode;
27};
28
29
30
31
32struct isofs_sb_info {
33 unsigned long s_ninodes;
34 unsigned long s_nzones;
35 unsigned long s_firstdatazone;
36 unsigned long s_log_zone_size;
37 unsigned long s_max_size;
38
39 int s_rock_offset;
40 s32 s_sbsector;
41 unsigned char s_joliet_level;
42 unsigned char s_mapping;
43 unsigned char s_check;
44 unsigned char s_session;
45 unsigned int s_high_sierra:1;
46 unsigned int s_rock:2;
47 unsigned int s_utf8:1;
48 unsigned int s_cruft:1;
49
50 unsigned int s_nocompress:1;
51 unsigned int s_hide:1;
52 unsigned int s_showassoc:1;
53 unsigned int s_overriderockperm:1;
54 unsigned int s_uid_set:1;
55 unsigned int s_gid_set:1;
56
57 umode_t s_fmode;
58 umode_t s_dmode;
59 kgid_t s_gid;
60 kuid_t s_uid;
61 struct nls_table *s_nls_iocharset;
62};
63
64#define ISOFS_INVALID_MODE ((umode_t) -1)
65
66static inline struct isofs_sb_info *ISOFS_SB(struct super_block *sb)
67{
68 return sb->s_fs_info;
69}
70
71static inline struct iso_inode_info *ISOFS_I(struct inode *inode)
72{
73 return container_of(inode, struct iso_inode_info, vfs_inode);
74}
75
76static inline int isonum_711(u8 *p)
77{
78 return *p;
79}
80static inline int isonum_712(s8 *p)
81{
82 return *p;
83}
84static inline unsigned int isonum_721(u8 *p)
85{
86 return get_unaligned_le16(p);
87}
88static inline unsigned int isonum_722(u8 *p)
89{
90 return get_unaligned_be16(p);
91}
92static inline unsigned int isonum_723(u8 *p)
93{
94
95 return get_unaligned_le16(p);
96}
97static inline unsigned int isonum_731(u8 *p)
98{
99 return get_unaligned_le32(p);
100}
101static inline unsigned int isonum_732(u8 *p)
102{
103 return get_unaligned_be32(p);
104}
105static inline unsigned int isonum_733(u8 *p)
106{
107
108 return get_unaligned_le32(p);
109}
110extern int iso_date(u8 *, int);
111
112struct inode;
113
114extern int parse_rock_ridge_inode(struct iso_directory_record *, struct inode *, int relocated);
115extern int get_rock_ridge_filename(struct iso_directory_record *, char *, struct inode *);
116extern int isofs_name_translate(struct iso_directory_record *, char *, struct inode *);
117
118int get_joliet_filename(struct iso_directory_record *, unsigned char *, struct inode *);
119int get_acorn_filename(struct iso_directory_record *, char *, struct inode *);
120
121extern struct dentry *isofs_lookup(struct inode *, struct dentry *, unsigned int flags);
122extern struct buffer_head *isofs_bread(struct inode *, sector_t);
123extern int isofs_get_blocks(struct inode *, sector_t, struct buffer_head **, unsigned long);
124
125struct inode *__isofs_iget(struct super_block *sb,
126 unsigned long block,
127 unsigned long offset,
128 int relocated);
129
130static inline struct inode *isofs_iget(struct super_block *sb,
131 unsigned long block,
132 unsigned long offset)
133{
134 return __isofs_iget(sb, block, offset, 0);
135}
136
137static inline struct inode *isofs_iget_reloc(struct super_block *sb,
138 unsigned long block,
139 unsigned long offset)
140{
141 return __isofs_iget(sb, block, offset, 1);
142}
143
144
145
146
147
148static inline unsigned long isofs_get_ino(unsigned long block,
149 unsigned long offset,
150 unsigned long bufbits)
151{
152 return (block << (bufbits - 5)) | (offset >> 5);
153}
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186static inline void
187isofs_normalize_block_and_offset(struct iso_directory_record* de,
188 unsigned long *block,
189 unsigned long *offset)
190{
191
192 if (de->flags[0] & 2) {
193 *offset = 0;
194 *block = (unsigned long)isonum_733(de->extent)
195 + (unsigned long)isonum_711(de->ext_attr_length);
196 }
197}
198
199extern const struct inode_operations isofs_dir_inode_operations;
200extern const struct file_operations isofs_dir_operations;
201extern const struct address_space_operations isofs_symlink_aops;
202extern const struct export_operations isofs_export_ops;
203