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#define ISOFS_ZONE_BITS(INODE) ((INODE)->i_sb->u.isofs_sb.s_log_zone_size) 164 165#define ISOFS_SUPER_MAGIC 0x9660 166 167#ifdef __KERNEL__ 168/* Number conversion inlines, named after the section in ISO 9660 169 they correspond to. */ 170 171#include <asm/byteorder.h> 172#include <asm/unaligned.h> 173 174static inline int isonum_711(char *p) 175{ 176 return *(u8 *)p; 177} 178static inline int isonum_712(char *p) 179{ 180 return *(s8 *)p; 181} 182static inline int isonum_721(char *p) 183{ 184 return le16_to_cpu(get_unaligned((u16 *)p)); 185} 186static inline int isonum_722(char *p) 187{ 188 return be16_to_cpu(get_unaligned((u16 *)p)); 189} 190static inline int isonum_723(char *p) 191{ 192 /* Ignore bigendian datum due to broken mastering programs */ 193 return le16_to_cpu(get_unaligned((u16 *)p)); 194} 195static inline int isonum_731(char *p) 196{ 197 return le32_to_cpu(get_unaligned((u32 *)p)); 198} 199static inline int isonum_732(char *p) 200{ 201 return be32_to_cpu(get_unaligned((u32 *)p)); 202} 203static inline int isonum_733(char *p) 204{ 205 /* Ignore bigendian datum due to broken mastering programs */ 206 return le32_to_cpu(get_unaligned((u32 *)p)); 207} 208extern int iso_date(char *, int); 209 210struct inode; /* To make gcc happy */ 211 212extern int parse_rock_ridge_inode(struct iso_directory_record *, struct inode *); 213extern int get_rock_ridge_filename(struct iso_directory_record *, char *, struct inode *); 214extern int isofs_name_translate(struct iso_directory_record *, char *, struct inode *); 215 216extern int find_rock_ridge_relocation(struct iso_directory_record *, struct inode *); 217 218int get_joliet_filename(struct iso_directory_record *, unsigned char *, struct inode *); 219int get_acorn_filename(struct iso_directory_record *, char *, struct inode *); 220 221extern struct dentry *isofs_lookup(struct inode *, struct dentry *); 222extern struct buffer_head *isofs_bread(struct inode *inode, unsigned int block); 223extern int isofs_get_blocks(struct inode *, long, struct buffer_head **, unsigned long); 224 225extern struct inode_operations isofs_dir_inode_operations; 226extern struct file_operations isofs_dir_operations; 227extern struct address_space_operations isofs_symlink_aops; 228 229/* The following macros are used to check for memory leaks. */ 230#ifdef LEAK_CHECK 231#define free_s leak_check_free_s 232#define malloc leak_check_malloc 233#define sb_bread leak_check_bread 234#define brelse leak_check_brelse 235extern void * leak_check_malloc(unsigned int size); 236extern void leak_check_free_s(void * obj, int size); 237extern struct buffer_head * leak_check_bread(struct super_block *sb, int block); 238extern void leak_check_brelse(struct buffer_head * bh); 239#endif /* LEAK_CHECK */ 240 241#endif /* __KERNEL__ */ 242 243#endif 244