Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
fs
isofs
isofs.h
Go to the documentation of this file.
1
#include <linux/fs.h>
2
#include <
linux/buffer_head.h
>
3
#include <
linux/exportfs.h
>
4
#include <
linux/iso_fs.h
>
5
#include <asm/unaligned.h>
6
7
enum
isofs_file_format
{
8
isofs_file_normal
= 0,
9
isofs_file_sparse
= 1,
10
isofs_file_compressed
= 2,
11
};
12
13
/*
14
* iso fs inode data in memory
15
*/
16
struct
iso_inode_info
{
17
unsigned
long
i_iget5_block
;
18
unsigned
long
i_iget5_offset
;
19
unsigned
int
i_first_extent
;
20
unsigned
char
i_file_format
;
21
unsigned
char
i_format_parm
[3];
22
unsigned
long
i_next_section_block
;
23
unsigned
long
i_next_section_offset
;
24
off_t
i_section_size
;
25
struct
inode
vfs_inode
;
26
};
27
28
/*
29
* iso9660 super-block data in memory
30
*/
31
struct
isofs_sb_info
{
32
unsigned
long
s_ninodes
;
33
unsigned
long
s_nzones
;
34
unsigned
long
s_firstdatazone
;
35
unsigned
long
s_log_zone_size
;
36
unsigned
long
s_max_size
;
37
38
int
s_rock_offset
;
/* offset of SUSP fields within SU area */
39
unsigned
char
s_joliet_level
;
40
unsigned
char
s_mapping
;
41
unsigned
int
s_high_sierra
:1;
42
unsigned
int
s_rock
:2;
43
unsigned
int
s_utf8
:1;
44
unsigned
int
s_cruft
:1;
/* Broken disks with high byte of length
45
* containing junk */
46
unsigned
int
s_nocompress
:1;
47
unsigned
int
s_hide
:1;
48
unsigned
int
s_showassoc
:1;
49
unsigned
int
s_overriderockperm
:1;
50
unsigned
int
s_uid_set
:1;
51
unsigned
int
s_gid_set
:1;
52
53
umode_t
s_fmode
;
54
umode_t
s_dmode
;
55
kgid_t
s_gid
;
56
kuid_t
s_uid
;
57
struct
nls_table
*
s_nls_iocharset
;
/* Native language support table */
58
};
59
60
#define ISOFS_INVALID_MODE ((umode_t) -1)
61
62
static
inline
struct
isofs_sb_info
*ISOFS_SB(
struct
super_block
*
sb
)
63
{
64
return
sb->
s_fs_info
;
65
}
66
67
static
inline
struct
iso_inode_info
*ISOFS_I(
struct
inode
*
inode
)
68
{
69
return
container_of
(inode,
struct
iso_inode_info
,
vfs_inode
);
70
}
71
72
static
inline
int
isonum_711(
char
*
p
)
73
{
74
return
*(
u8
*)p;
75
}
76
static
inline
int
isonum_712(
char
*
p
)
77
{
78
return
*(
s8
*)p;
79
}
80
static
inline
unsigned
int
isonum_721(
char
*
p
)
81
{
82
return
get_unaligned_le16(p);
83
}
84
static
inline
unsigned
int
isonum_722(
char
*
p
)
85
{
86
return
get_unaligned_be16(p);
87
}
88
static
inline
unsigned
int
isonum_723(
char
*
p
)
89
{
90
/* Ignore bigendian datum due to broken mastering programs */
91
return
get_unaligned_le16(p);
92
}
93
static
inline
unsigned
int
isonum_731(
char
*
p
)
94
{
95
return
get_unaligned_le32
(p);
96
}
97
static
inline
unsigned
int
isonum_732(
char
*
p
)
98
{
99
return
get_unaligned_be32
(p);
100
}
101
static
inline
unsigned
int
isonum_733(
char
*
p
)
102
{
103
/* Ignore bigendian datum due to broken mastering programs */
104
return
get_unaligned_le32
(p);
105
}
106
extern
int
iso_date
(
char
*,
int
);
107
108
struct
inode
;
/* To make gcc happy */
109
110
extern
int
parse_rock_ridge_inode
(
struct
iso_directory_record
*,
struct
inode
*);
111
extern
int
get_rock_ridge_filename
(
struct
iso_directory_record
*,
char
*,
struct
inode
*);
112
extern
int
isofs_name_translate
(
struct
iso_directory_record
*,
char
*,
struct
inode
*);
113
114
int
get_joliet_filename
(
struct
iso_directory_record
*,
unsigned
char
*,
struct
inode
*);
115
int
get_acorn_filename
(
struct
iso_directory_record
*,
char
*,
struct
inode
*);
116
117
extern
struct
dentry
*
isofs_lookup
(
struct
inode
*,
struct
dentry
*,
unsigned
int
flags
);
118
extern
struct
buffer_head *
isofs_bread
(
struct
inode
*,
sector_t
);
119
extern
int
isofs_get_blocks
(
struct
inode
*,
sector_t
,
struct
buffer_head **,
unsigned
long
);
120
121
extern
struct
inode
*
isofs_iget
(
struct
super_block
*
sb
,
122
unsigned
long
block
,
123
unsigned
long
offset
);
124
125
/* Because the inode number is no longer relevant to finding the
126
* underlying meta-data for an inode, we are free to choose a more
127
* convenient 32-bit number as the inode number. The inode numbering
128
* scheme was recommended by Sergey Vlasov and Eric Lammerts. */
129
static
inline
unsigned
long
isofs_get_ino(
unsigned
long
block
,
130
unsigned
long
offset
,
131
unsigned
long
bufbits)
132
{
133
return
(block << (bufbits - 5)) | (offset >> 5);
134
}
135
136
/* Every directory can have many redundant directory entries scattered
137
* throughout the directory tree. First there is the directory entry
138
* with the name of the directory stored in the parent directory.
139
* Then, there is the "." directory entry stored in the directory
140
* itself. Finally, there are possibly many ".." directory entries
141
* stored in all the subdirectories.
142
*
143
* In order for the NFS get_parent() method to work and for the
144
* general consistency of the dcache, we need to make sure the
145
* "i_iget5_block" and "i_iget5_offset" all point to exactly one of
146
* the many redundant entries for each directory. We normalize the
147
* block and offset by always making them point to the "." directory.
148
*
149
* Notice that we do not use the entry for the directory with the name
150
* that is located in the parent directory. Even though choosing this
151
* first directory is more natural, it is much easier to find the "."
152
* entry in the NFS get_parent() method because it is implicitly
153
* encoded in the "extent + ext_attr_length" fields of _all_ the
154
* redundant entries for the directory. Thus, it can always be
155
* reached regardless of which directory entry you have in hand.
156
*
157
* This works because the "." entry is simply the first directory
158
* record when you start reading the file that holds all the directory
159
* records, and this file starts at "extent + ext_attr_length" blocks.
160
* Because the "." entry is always the first entry listed in the
161
* directories file, the normalized "offset" value is always 0.
162
*
163
* You should pass the directory entry in "de". On return, "block"
164
* and "offset" will hold normalized values. Only directories are
165
* affected making it safe to call even for non-directory file
166
* types. */
167
static
inline
void
168
isofs_normalize_block_and_offset(
struct
iso_directory_record
* de,
169
unsigned
long
*block,
170
unsigned
long
*offset)
171
{
172
/* Only directories are normalized. */
173
if
(de->
flags
[0] & 2) {
174
*offset = 0;
175
*block = (
unsigned
long
)isonum_733(de->
extent
)
176
+ (
unsigned
long
)isonum_711(de->
ext_attr_length
);
177
}
178
}
179
180
extern
const
struct
inode_operations
isofs_dir_inode_operations
;
181
extern
const
struct
file_operations
isofs_dir_operations
;
182
extern
const
struct
address_space_operations
isofs_symlink_aops
;
183
extern
const
struct
export_operations
isofs_export_ops
;
Generated on Thu Jan 10 2013 14:47:29 for Linux Kernel by
1.8.2