Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v2.6.12-rc3 312 lines 12 kB view raw
1 2#ifndef _ISOFS_FS_H 3#define _ISOFS_FS_H 4 5#include <linux/types.h> 6/* 7 * The isofs filesystem constants/structures 8 */ 9 10/* This part borrowed from the bsd386 isofs */ 11#define ISODCL(from, to) (to - from + 1) 12 13struct iso_volume_descriptor { 14 char type[ISODCL(1,1)]; /* 711 */ 15 char id[ISODCL(2,6)]; 16 char version[ISODCL(7,7)]; 17 char data[ISODCL(8,2048)]; 18}; 19 20/* volume descriptor types */ 21#define ISO_VD_PRIMARY 1 22#define ISO_VD_SUPPLEMENTARY 2 23#define ISO_VD_END 255 24 25#define ISO_STANDARD_ID "CD001" 26 27struct iso_primary_descriptor { 28 char type [ISODCL ( 1, 1)]; /* 711 */ 29 char id [ISODCL ( 2, 6)]; 30 char version [ISODCL ( 7, 7)]; /* 711 */ 31 char unused1 [ISODCL ( 8, 8)]; 32 char system_id [ISODCL ( 9, 40)]; /* achars */ 33 char volume_id [ISODCL ( 41, 72)]; /* dchars */ 34 char unused2 [ISODCL ( 73, 80)]; 35 char volume_space_size [ISODCL ( 81, 88)]; /* 733 */ 36 char unused3 [ISODCL ( 89, 120)]; 37 char volume_set_size [ISODCL (121, 124)]; /* 723 */ 38 char volume_sequence_number [ISODCL (125, 128)]; /* 723 */ 39 char logical_block_size [ISODCL (129, 132)]; /* 723 */ 40 char path_table_size [ISODCL (133, 140)]; /* 733 */ 41 char type_l_path_table [ISODCL (141, 144)]; /* 731 */ 42 char opt_type_l_path_table [ISODCL (145, 148)]; /* 731 */ 43 char type_m_path_table [ISODCL (149, 152)]; /* 732 */ 44 char opt_type_m_path_table [ISODCL (153, 156)]; /* 732 */ 45 char root_directory_record [ISODCL (157, 190)]; /* 9.1 */ 46 char volume_set_id [ISODCL (191, 318)]; /* dchars */ 47 char publisher_id [ISODCL (319, 446)]; /* achars */ 48 char preparer_id [ISODCL (447, 574)]; /* achars */ 49 char application_id [ISODCL (575, 702)]; /* achars */ 50 char copyright_file_id [ISODCL (703, 739)]; /* 7.5 dchars */ 51 char abstract_file_id [ISODCL (740, 776)]; /* 7.5 dchars */ 52 char bibliographic_file_id [ISODCL (777, 813)]; /* 7.5 dchars */ 53 char creation_date [ISODCL (814, 830)]; /* 8.4.26.1 */ 54 char modification_date [ISODCL (831, 847)]; /* 8.4.26.1 */ 55 char expiration_date [ISODCL (848, 864)]; /* 8.4.26.1 */ 56 char effective_date [ISODCL (865, 881)]; /* 8.4.26.1 */ 57 char file_structure_version [ISODCL (882, 882)]; /* 711 */ 58 char unused4 [ISODCL (883, 883)]; 59 char application_data [ISODCL (884, 1395)]; 60 char unused5 [ISODCL (1396, 2048)]; 61}; 62 63/* Almost the same as the primary descriptor but two fields are specified */ 64struct iso_supplementary_descriptor { 65 char type [ISODCL ( 1, 1)]; /* 711 */ 66 char id [ISODCL ( 2, 6)]; 67 char version [ISODCL ( 7, 7)]; /* 711 */ 68 char flags [ISODCL ( 8, 8)]; /* 853 */ 69 char system_id [ISODCL ( 9, 40)]; /* achars */ 70 char volume_id [ISODCL ( 41, 72)]; /* dchars */ 71 char unused2 [ISODCL ( 73, 80)]; 72 char volume_space_size [ISODCL ( 81, 88)]; /* 733 */ 73 char escape [ISODCL ( 89, 120)]; /* 856 */ 74 char volume_set_size [ISODCL (121, 124)]; /* 723 */ 75 char volume_sequence_number [ISODCL (125, 128)]; /* 723 */ 76 char logical_block_size [ISODCL (129, 132)]; /* 723 */ 77 char path_table_size [ISODCL (133, 140)]; /* 733 */ 78 char type_l_path_table [ISODCL (141, 144)]; /* 731 */ 79 char opt_type_l_path_table [ISODCL (145, 148)]; /* 731 */ 80 char type_m_path_table [ISODCL (149, 152)]; /* 732 */ 81 char opt_type_m_path_table [ISODCL (153, 156)]; /* 732 */ 82 char root_directory_record [ISODCL (157, 190)]; /* 9.1 */ 83 char volume_set_id [ISODCL (191, 318)]; /* dchars */ 84 char publisher_id [ISODCL (319, 446)]; /* achars */ 85 char preparer_id [ISODCL (447, 574)]; /* achars */ 86 char application_id [ISODCL (575, 702)]; /* achars */ 87 char copyright_file_id [ISODCL (703, 739)]; /* 7.5 dchars */ 88 char abstract_file_id [ISODCL (740, 776)]; /* 7.5 dchars */ 89 char bibliographic_file_id [ISODCL (777, 813)]; /* 7.5 dchars */ 90 char creation_date [ISODCL (814, 830)]; /* 8.4.26.1 */ 91 char modification_date [ISODCL (831, 847)]; /* 8.4.26.1 */ 92 char expiration_date [ISODCL (848, 864)]; /* 8.4.26.1 */ 93 char effective_date [ISODCL (865, 881)]; /* 8.4.26.1 */ 94 char file_structure_version [ISODCL (882, 882)]; /* 711 */ 95 char unused4 [ISODCL (883, 883)]; 96 char application_data [ISODCL (884, 1395)]; 97 char unused5 [ISODCL (1396, 2048)]; 98}; 99 100 101#define HS_STANDARD_ID "CDROM" 102 103struct hs_volume_descriptor { 104 char foo [ISODCL ( 1, 8)]; /* 733 */ 105 char type [ISODCL ( 9, 9)]; /* 711 */ 106 char id [ISODCL ( 10, 14)]; 107 char version [ISODCL ( 15, 15)]; /* 711 */ 108 char data[ISODCL(16,2048)]; 109}; 110 111 112struct hs_primary_descriptor { 113 char foo [ISODCL ( 1, 8)]; /* 733 */ 114 char type [ISODCL ( 9, 9)]; /* 711 */ 115 char id [ISODCL ( 10, 14)]; 116 char version [ISODCL ( 15, 15)]; /* 711 */ 117 char unused1 [ISODCL ( 16, 16)]; /* 711 */ 118 char system_id [ISODCL ( 17, 48)]; /* achars */ 119 char volume_id [ISODCL ( 49, 80)]; /* dchars */ 120 char unused2 [ISODCL ( 81, 88)]; /* 733 */ 121 char volume_space_size [ISODCL ( 89, 96)]; /* 733 */ 122 char unused3 [ISODCL ( 97, 128)]; /* 733 */ 123 char volume_set_size [ISODCL (129, 132)]; /* 723 */ 124 char volume_sequence_number [ISODCL (133, 136)]; /* 723 */ 125 char logical_block_size [ISODCL (137, 140)]; /* 723 */ 126 char path_table_size [ISODCL (141, 148)]; /* 733 */ 127 char type_l_path_table [ISODCL (149, 152)]; /* 731 */ 128 char unused4 [ISODCL (153, 180)]; /* 733 */ 129 char root_directory_record [ISODCL (181, 214)]; /* 9.1 */ 130}; 131 132/* We use this to help us look up the parent inode numbers. */ 133 134struct iso_path_table{ 135 unsigned char name_len[2]; /* 721 */ 136 char extent[4]; /* 731 */ 137 char parent[2]; /* 721 */ 138 char name[0]; 139} __attribute__((packed)); 140 141/* high sierra is identical to iso, except that the date is only 6 bytes, and 142 there is an extra reserved byte after the flags */ 143 144struct iso_directory_record { 145 char length [ISODCL (1, 1)]; /* 711 */ 146 char ext_attr_length [ISODCL (2, 2)]; /* 711 */ 147 char extent [ISODCL (3, 10)]; /* 733 */ 148 char size [ISODCL (11, 18)]; /* 733 */ 149 char date [ISODCL (19, 25)]; /* 7 by 711 */ 150 char flags [ISODCL (26, 26)]; 151 char file_unit_size [ISODCL (27, 27)]; /* 711 */ 152 char interleave [ISODCL (28, 28)]; /* 711 */ 153 char volume_sequence_number [ISODCL (29, 32)]; /* 723 */ 154 unsigned char name_len [ISODCL (33, 33)]; /* 711 */ 155 char name [0]; 156} __attribute__((packed)); 157 158#define ISOFS_BLOCK_BITS 11 159#define ISOFS_BLOCK_SIZE 2048 160 161#define ISOFS_BUFFER_SIZE(INODE) ((INODE)->i_sb->s_blocksize) 162#define ISOFS_BUFFER_BITS(INODE) ((INODE)->i_sb->s_blocksize_bits) 163 164#define ISOFS_SUPER_MAGIC 0x9660 165 166#ifdef __KERNEL__ 167/* Number conversion inlines, named after the section in ISO 9660 168 they correspond to. */ 169 170#include <asm/byteorder.h> 171#include <asm/unaligned.h> 172#include <linux/iso_fs_i.h> 173#include <linux/iso_fs_sb.h> 174 175static inline struct isofs_sb_info *ISOFS_SB(struct super_block *sb) 176{ 177 return sb->s_fs_info; 178} 179 180static inline struct iso_inode_info *ISOFS_I(struct inode *inode) 181{ 182 return container_of(inode, struct iso_inode_info, vfs_inode); 183} 184 185static inline int isonum_711(char *p) 186{ 187 return *(u8 *)p; 188} 189static inline int isonum_712(char *p) 190{ 191 return *(s8 *)p; 192} 193static inline unsigned int isonum_721(char *p) 194{ 195 return le16_to_cpu(get_unaligned((__le16 *)p)); 196} 197static inline unsigned int isonum_722(char *p) 198{ 199 return be16_to_cpu(get_unaligned((__le16 *)p)); 200} 201static inline unsigned int isonum_723(char *p) 202{ 203 /* Ignore bigendian datum due to broken mastering programs */ 204 return le16_to_cpu(get_unaligned((__le16 *)p)); 205} 206static inline unsigned int isonum_731(char *p) 207{ 208 return le32_to_cpu(get_unaligned((__le32 *)p)); 209} 210static inline unsigned int isonum_732(char *p) 211{ 212 return be32_to_cpu(get_unaligned((__le32 *)p)); 213} 214static inline unsigned int isonum_733(char *p) 215{ 216 /* Ignore bigendian datum due to broken mastering programs */ 217 return le32_to_cpu(get_unaligned((__le32 *)p)); 218} 219extern int iso_date(char *, int); 220 221struct inode; /* To make gcc happy */ 222 223extern int parse_rock_ridge_inode(struct iso_directory_record *, struct inode *); 224extern int get_rock_ridge_filename(struct iso_directory_record *, char *, struct inode *); 225extern int isofs_name_translate(struct iso_directory_record *, char *, struct inode *); 226 227int get_joliet_filename(struct iso_directory_record *, unsigned char *, struct inode *); 228int get_acorn_filename(struct iso_directory_record *, char *, struct inode *); 229 230extern struct dentry *isofs_lookup(struct inode *, struct dentry *, struct nameidata *); 231extern struct buffer_head *isofs_bread(struct inode *, sector_t); 232extern int isofs_get_blocks(struct inode *, sector_t, struct buffer_head **, unsigned long); 233 234extern struct inode *isofs_iget(struct super_block *sb, 235 unsigned long block, 236 unsigned long offset); 237 238/* Because the inode number is no longer relevant to finding the 239 * underlying meta-data for an inode, we are free to choose a more 240 * convenient 32-bit number as the inode number. The inode numbering 241 * scheme was recommended by Sergey Vlasov and Eric Lammerts. */ 242static inline unsigned long isofs_get_ino(unsigned long block, 243 unsigned long offset, 244 unsigned long bufbits) 245{ 246 return (block << (bufbits - 5)) | (offset >> 5); 247} 248 249/* Every directory can have many redundant directory entries scattered 250 * throughout the directory tree. First there is the directory entry 251 * with the name of the directory stored in the parent directory. 252 * Then, there is the "." directory entry stored in the directory 253 * itself. Finally, there are possibly many ".." directory entries 254 * stored in all the subdirectories. 255 * 256 * In order for the NFS get_parent() method to work and for the 257 * general consistency of the dcache, we need to make sure the 258 * "i_iget5_block" and "i_iget5_offset" all point to exactly one of 259 * the many redundant entries for each directory. We normalize the 260 * block and offset by always making them point to the "." directory. 261 * 262 * Notice that we do not use the entry for the directory with the name 263 * that is located in the parent directory. Even though choosing this 264 * first directory is more natural, it is much easier to find the "." 265 * entry in the NFS get_parent() method because it is implicitly 266 * encoded in the "extent + ext_attr_length" fields of _all_ the 267 * redundant entries for the directory. Thus, it can always be 268 * reached regardless of which directory entry you have in hand. 269 * 270 * This works because the "." entry is simply the first directory 271 * record when you start reading the file that holds all the directory 272 * records, and this file starts at "extent + ext_attr_length" blocks. 273 * Because the "." entry is always the first entry listed in the 274 * directories file, the normalized "offset" value is always 0. 275 * 276 * You should pass the directory entry in "de". On return, "block" 277 * and "offset" will hold normalized values. Only directories are 278 * affected making it safe to call even for non-directory file 279 * types. */ 280static inline void 281isofs_normalize_block_and_offset(struct iso_directory_record* de, 282 unsigned long *block, 283 unsigned long *offset) 284{ 285 /* Only directories are normalized. */ 286 if (de->flags[0] & 2) { 287 *offset = 0; 288 *block = (unsigned long)isonum_733(de->extent) 289 + (unsigned long)isonum_711(de->ext_attr_length); 290 } 291} 292 293extern struct inode_operations isofs_dir_inode_operations; 294extern struct file_operations isofs_dir_operations; 295extern struct address_space_operations isofs_symlink_aops; 296extern struct export_operations isofs_export_ops; 297 298/* The following macros are used to check for memory leaks. */ 299#ifdef LEAK_CHECK 300#define free_s leak_check_free_s 301#define malloc leak_check_malloc 302#define sb_bread leak_check_bread 303#define brelse leak_check_brelse 304extern void * leak_check_malloc(unsigned int size); 305extern void leak_check_free_s(void * obj, int size); 306extern struct buffer_head * leak_check_bread(struct super_block *sb, int block); 307extern void leak_check_brelse(struct buffer_head * bh); 308#endif /* LEAK_CHECK */ 309 310#endif /* __KERNEL__ */ 311 312#endif