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