Linux Audio

Check our new training course

Loading...
v5.4
  1/* SPDX-License-Identifier: GPL-2.0 */
  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 * iso fs inode data in memory
 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 * iso9660 super-block data in memory
 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; /* offset of SUSP fields within SU area */
 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; /* Broken disks with high byte of length
 49				  * containing junk */
 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; /* Native language support table */
 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	/* Ignore bigendian datum due to broken mastering programs */
 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	/* Ignore bigendian datum due to broken mastering programs */
108	return get_unaligned_le32(p);
109}
110extern int iso_date(u8 *, int);
111
112struct inode;		/* To make gcc happy */
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/* Because the inode number is no longer relevant to finding the
145 * underlying meta-data for an inode, we are free to choose a more
146 * convenient 32-bit number as the inode number.  The inode numbering
147 * scheme was recommended by Sergey Vlasov and Eric Lammerts. */
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/* Every directory can have many redundant directory entries scattered
156 * throughout the directory tree.  First there is the directory entry
157 * with the name of the directory stored in the parent directory.
158 * Then, there is the "." directory entry stored in the directory
159 * itself.  Finally, there are possibly many ".." directory entries
160 * stored in all the subdirectories.
161 *
162 * In order for the NFS get_parent() method to work and for the
163 * general consistency of the dcache, we need to make sure the
164 * "i_iget5_block" and "i_iget5_offset" all point to exactly one of
165 * the many redundant entries for each directory.  We normalize the
166 * block and offset by always making them point to the "."  directory.
167 *
168 * Notice that we do not use the entry for the directory with the name
169 * that is located in the parent directory.  Even though choosing this
170 * first directory is more natural, it is much easier to find the "."
171 * entry in the NFS get_parent() method because it is implicitly
172 * encoded in the "extent + ext_attr_length" fields of _all_ the
173 * redundant entries for the directory.  Thus, it can always be
174 * reached regardless of which directory entry you have in hand.
175 *
176 * This works because the "." entry is simply the first directory
177 * record when you start reading the file that holds all the directory
178 * records, and this file starts at "extent + ext_attr_length" blocks.
179 * Because the "." entry is always the first entry listed in the
180 * directories file, the normalized "offset" value is always 0.
181 *
182 * You should pass the directory entry in "de".  On return, "block"
183 * and "offset" will hold normalized values.  Only directories are
184 * affected making it safe to call even for non-directory file
185 * types. */
186static inline void
187isofs_normalize_block_and_offset(struct iso_directory_record* de,
188				 unsigned long *block,
189				 unsigned long *offset)
190{
191	/* Only directories are normalized. */
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;
v4.6
 
  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
  7enum 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 */
 16struct 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 */
 31struct 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
 62static inline struct isofs_sb_info *ISOFS_SB(struct super_block *sb)
 63{
 64	return sb->s_fs_info;
 65}
 66
 67static inline struct iso_inode_info *ISOFS_I(struct inode *inode)
 68{
 69	return container_of(inode, struct iso_inode_info, vfs_inode);
 70}
 71
 72static inline int isonum_711(char *p)
 73{
 74	return *(u8 *)p;
 75}
 76static inline int isonum_712(char *p)
 77{
 78	return *(s8 *)p;
 79}
 80static inline unsigned int isonum_721(char *p)
 81{
 82	return get_unaligned_le16(p);
 83}
 84static inline unsigned int isonum_722(char *p)
 85{
 86	return get_unaligned_be16(p);
 87}
 88static inline unsigned int isonum_723(char *p)
 89{
 90	/* Ignore bigendian datum due to broken mastering programs */
 91	return get_unaligned_le16(p);
 92}
 93static inline unsigned int isonum_731(char *p)
 94{
 95	return get_unaligned_le32(p);
 96}
 97static inline unsigned int isonum_732(char *p)
 98{
 99	return get_unaligned_be32(p);
100}
101static inline unsigned int isonum_733(char *p)
102{
103	/* Ignore bigendian datum due to broken mastering programs */
104	return get_unaligned_le32(p);
105}
106extern int iso_date(char *, int);
107
108struct inode;		/* To make gcc happy */
109
110extern int parse_rock_ridge_inode(struct iso_directory_record *, struct inode *, int relocated);
111extern int get_rock_ridge_filename(struct iso_directory_record *, char *, struct inode *);
112extern int isofs_name_translate(struct iso_directory_record *, char *, struct inode *);
113
114int get_joliet_filename(struct iso_directory_record *, unsigned char *, struct inode *);
115int get_acorn_filename(struct iso_directory_record *, char *, struct inode *);
116
117extern struct dentry *isofs_lookup(struct inode *, struct dentry *, unsigned int flags);
118extern struct buffer_head *isofs_bread(struct inode *, sector_t);
119extern int isofs_get_blocks(struct inode *, sector_t, struct buffer_head **, unsigned long);
120
121struct inode *__isofs_iget(struct super_block *sb,
122			   unsigned long block,
123			   unsigned long offset,
124			   int relocated);
125
126static inline struct inode *isofs_iget(struct super_block *sb,
127				       unsigned long block,
128				       unsigned long offset)
129{
130	return __isofs_iget(sb, block, offset, 0);
131}
132
133static inline struct inode *isofs_iget_reloc(struct super_block *sb,
134					     unsigned long block,
135					     unsigned long offset)
136{
137	return __isofs_iget(sb, block, offset, 1);
138}
139
140/* Because the inode number is no longer relevant to finding the
141 * underlying meta-data for an inode, we are free to choose a more
142 * convenient 32-bit number as the inode number.  The inode numbering
143 * scheme was recommended by Sergey Vlasov and Eric Lammerts. */
144static inline unsigned long isofs_get_ino(unsigned long block,
145					  unsigned long offset,
146					  unsigned long bufbits)
147{
148	return (block << (bufbits - 5)) | (offset >> 5);
149}
150
151/* Every directory can have many redundant directory entries scattered
152 * throughout the directory tree.  First there is the directory entry
153 * with the name of the directory stored in the parent directory.
154 * Then, there is the "." directory entry stored in the directory
155 * itself.  Finally, there are possibly many ".." directory entries
156 * stored in all the subdirectories.
157 *
158 * In order for the NFS get_parent() method to work and for the
159 * general consistency of the dcache, we need to make sure the
160 * "i_iget5_block" and "i_iget5_offset" all point to exactly one of
161 * the many redundant entries for each directory.  We normalize the
162 * block and offset by always making them point to the "."  directory.
163 *
164 * Notice that we do not use the entry for the directory with the name
165 * that is located in the parent directory.  Even though choosing this
166 * first directory is more natural, it is much easier to find the "."
167 * entry in the NFS get_parent() method because it is implicitly
168 * encoded in the "extent + ext_attr_length" fields of _all_ the
169 * redundant entries for the directory.  Thus, it can always be
170 * reached regardless of which directory entry you have in hand.
171 *
172 * This works because the "." entry is simply the first directory
173 * record when you start reading the file that holds all the directory
174 * records, and this file starts at "extent + ext_attr_length" blocks.
175 * Because the "." entry is always the first entry listed in the
176 * directories file, the normalized "offset" value is always 0.
177 *
178 * You should pass the directory entry in "de".  On return, "block"
179 * and "offset" will hold normalized values.  Only directories are
180 * affected making it safe to call even for non-directory file
181 * types. */
182static inline void
183isofs_normalize_block_and_offset(struct iso_directory_record* de,
184				 unsigned long *block,
185				 unsigned long *offset)
186{
187	/* Only directories are normalized. */
188	if (de->flags[0] & 2) {
189		*offset = 0;
190		*block = (unsigned long)isonum_733(de->extent)
191			+ (unsigned long)isonum_711(de->ext_attr_length);
192	}
193}
194
195extern const struct inode_operations isofs_dir_inode_operations;
196extern const struct file_operations isofs_dir_operations;
197extern const struct address_space_operations isofs_symlink_aops;
198extern const struct export_operations isofs_export_ops;