1 /*
2  *  linux/fs/isofs/inode.c
3  *
4  *  (C) 1991  Linus Torvalds - minix filesystem
5  *      1992, 1993, 1994  Eric Youngdale Modified for ISO 9660 filesystem.
6  *      1994  Eberhard Moenkeberg - multi session handling.
7  *      1995  Mark Dobie - allow mounting of some weird VideoCDs and PhotoCDs.
8  *	1997  Gordon Chaffee - Joliet CDs
9  *	1998  Eric Lammerts - ISO 9660 Level 3
10  */
11 
12 #include <linux/config.h>
13 #include <linux/module.h>
14 
15 #include <linux/stat.h>
16 #include <linux/sched.h>
17 #include <linux/iso_fs.h>
18 #include <linux/kernel.h>
19 #include <linux/major.h>
20 #include <linux/mm.h>
21 #include <linux/string.h>
22 #include <linux/locks.h>
23 #include <linux/slab.h>
24 #include <linux/errno.h>
25 #include <linux/cdrom.h>
26 #include <linux/init.h>
27 #include <linux/nls.h>
28 #include <linux/ctype.h>
29 #include <linux/smp_lock.h>
30 #include <linux/blkdev.h>
31 
32 #include <asm/system.h>
33 #include <asm/uaccess.h>
34 
35 #include "zisofs.h"
36 
37 #define BEQUIET
38 
39 #ifdef LEAK_CHECK
40 static int check_malloc = 0;
41 static int check_bread = 0;
42 #endif
43 
44 static int isofs_hashi(struct dentry *parent, struct qstr *qstr);
45 static int isofs_hash(struct dentry *parent, struct qstr *qstr);
46 static int isofs_dentry_cmpi(struct dentry *dentry, struct qstr *a, struct qstr *b);
47 static int isofs_dentry_cmp(struct dentry *dentry, struct qstr *a, struct qstr *b);
48 
49 #ifdef CONFIG_JOLIET
50 static int isofs_hashi_ms(struct dentry *parent, struct qstr *qstr);
51 static int isofs_hash_ms(struct dentry *parent, struct qstr *qstr);
52 static int isofs_dentry_cmpi_ms(struct dentry *dentry, struct qstr *a, struct qstr *b);
53 static int isofs_dentry_cmp_ms(struct dentry *dentry, struct qstr *a, struct qstr *b);
54 #endif
55 
isofs_put_super(struct super_block * sb)56 static void isofs_put_super(struct super_block *sb)
57 {
58 #ifdef CONFIG_JOLIET
59 	if (sb->u.isofs_sb.s_nls_iocharset) {
60 		unload_nls(sb->u.isofs_sb.s_nls_iocharset);
61 		sb->u.isofs_sb.s_nls_iocharset = NULL;
62 	}
63 #endif
64 
65 #ifdef LEAK_CHECK
66 	printk("Outstanding mallocs:%d, outstanding buffers: %d\n",
67 	       check_malloc, check_bread);
68 #endif
69 
70 	return;
71 }
72 
73 static void isofs_read_inode(struct inode *);
74 static int isofs_statfs (struct super_block *, struct statfs *);
75 
76 static struct super_operations isofs_sops = {
77 	read_inode:	isofs_read_inode,
78 	put_super:	isofs_put_super,
79 	statfs:		isofs_statfs,
80 };
81 
82 static struct dentry_operations isofs_dentry_ops[] = {
83 	{
84 		d_hash:		isofs_hash,
85 		d_compare:	isofs_dentry_cmp,
86 	},
87 	{
88 		d_hash:		isofs_hashi,
89 		d_compare:	isofs_dentry_cmpi,
90 	},
91 #ifdef CONFIG_JOLIET
92 	{
93 		d_hash:		isofs_hash_ms,
94 		d_compare:	isofs_dentry_cmp_ms,
95 	},
96 	{
97 		d_hash:		isofs_hashi_ms,
98 		d_compare:	isofs_dentry_cmpi_ms,
99 	}
100 #endif
101 };
102 
103 struct iso9660_options{
104 	char map;
105 	char rock;
106 	char joliet;
107 	char cruft;
108 	char unhide;
109 	char nocompress;
110 	unsigned char check;
111 	unsigned int blocksize;
112 	mode_t mode;
113 	gid_t gid;
114 	uid_t uid;
115 	char *iocharset;
116 	unsigned char utf8;
117         /* LVE */
118         s32 session;
119         s32 sbsector;
120 };
121 
122 /*
123  * Compute the hash for the isofs name corresponding to the dentry.
124  */
125 static int
isofs_hash_common(struct dentry * dentry,struct qstr * qstr,int ms)126 isofs_hash_common(struct dentry *dentry, struct qstr *qstr, int ms)
127 {
128 	const char *name;
129 	int len;
130 
131 	len = qstr->len;
132 	name = qstr->name;
133 	if (ms) {
134 		while (len && name[len-1] == '.')
135 			len--;
136 	}
137 
138 	qstr->hash = full_name_hash(name, len);
139 
140 	return 0;
141 }
142 
143 /*
144  * Compute the hash for the isofs name corresponding to the dentry.
145  */
146 static int
isofs_hashi_common(struct dentry * dentry,struct qstr * qstr,int ms)147 isofs_hashi_common(struct dentry *dentry, struct qstr *qstr, int ms)
148 {
149 	const char *name;
150 	int len;
151 	char c;
152 	unsigned long hash;
153 
154 	len = qstr->len;
155 	name = qstr->name;
156 	if (ms) {
157 		while (len && name[len-1] == '.')
158 			len--;
159 	}
160 
161 	hash = init_name_hash();
162 	while (len--) {
163 		c = tolower(*name++);
164 		hash = partial_name_hash(tolower(c), hash);
165 	}
166 	qstr->hash = end_name_hash(hash);
167 
168 	return 0;
169 }
170 
171 /*
172  * Case insensitive compare of two isofs names.
173  */
174 static int
isofs_dentry_cmpi_common(struct dentry * dentry,struct qstr * a,struct qstr * b,int ms)175 isofs_dentry_cmpi_common(struct dentry *dentry,struct qstr *a,struct qstr *b,int ms)
176 {
177 	int alen, blen;
178 
179 	/* A filename cannot end in '.' or we treat it like it has none */
180 	alen = a->len;
181 	blen = b->len;
182 	if (ms) {
183 		while (alen && a->name[alen-1] == '.')
184 			alen--;
185 		while (blen && b->name[blen-1] == '.')
186 			blen--;
187 	}
188 	if (alen == blen) {
189 		if (strnicmp(a->name, b->name, alen) == 0)
190 			return 0;
191 	}
192 	return 1;
193 }
194 
195 /*
196  * Case sensitive compare of two isofs names.
197  */
198 static int
isofs_dentry_cmp_common(struct dentry * dentry,struct qstr * a,struct qstr * b,int ms)199 isofs_dentry_cmp_common(struct dentry *dentry,struct qstr *a,struct qstr *b,int ms)
200 {
201 	int alen, blen;
202 
203 	/* A filename cannot end in '.' or we treat it like it has none */
204 	alen = a->len;
205 	blen = b->len;
206 	if (ms) {
207 		while (alen && a->name[alen-1] == '.')
208 			alen--;
209 		while (blen && b->name[blen-1] == '.')
210 			blen--;
211 	}
212 	if (alen == blen) {
213 		if (strncmp(a->name, b->name, alen) == 0)
214 			return 0;
215 	}
216 	return 1;
217 }
218 
219 static int
isofs_hash(struct dentry * dentry,struct qstr * qstr)220 isofs_hash(struct dentry *dentry, struct qstr *qstr)
221 {
222 	return isofs_hash_common(dentry, qstr, 0);
223 }
224 
225 static int
isofs_hashi(struct dentry * dentry,struct qstr * qstr)226 isofs_hashi(struct dentry *dentry, struct qstr *qstr)
227 {
228 	return isofs_hashi_common(dentry, qstr, 0);
229 }
230 
231 static int
isofs_dentry_cmp(struct dentry * dentry,struct qstr * a,struct qstr * b)232 isofs_dentry_cmp(struct dentry *dentry,struct qstr *a,struct qstr *b)
233 {
234 	return isofs_dentry_cmp_common(dentry, a, b, 0);
235 }
236 
237 static int
isofs_dentry_cmpi(struct dentry * dentry,struct qstr * a,struct qstr * b)238 isofs_dentry_cmpi(struct dentry *dentry,struct qstr *a,struct qstr *b)
239 {
240 	return isofs_dentry_cmpi_common(dentry, a, b, 0);
241 }
242 
243 #ifdef CONFIG_JOLIET
244 static int
isofs_hash_ms(struct dentry * dentry,struct qstr * qstr)245 isofs_hash_ms(struct dentry *dentry, struct qstr *qstr)
246 {
247 	return isofs_hash_common(dentry, qstr, 1);
248 }
249 
250 static int
isofs_hashi_ms(struct dentry * dentry,struct qstr * qstr)251 isofs_hashi_ms(struct dentry *dentry, struct qstr *qstr)
252 {
253 	return isofs_hashi_common(dentry, qstr, 1);
254 }
255 
256 static int
isofs_dentry_cmp_ms(struct dentry * dentry,struct qstr * a,struct qstr * b)257 isofs_dentry_cmp_ms(struct dentry *dentry,struct qstr *a,struct qstr *b)
258 {
259 	return isofs_dentry_cmp_common(dentry, a, b, 1);
260 }
261 
262 static int
isofs_dentry_cmpi_ms(struct dentry * dentry,struct qstr * a,struct qstr * b)263 isofs_dentry_cmpi_ms(struct dentry *dentry,struct qstr *a,struct qstr *b)
264 {
265 	return isofs_dentry_cmpi_common(dentry, a, b, 1);
266 }
267 #endif
268 
parse_options(char * options,struct iso9660_options * popt)269 static int parse_options(char *options, struct iso9660_options * popt)
270 {
271 	char *this_char,*value;
272 
273 	popt->map = 'n';
274 	popt->rock = 'y';
275 	popt->joliet = 'y';
276 	popt->cruft = 'n';
277 	popt->unhide = 'n';
278 	popt->check = 'u';		/* unset */
279 	popt->nocompress = 0;
280 	popt->blocksize = 1024;
281 	popt->mode = S_IRUGO | S_IXUGO; /* r-x for all.  The disc could
282 					   be shared with DOS machines so
283 					   virtually anything could be
284 					   a valid executable. */
285 	popt->gid = 0;
286 	popt->uid = 0;
287 	popt->iocharset = NULL;
288 	popt->utf8 = 0;
289 	popt->session=-1;
290 	popt->sbsector=-1;
291 	if (!options) return 1;
292 	for (this_char = strtok(options,","); this_char; this_char = strtok(NULL,",")) {
293 	        if (strncmp(this_char,"norock",6) == 0) {
294 		  popt->rock = 'n';
295 		  continue;
296 		}
297 	        if (strncmp(this_char,"nojoliet",8) == 0) {
298 		  popt->joliet = 'n';
299 		  continue;
300 		}
301 	        if (strncmp(this_char,"unhide",6) == 0) {
302 		  popt->unhide = 'y';
303 		  continue;
304 		}
305 	        if (strncmp(this_char,"cruft",5) == 0) {
306 		  popt->cruft = 'y';
307 		  continue;
308 		}
309 	        if (strncmp(this_char,"utf8",4) == 0) {
310 		  popt->utf8 = 1;
311 		  continue;
312 		}
313 	        if (strncmp(this_char,"nocompress",10) == 0) {
314 		  popt->nocompress = 1;
315 		  continue;
316 		}
317 		if ((value = strchr(this_char,'=')) != NULL)
318 			*value++ = 0;
319 
320 #ifdef CONFIG_JOLIET
321 		if (!strcmp(this_char,"iocharset") && value) {
322 			popt->iocharset = value;
323 			while (*value && *value != ',')
324 				value++;
325 			if (value == popt->iocharset)
326 				return 0;
327 			*value = 0;
328 		} else
329 #endif
330 		if (!strcmp(this_char,"map") && value) {
331 			if (value[0] && !value[1] && strchr("ano",*value))
332 				popt->map = *value;
333 			else if (!strcmp(value,"off")) popt->map = 'o';
334 			else if (!strcmp(value,"normal")) popt->map = 'n';
335 			else if (!strcmp(value,"acorn")) popt->map = 'a';
336 			else return 0;
337 		}
338 		else if (!strcmp(this_char,"session") && value) {
339 			char * vpnt = value;
340 			unsigned int ivalue = simple_strtoul(vpnt, &vpnt, 0);
341 			if (ivalue > 99) return 0;
342 			popt->session=ivalue+1;
343 		}
344 		else if (!strcmp(this_char,"sbsector") && value) {
345 			char * vpnt = value;
346 			unsigned int ivalue = simple_strtoul(vpnt, &vpnt, 0);
347 			if (ivalue > 660*512) return 0;
348 			popt->sbsector=ivalue;
349 		}
350 		else if (!strcmp(this_char,"check") && value) {
351 			if (value[0] && !value[1] && strchr("rs",*value))
352 				popt->check = *value;
353 			else if (!strcmp(value,"relaxed")) popt->check = 'r';
354 			else if (!strcmp(value,"strict")) popt->check = 's';
355 			else return 0;
356 		}
357 		else if (!strcmp(this_char,"conv") && value) {
358 			/* no conversion is done anymore;
359 			   we still accept the same mount options,
360 			   but ignore them */
361 			if (value[0] && !value[1] && strchr("btma",*value)) ;
362 			else if (!strcmp(value,"binary")) ;
363 			else if (!strcmp(value,"text")) ;
364 			else if (!strcmp(value,"mtext")) ;
365 			else if (!strcmp(value,"auto")) ;
366 			else return 0;
367 		}
368 		else if (value &&
369 			 (!strcmp(this_char,"block") ||
370 			  !strcmp(this_char,"mode") ||
371 			  !strcmp(this_char,"uid") ||
372 			  !strcmp(this_char,"gid"))) {
373 		  char * vpnt = value;
374 		  unsigned int ivalue = simple_strtoul(vpnt, &vpnt, 0);
375 		  if (*vpnt) return 0;
376 		  switch(*this_char) {
377 		  case 'b':
378 		    if (   ivalue != 512
379 			&& ivalue != 1024
380 			&& ivalue != 2048) return 0;
381 		    popt->blocksize = ivalue;
382 		    break;
383 		  case 'u':
384 		    popt->uid = ivalue;
385 		    break;
386 		  case 'g':
387 		    popt->gid = ivalue;
388 		    break;
389 		  case 'm':
390 		    popt->mode = ivalue;
391 		    break;
392 		  }
393 		}
394 		else return 1;
395 	}
396 	return 1;
397 }
398 
399 /*
400  * look if the driver can tell the multi session redirection value
401  *
402  * don't change this if you don't know what you do, please!
403  * Multisession is legal only with XA disks.
404  * A non-XA disk with more than one volume descriptor may do it right, but
405  * usually is written in a nowhere standardized "multi-partition" manner.
406  * Multisession uses absolute addressing (solely the first frame of the whole
407  * track is #0), multi-partition uses relative addressing (each first frame of
408  * each track is #0), and a track is not a session.
409  *
410  * A broken CDwriter software or drive firmware does not set new standards,
411  * at least not if conflicting with the existing ones.
412  *
413  * emoenke@gwdg.de
414  */
415 #define WE_OBEY_THE_WRITTEN_STANDARDS 1
416 
isofs_get_last_session(struct super_block * sb,s32 session)417 static unsigned int isofs_get_last_session(struct super_block *sb,s32 session )
418 {
419 	struct cdrom_multisession ms_info;
420 	unsigned int vol_desc_start;
421 	struct block_device *bdev = sb->s_bdev;
422 	int i;
423 
424 	vol_desc_start=0;
425 	ms_info.addr_format=CDROM_LBA;
426 	if(session >= 0 && session <= 99) {
427 		struct cdrom_tocentry Te;
428 		Te.cdte_track=session;
429 		Te.cdte_format=CDROM_LBA;
430 		i = ioctl_by_bdev(bdev, CDROMREADTOCENTRY, (unsigned long) &Te);
431 		if (!i) {
432 			printk(KERN_DEBUG "Session %d start %d type %d\n",
433 			       session, Te.cdte_addr.lba,
434 			       Te.cdte_ctrl&CDROM_DATA_TRACK);
435 			if ((Te.cdte_ctrl&CDROM_DATA_TRACK) == 4)
436 				return Te.cdte_addr.lba;
437 		}
438 
439 		printk(KERN_ERR "Invalid session number or type of track\n");
440 	}
441 	i = ioctl_by_bdev(bdev, CDROMMULTISESSION, (unsigned long) &ms_info);
442 	if(session > 0) printk(KERN_ERR "Invalid session number\n");
443 #if 0
444 	printk("isofs.inode: CDROMMULTISESSION: rc=%d\n",i);
445 	if (i==0) {
446 		printk("isofs.inode: XA disk: %s\n",ms_info.xa_flag?"yes":"no");
447 		printk("isofs.inode: vol_desc_start = %d\n", ms_info.addr.lba);
448 	}
449 #endif
450 	if (i==0)
451 #if WE_OBEY_THE_WRITTEN_STANDARDS
452         if (ms_info.xa_flag) /* necessary for a valid ms_info.addr */
453 #endif
454 		vol_desc_start=ms_info.addr.lba;
455 	return vol_desc_start;
456 }
457 
458 /*
459  * Initialize the superblock and read the root inode.
460  *
461  * Note: a check_disk_change() has been done immediately prior
462  * to this call, so we don't need to check again.
463  */
isofs_read_super(struct super_block * s,void * data,int silent)464 static struct super_block *isofs_read_super(struct super_block *s, void *data,
465 					    int silent)
466 {
467 	kdev_t				dev = s->s_dev;
468 	struct buffer_head	      * bh = NULL, *pri_bh = NULL;
469 	struct hs_primary_descriptor  * h_pri = NULL;
470 	struct iso_primary_descriptor * pri = NULL;
471 	struct iso_supplementary_descriptor *sec = NULL;
472 	struct iso_directory_record   * rootp;
473 	int				joliet_level = 0;
474 	int				high_sierra;
475 	int				iso_blknum, block;
476 	int				orig_zonesize;
477 	int				table;
478 	unsigned int			blocksize, blocksize_bits;
479 	unsigned int			vol_desc_start;
480 	unsigned long			first_data_zone;
481 	struct inode		      * inode;
482 	struct iso9660_options		opt;
483 
484 	if (!parse_options((char *) data, &opt))
485 		goto out_unlock;
486 
487 	/*
488 	 * First of all, get the hardware blocksize for this device.
489 	 * If we don't know what it is, or the hardware blocksize is
490 	 * larger than the blocksize the user specified, then use
491 	 * that value.
492 	 */
493 	blocksize = get_hardsect_size(dev);
494 	if(blocksize > opt.blocksize) {
495 	    /*
496 	     * Force the blocksize we are going to use to be the
497 	     * hardware blocksize.
498 	     */
499 	    opt.blocksize = blocksize;
500 	}
501 
502 	blocksize_bits = 0;
503 	{
504 	  int i = opt.blocksize;
505 	  while (i != 1){
506 	    blocksize_bits++;
507 	    i >>=1;
508 	  }
509 	}
510 
511 	set_blocksize(dev, opt.blocksize);
512 	s->s_blocksize = opt.blocksize;
513 
514 	s->u.isofs_sb.s_high_sierra = high_sierra = 0; /* default is iso9660 */
515 
516 	vol_desc_start = (opt.sbsector != -1) ?
517 		opt.sbsector : isofs_get_last_session(s,opt.session);
518 
519   	for (iso_blknum = vol_desc_start+16;
520              iso_blknum < vol_desc_start+100; iso_blknum++)
521 	{
522 	    struct hs_volume_descriptor   * hdp;
523 	    struct iso_volume_descriptor  * vdp;
524 
525 	    block = iso_blknum << (ISOFS_BLOCK_BITS-blocksize_bits);
526 	    if (!(bh = sb_bread(s, block)))
527 		goto out_no_read;
528 
529 	    vdp = (struct iso_volume_descriptor *)bh->b_data;
530 	    hdp = (struct hs_volume_descriptor *)bh->b_data;
531 
532 	    /* Due to the overlapping physical location of the descriptors,
533 	     * ISO CDs can match hdp->id==HS_STANDARD_ID as well. To ensure
534 	     * proper identification in this case, we first check for ISO.
535 	     */
536 	    if (strncmp (vdp->id, ISO_STANDARD_ID, sizeof vdp->id) == 0) {
537 		if (isonum_711 (vdp->type) == ISO_VD_END)
538 		    break;
539 		if (isonum_711 (vdp->type) == ISO_VD_PRIMARY) {
540 		    if (pri == NULL) {
541 			pri = (struct iso_primary_descriptor *)vdp;
542 			/* Save the buffer in case we need it ... */
543 			pri_bh = bh;
544 			bh = NULL;
545 		    }
546 		}
547 #ifdef CONFIG_JOLIET
548 		else if (isonum_711 (vdp->type) == ISO_VD_SUPPLEMENTARY) {
549 		    sec = (struct iso_supplementary_descriptor *)vdp;
550 		    if (sec->escape[0] == 0x25 && sec->escape[1] == 0x2f) {
551 			if (opt.joliet == 'y') {
552 			    if (sec->escape[2] == 0x40) {
553 				joliet_level = 1;
554 			    } else if (sec->escape[2] == 0x43) {
555 				joliet_level = 2;
556 			    } else if (sec->escape[2] == 0x45) {
557 				joliet_level = 3;
558 			    }
559 			    printk(KERN_DEBUG"ISO 9660 Extensions: Microsoft Joliet Level %d\n",
560 				   joliet_level);
561 			}
562 			goto root_found;
563 		    } else {
564 			/* Unknown supplementary volume descriptor */
565 			sec = NULL;
566 		    }
567 		}
568 #endif
569 	    } else {
570 	        if (strncmp (hdp->id, HS_STANDARD_ID, sizeof hdp->id) == 0) {
571 		    if (isonum_711 (hdp->type) != ISO_VD_PRIMARY)
572 		        goto out_freebh;
573 
574 		    s->u.isofs_sb.s_high_sierra = 1;
575 		    high_sierra = 1;
576 		    opt.rock = 'n';
577 		    h_pri = (struct hs_primary_descriptor *)vdp;
578 		    goto root_found;
579 		}
580 	    }
581 
582             /* Just skip any volume descriptors we don't recognize */
583 
584 	    brelse(bh);
585 	    bh = NULL;
586 	}
587 	/*
588 	 * If we fall through, either no volume descriptor was found,
589 	 * or else we passed a primary descriptor looking for others.
590 	 */
591 	if (!pri)
592 		goto out_unknown_format;
593 	brelse(bh);
594 	bh = pri_bh;
595 	pri_bh = NULL;
596 
597 root_found:
598 
599 	if (joliet_level && (pri == NULL || opt.rock == 'n')) {
600 	    /* This is the case of Joliet with the norock mount flag.
601 	     * A disc with both Joliet and Rock Ridge is handled later
602 	     */
603 	    pri = (struct iso_primary_descriptor *) sec;
604 	}
605 
606 	if(high_sierra){
607 	  rootp = (struct iso_directory_record *) h_pri->root_directory_record;
608 	  s->u.isofs_sb.s_nzones = isonum_733 (h_pri->volume_space_size);
609 	  s->u.isofs_sb.s_log_zone_size = isonum_723 (h_pri->logical_block_size);
610 	  s->u.isofs_sb.s_max_size = isonum_733(h_pri->volume_space_size);
611 	} else {
612 	  if (!pri)
613 	    goto out_freebh;
614 	  rootp = (struct iso_directory_record *) pri->root_directory_record;
615 	  s->u.isofs_sb.s_nzones = isonum_733 (pri->volume_space_size);
616 	  s->u.isofs_sb.s_log_zone_size = isonum_723 (pri->logical_block_size);
617 	  s->u.isofs_sb.s_max_size = isonum_733(pri->volume_space_size);
618 	}
619 
620 	s->u.isofs_sb.s_ninodes = 0; /* No way to figure this out easily */
621 
622 	orig_zonesize = s -> u.isofs_sb.s_log_zone_size;
623 	/*
624 	 * If the zone size is smaller than the hardware sector size,
625 	 * this is a fatal error.  This would occur if the disc drive
626 	 * had sectors that were 2048 bytes, but the filesystem had
627 	 * blocks that were 512 bytes (which should only very rarely
628 	 * happen.)
629 	 */
630 	if(blocksize != 0 && orig_zonesize < blocksize)
631 		goto out_bad_size;
632 
633 	/* RDE: convert log zone size to bit shift */
634 	switch (s -> u.isofs_sb.s_log_zone_size)
635 	  { case  512: s -> u.isofs_sb.s_log_zone_size =  9; break;
636 	    case 1024: s -> u.isofs_sb.s_log_zone_size = 10; break;
637 	    case 2048: s -> u.isofs_sb.s_log_zone_size = 11; break;
638 
639 	    default:
640 		goto out_bad_zone_size;
641 	  }
642 
643 	s->s_magic = ISOFS_SUPER_MAGIC;
644 
645 	/* The CDROM is read-only, has no nodes (devices) on it, and since
646 	   all of the files appear to be owned by root, we really do not want
647 	   to allow suid.  (suid or devices will not show up unless we have
648 	   Rock Ridge extensions) */
649 
650 	s->s_flags |= MS_RDONLY /* | MS_NODEV | MS_NOSUID */;
651 
652 	/* Set this for reference. Its not currently used except on write
653 	   which we don't have .. */
654 
655 	/* RDE: data zone now byte offset! */
656 
657 	first_data_zone = ((isonum_733 (rootp->extent) +
658 			  isonum_711 (rootp->ext_attr_length))
659 			 << s -> u.isofs_sb.s_log_zone_size);
660 	s->u.isofs_sb.s_firstdatazone = first_data_zone;
661 #ifndef BEQUIET
662 	printk(KERN_DEBUG "Max size:%ld   Log zone size:%ld\n",
663 	       s->u.isofs_sb.s_max_size,
664 	       1UL << s->u.isofs_sb.s_log_zone_size);
665 	printk(KERN_DEBUG "First datazone:%ld   Root inode number:%ld\n",
666 	       s->u.isofs_sb.s_firstdatazone >> s -> u.isofs_sb.s_log_zone_size,
667 	       s->u.isofs_sb.s_firstdatazone);
668 	if(high_sierra)
669 		printk(KERN_DEBUG "Disc in High Sierra format.\n");
670 #endif
671 
672 	/*
673 	 * If the Joliet level is set, we _may_ decide to use the
674 	 * secondary descriptor, but can't be sure until after we
675 	 * read the root inode. But before reading the root inode
676 	 * we may need to change the device blocksize, and would
677 	 * rather release the old buffer first. So, we cache the
678 	 * first_data_zone value from the secondary descriptor.
679 	 */
680 	if (joliet_level) {
681 		pri = (struct iso_primary_descriptor *) sec;
682 		rootp = (struct iso_directory_record *)
683 			pri->root_directory_record;
684 		first_data_zone = ((isonum_733 (rootp->extent) +
685 			  	isonum_711 (rootp->ext_attr_length))
686 				 << s -> u.isofs_sb.s_log_zone_size);
687 	}
688 
689 	/*
690 	 * We're all done using the volume descriptor, and may need
691 	 * to change the device blocksize, so release the buffer now.
692 	 */
693 	brelse(pri_bh);
694 	brelse(bh);
695 
696 	/*
697 	 * Force the blocksize to 512 for 512 byte sectors.  The file
698 	 * read primitives really get it wrong in a bad way if we don't
699 	 * do this.
700 	 *
701 	 * Note - we should never be setting the blocksize to something
702 	 * less than the hardware sector size for the device.  If we
703 	 * do, we would end up having to read larger buffers and split
704 	 * out portions to satisfy requests.
705 	 *
706 	 * Note2- the idea here is that we want to deal with the optimal
707 	 * zonesize in the filesystem.  If we have it set to something less,
708 	 * then we have horrible problems with trying to piece together
709 	 * bits of adjacent blocks in order to properly read directory
710 	 * entries.  By forcing the blocksize in this way, we ensure
711 	 * that we will never be required to do this.
712 	 */
713 	if ( orig_zonesize != opt.blocksize ) {
714 		set_blocksize(dev, orig_zonesize);
715 #ifndef BEQUIET
716 		printk(KERN_DEBUG
717 			"ISOFS: Forcing new log zone size:%d\n", orig_zonesize);
718 #endif
719 	}
720 	s->s_blocksize = orig_zonesize;
721 	s->s_blocksize_bits = s -> u.isofs_sb.s_log_zone_size;
722 
723 	s->u.isofs_sb.s_nls_iocharset = NULL;
724 
725 #ifdef CONFIG_JOLIET
726 	if (joliet_level && opt.utf8 == 0) {
727 		char * p = opt.iocharset ? opt.iocharset : "iso8859-1";
728 		s->u.isofs_sb.s_nls_iocharset = load_nls(p);
729 		if (! s->u.isofs_sb.s_nls_iocharset) {
730 			/* Fail only if explicit charset specified */
731 			if (opt.iocharset)
732 				goto out_unlock;
733 			s->u.isofs_sb.s_nls_iocharset = load_nls_default();
734 		}
735 	}
736 #endif
737 	s->s_op = &isofs_sops;
738 	s->u.isofs_sb.s_mapping = opt.map;
739 	s->u.isofs_sb.s_rock = (opt.rock == 'y' ? 2 : 0);
740 	s->u.isofs_sb.s_rock_offset = -1; /* initial offset, will guess until SP is found*/
741 	s->u.isofs_sb.s_cruft = opt.cruft;
742 	s->u.isofs_sb.s_unhide = opt.unhide;
743 	s->u.isofs_sb.s_uid = opt.uid;
744 	s->u.isofs_sb.s_gid = opt.gid;
745 	s->u.isofs_sb.s_utf8 = opt.utf8;
746 	s->u.isofs_sb.s_nocompress = opt.nocompress;
747 	/*
748 	 * It would be incredibly stupid to allow people to mark every file
749 	 * on the disk as suid, so we merely allow them to set the default
750 	 * permissions.
751 	 */
752 	s->u.isofs_sb.s_mode = opt.mode & 0777;
753 
754 	/*
755 	 * Read the root inode, which _may_ result in changing
756 	 * the s_rock flag. Once we have the final s_rock value,
757 	 * we then decide whether to use the Joliet descriptor.
758 	 */
759 	inode = iget(s, s->u.isofs_sb.s_firstdatazone);
760 
761 	/*
762 	 * If this disk has both Rock Ridge and Joliet on it, then we
763 	 * want to use Rock Ridge by default.  This can be overridden
764 	 * by using the norock mount option.  There is still one other
765 	 * possibility that is not taken into account: a Rock Ridge
766 	 * CD with Unicode names.  Until someone sees such a beast, it
767 	 * will not be supported.
768 	 */
769 	if (s->u.isofs_sb.s_rock == 1) {
770 		joliet_level = 0;
771 	} else if (joliet_level) {
772 		s->u.isofs_sb.s_rock = 0;
773 		if (s->u.isofs_sb.s_firstdatazone != first_data_zone) {
774 			s->u.isofs_sb.s_firstdatazone = first_data_zone;
775 			printk(KERN_DEBUG
776 				"ISOFS: changing to secondary root\n");
777 			iput(inode);
778 			inode = iget(s, s->u.isofs_sb.s_firstdatazone);
779 		}
780 	}
781 
782 	if (opt.check == 'u') {
783 		/* Only Joliet is case insensitive by default */
784 		if (joliet_level) opt.check = 'r';
785 		else opt.check = 's';
786 	}
787 	s->u.isofs_sb.s_joliet_level = joliet_level;
788 
789 	/* check the root inode */
790 	if (!inode)
791 		goto out_no_root;
792 	if (!inode->i_op)
793 		goto out_bad_root;
794 	/* get the root dentry */
795 	s->s_root = d_alloc_root(inode);
796 	if (!(s->s_root))
797 		goto out_no_root;
798 
799 	table = 0;
800 	if (joliet_level) table += 2;
801 	if (opt.check == 'r') table++;
802 	s->s_root->d_op = &isofs_dentry_ops[table];
803 
804 	return s;
805 
806 	/*
807 	 * Display error messages and free resources.
808 	 */
809 out_bad_root:
810 	printk(KERN_WARNING "isofs_read_super: root inode not initialized\n");
811 	goto out_iput;
812 out_no_root:
813 	printk(KERN_WARNING "isofs_read_super: get root inode failed\n");
814 out_iput:
815 	iput(inode);
816 #ifdef CONFIG_JOLIET
817 	if (s->u.isofs_sb.s_nls_iocharset)
818 		unload_nls(s->u.isofs_sb.s_nls_iocharset);
819 #endif
820 	goto out_unlock;
821 out_no_read:
822 	printk(KERN_WARNING "isofs_read_super: "
823 		"bread failed, dev=%s, iso_blknum=%d, block=%d\n",
824 		kdevname(dev), iso_blknum, block);
825 	goto out_unlock;
826 out_bad_zone_size:
827 	printk(KERN_WARNING "Bad logical zone size %ld\n",
828 		s->u.isofs_sb.s_log_zone_size);
829 	goto out_freebh;
830 out_bad_size:
831 	printk(KERN_WARNING "Logical zone size(%d) < hardware blocksize(%u)\n",
832 		orig_zonesize, blocksize);
833 	goto out_freebh;
834 out_unknown_format:
835 	if (!silent)
836 		printk(KERN_WARNING "Unable to identify CD-ROM format.\n");
837 
838 out_freebh:
839 	brelse(bh);
840 out_unlock:
841 	return NULL;
842 }
843 
isofs_statfs(struct super_block * sb,struct statfs * buf)844 static int isofs_statfs (struct super_block *sb, struct statfs *buf)
845 {
846 	buf->f_type = ISOFS_SUPER_MAGIC;
847 	buf->f_bsize = sb->s_blocksize;
848 	buf->f_blocks = (sb->u.isofs_sb.s_nzones
849                   << (sb->u.isofs_sb.s_log_zone_size - sb->s_blocksize_bits));
850 	buf->f_bfree = 0;
851 	buf->f_bavail = 0;
852 	buf->f_files = sb->u.isofs_sb.s_ninodes;
853 	buf->f_ffree = 0;
854 	buf->f_namelen = NAME_MAX;
855 	return 0;
856 }
857 
858 /*
859  * Get a set of blocks; filling in buffer_heads if already allocated
860  * or getblk() if they are not.  Returns the number of blocks inserted
861  * (0 == error.)
862  */
isofs_get_blocks(struct inode * inode,long iblock,struct buffer_head ** bh_result,unsigned long nblocks)863 int isofs_get_blocks(struct inode *inode, long iblock,
864 		     struct buffer_head **bh_result, unsigned long nblocks)
865 {
866 	unsigned long b_off;
867 	unsigned offset, sect_size;
868 	unsigned int firstext;
869 	unsigned long nextino;
870 	int section, rv;
871 
872 	lock_kernel();
873 
874 	rv = 0;
875 	if (iblock < 0) {
876 		printk("isofs_get_blocks: block < 0\n");
877 		goto abort;
878 	}
879 
880 	b_off = iblock;
881 
882 	offset    = 0;
883 	firstext  = inode->u.isofs_i.i_first_extent;
884 	sect_size = inode->u.isofs_i.i_section_size >> ISOFS_BUFFER_BITS(inode);
885 	nextino   = inode->u.isofs_i.i_next_section_ino;
886 	section   = 0;
887 
888 	while ( nblocks ) {
889 		/* If we are *way* beyond the end of the file, print a message.
890 		 * Access beyond the end of the file up to the next page boundary
891 		 * is normal, however because of the way the page cache works.
892 		 * In this case, we just return 0 so that we can properly fill
893 		 * the page with useless information without generating any
894 		 * I/O errors.
895 		 */
896 		if (b_off > ((inode->i_size + PAGE_CACHE_SIZE - 1) >> ISOFS_BUFFER_BITS(inode))) {
897 			printk("isofs_get_blocks: block >= EOF (%ld, %ld)\n",
898 			       iblock, (unsigned long) inode->i_size);
899 			goto abort;
900 		}
901 
902 		if (nextino) {
903 			while (b_off >= (offset + sect_size)) {
904 				struct inode *ninode;
905 
906 				offset += sect_size;
907 				if (nextino == 0)
908 					goto abort;
909 				ninode = iget(inode->i_sb, nextino);
910 				if (!ninode)
911 					goto abort;
912 				firstext  = ninode->u.isofs_i.i_first_extent;
913 				sect_size = ninode->u.isofs_i.i_section_size;
914 				nextino   = ninode->u.isofs_i.i_next_section_ino;
915 				iput(ninode);
916 
917 				if (++section > 100) {
918 					printk("isofs_get_blocks: More than 100 file sections ?!?, aborting...\n");
919 					printk("isofs_get_blocks: ino=%lu block=%ld firstext=%u sect_size=%u nextino=%lu\n",
920 					       inode->i_ino, iblock, firstext, (unsigned) sect_size, nextino);
921 					goto abort;
922 				}
923 			}
924 		}
925 
926 		if ( *bh_result ) {
927 			(*bh_result)->b_dev      = inode->i_dev;
928 			(*bh_result)->b_blocknr  = firstext + b_off - offset;
929 			(*bh_result)->b_state   |= (1UL << BH_Mapped);
930 		} else {
931 			*bh_result = sb_getblk(inode->i_sb, firstext+b_off-offset);
932 			if ( !*bh_result )
933 				goto abort;
934 		}
935 		bh_result++;	/* Next buffer head */
936 		b_off++;	/* Next buffer offset */
937 		nblocks--;
938 		rv++;
939 	}
940 
941 
942 abort:
943 	unlock_kernel();
944 	return rv;
945 }
946 
947 /*
948  * Used by the standard interfaces.
949  */
isofs_get_block(struct inode * inode,long iblock,struct buffer_head * bh_result,int create)950 static int isofs_get_block(struct inode *inode, long iblock,
951 		    struct buffer_head *bh_result, int create)
952 {
953 	if ( create ) {
954 		printk("isofs_get_block: Kernel tries to allocate a block\n");
955 		return -EROFS;
956 	}
957 
958 	return isofs_get_blocks(inode, iblock, &bh_result, 1) ? 0 : -EIO;
959 }
960 
isofs_bmap(struct inode * inode,int block)961 static int isofs_bmap(struct inode *inode, int block)
962 {
963 	struct buffer_head dummy;
964 	int error;
965 
966 	dummy.b_state = 0;
967 	dummy.b_blocknr = -1000;
968 	error = isofs_get_block(inode, block, &dummy, 0);
969 	if (!error)
970 		return dummy.b_blocknr;
971 	return 0;
972 }
973 
isofs_bread(struct inode * inode,unsigned int block)974 struct buffer_head *isofs_bread(struct inode *inode, unsigned int block)
975 {
976 	unsigned int blknr = isofs_bmap(inode, block);
977 	if (!blknr)
978 		return NULL;
979 	return sb_bread(inode->i_sb, blknr);
980 }
981 
isofs_readpage(struct file * file,struct page * page)982 static int isofs_readpage(struct file *file, struct page *page)
983 {
984 	return block_read_full_page(page,isofs_get_block);
985 }
986 
_isofs_bmap(struct address_space * mapping,long block)987 static int _isofs_bmap(struct address_space *mapping, long block)
988 {
989 	return generic_block_bmap(mapping,block,isofs_get_block);
990 }
991 
992 static struct address_space_operations isofs_aops = {
993 	readpage: isofs_readpage,
994 	sync_page: block_sync_page,
995 	bmap: _isofs_bmap
996 };
997 
test_and_set_uid(uid_t * p,uid_t value)998 static inline void test_and_set_uid(uid_t *p, uid_t value)
999 {
1000 	if(value) {
1001 		*p = value;
1002 	}
1003 }
1004 
test_and_set_gid(gid_t * p,gid_t value)1005 static inline void test_and_set_gid(gid_t *p, gid_t value)
1006 {
1007         if(value) {
1008                 *p = value;
1009         }
1010 }
1011 
isofs_read_level3_size(struct inode * inode)1012 static int isofs_read_level3_size(struct inode * inode)
1013 {
1014 	unsigned long f_pos = inode->i_ino;
1015 	unsigned long bufsize = ISOFS_BUFFER_SIZE(inode);
1016 	int high_sierra = inode->i_sb->u.isofs_sb.s_high_sierra;
1017 	struct buffer_head * bh = NULL;
1018 	unsigned long block, offset;
1019 	int i = 0;
1020 	int more_entries = 0;
1021 	struct iso_directory_record * tmpde = NULL;
1022 
1023 	inode->i_size = 0;
1024 	inode->u.isofs_i.i_next_section_ino = 0;
1025 
1026 	block = f_pos >> ISOFS_BUFFER_BITS(inode);
1027 	offset = f_pos & (bufsize-1);
1028 
1029 	do {
1030 		struct iso_directory_record * de;
1031 		unsigned int de_len;
1032 
1033 		if (!bh) {
1034 			bh = sb_bread(inode->i_sb, block);
1035 			if (!bh)
1036 				goto out_noread;
1037 		}
1038 		de = (struct iso_directory_record *) (bh->b_data + offset);
1039 		de_len = *(unsigned char *) de;
1040 
1041 		if (de_len == 0) {
1042 			brelse(bh);
1043 			bh = NULL;
1044 			f_pos = (f_pos + ISOFS_BLOCK_SIZE) & ~(ISOFS_BLOCK_SIZE - 1);
1045 			block = f_pos >> ISOFS_BUFFER_BITS(inode);
1046 			offset = 0;
1047 			continue;
1048 		}
1049 
1050 		offset += de_len;
1051 
1052 		/* Make sure we have a full directory entry */
1053 		if (offset >= bufsize) {
1054 			int slop = bufsize - offset + de_len;
1055 			if (!tmpde) {
1056 				tmpde = kmalloc(256, GFP_KERNEL);
1057 				if (!tmpde)
1058 					goto out_nomem;
1059 			}
1060 			memcpy(tmpde, de, slop);
1061 			offset &= bufsize - 1;
1062 			block++;
1063 			brelse(bh);
1064 			bh = NULL;
1065 			if (offset) {
1066 				bh = sb_bread(inode->i_sb, block);
1067 				if (!bh)
1068 					goto out_noread;
1069 				memcpy((void *) tmpde + slop, bh->b_data, offset);
1070 			}
1071 			de = tmpde;
1072 		}
1073 
1074 		inode->i_size += isonum_733(de->size);
1075 		if (i == 1)
1076 			inode->u.isofs_i.i_next_section_ino = f_pos;
1077 
1078 		more_entries = de->flags[-high_sierra] & 0x80;
1079 
1080 		f_pos += de_len;
1081 		i++;
1082 		if(i > 100)
1083 			goto out_toomany;
1084 	} while(more_entries);
1085 out:
1086 	if (tmpde)
1087 		kfree(tmpde);
1088 	if (bh)
1089 		brelse(bh);
1090 	return 0;
1091 
1092 out_nomem:
1093 	if (bh)
1094 		brelse(bh);
1095 	return -ENOMEM;
1096 
1097 out_noread:
1098 	printk(KERN_INFO "ISOFS: unable to read i-node block %lu\n", block);
1099 	if (tmpde)
1100 		kfree(tmpde);
1101 	return -EIO;
1102 
1103 out_toomany:
1104 	printk(KERN_INFO "isofs_read_level3_size: "
1105 		"More than 100 file sections ?!?, aborting...\n"
1106 	  	"isofs_read_level3_size: inode=%lu ino=%lu\n",
1107 		inode->i_ino, f_pos);
1108 	goto out;
1109 }
1110 
isofs_read_inode(struct inode * inode)1111 static void isofs_read_inode(struct inode * inode)
1112 {
1113 	struct super_block *sb = inode->i_sb;
1114 	unsigned long bufsize = ISOFS_BUFFER_SIZE(inode);
1115 	int block = inode->i_ino >> ISOFS_BUFFER_BITS(inode);
1116 	int high_sierra = sb->u.isofs_sb.s_high_sierra;
1117 	struct buffer_head * bh = NULL;
1118 	struct iso_directory_record * de;
1119 	struct iso_directory_record * tmpde = NULL;
1120 	unsigned int de_len;
1121 	unsigned long offset;
1122 	int volume_seq_no, i;
1123 
1124 	bh = sb_bread(inode->i_sb, block);
1125 	if (!bh)
1126 		goto out_badread;
1127 
1128 	offset = (inode->i_ino & (bufsize - 1));
1129 	de = (struct iso_directory_record *) (bh->b_data + offset);
1130 	de_len = *(unsigned char *) de;
1131 
1132 	if (offset + de_len > bufsize) {
1133 		int frag1 = bufsize - offset;
1134 
1135 		tmpde = kmalloc(de_len, GFP_KERNEL);
1136 		if (tmpde == NULL) {
1137 			printk(KERN_INFO "isofs_read_inode: out of memory\n");
1138 			goto fail;
1139 		}
1140 		memcpy(tmpde, bh->b_data + offset, frag1);
1141 		brelse(bh);
1142 		bh = sb_bread(inode->i_sb, ++block);
1143 		if (!bh)
1144 			goto out_badread;
1145 		memcpy((char *)tmpde+frag1, bh->b_data, de_len - frag1);
1146 		de = tmpde;
1147 	}
1148 
1149 	/* Assume it is a normal-format file unless told otherwise */
1150 	inode->u.isofs_i.i_file_format = isofs_file_normal;
1151 
1152 	if (de->flags[-high_sierra] & 2) {
1153 		inode->i_mode = S_IRUGO | S_IXUGO | S_IFDIR;
1154 		inode->i_nlink = 1; /* Set to 1.  We know there are 2, but
1155 				       the find utility tries to optimize
1156 				       if it is 2, and it screws up.  It is
1157 				       easier to give 1 which tells find to
1158 				       do it the hard way. */
1159 	} else {
1160  		/* Everybody gets to read the file. */
1161 		inode->i_mode = inode->i_sb->u.isofs_sb.s_mode;
1162 		inode->i_nlink = 1;
1163 	        inode->i_mode |= S_IFREG;
1164 		/* If there are no periods in the name,
1165 		 * then set the execute permission bit
1166 		 */
1167 		for(i=0; i< de->name_len[0]; i++)
1168 			if(de->name[i]=='.' || de->name[i]==';')
1169 				break;
1170 		if(i == de->name_len[0] || de->name[i] == ';')
1171 			inode->i_mode |= S_IXUGO; /* execute permission */
1172 	}
1173 	inode->i_uid = inode->i_sb->u.isofs_sb.s_uid;
1174 	inode->i_gid = inode->i_sb->u.isofs_sb.s_gid;
1175 	inode->i_blocks = inode->i_blksize = 0;
1176 
1177 
1178 	inode->u.isofs_i.i_section_size = isonum_733 (de->size);
1179 	if(de->flags[-high_sierra] & 0x80) {
1180 		if(isofs_read_level3_size(inode)) goto fail;
1181 	} else {
1182 		inode->i_size = isonum_733 (de->size);
1183 	}
1184 
1185 	/*
1186 	 * Some dipshit decided to store some other bit of information
1187 	 * in the high byte of the file length.  Truncate in case
1188 	 * this CDROM was mounted with the cruft option.
1189 	 */
1190 
1191 	if (inode->i_sb->u.isofs_sb.s_cruft == 'y')
1192 		inode->i_size &= 0x00ffffff;
1193 
1194 	if (de->interleave[0]) {
1195 		printk("Interleaved files not (yet) supported.\n");
1196 		inode->i_size = 0;
1197 	}
1198 
1199 	/* I have no idea what file_unit_size is used for, so
1200 	   we will flag it for now */
1201 	if (de->file_unit_size[0] != 0) {
1202 		printk("File unit size != 0 for ISO file (%ld).\n",
1203 		       inode->i_ino);
1204 	}
1205 
1206 	/* I have no idea what other flag bits are used for, so
1207 	   we will flag it for now */
1208 #ifdef DEBUG
1209 	if((de->flags[-high_sierra] & ~2)!= 0){
1210 		printk("Unusual flag settings for ISO file (%ld %x).\n",
1211 		       inode->i_ino, de->flags[-high_sierra]);
1212 	}
1213 #endif
1214 
1215 	inode->i_mtime = inode->i_atime = inode->i_ctime =
1216 		iso_date(de->date, high_sierra);
1217 
1218 	inode->u.isofs_i.i_first_extent = (isonum_733 (de->extent) +
1219 					   isonum_711 (de->ext_attr_length));
1220 
1221 	/* Set the number of blocks for stat() - should be done before RR */
1222 	inode->i_blksize = PAGE_CACHE_SIZE; /* For stat() only */
1223 	inode->i_blocks  = (inode->i_size + 511) >> 9;
1224 
1225 	/*
1226 	 * Now test for possible Rock Ridge extensions which will override
1227 	 * some of these numbers in the inode structure.
1228 	 */
1229 
1230 	if (!high_sierra) {
1231 		parse_rock_ridge_inode(de, inode);
1232 		/* if we want uid/gid set, override the rock ridge setting */
1233 		test_and_set_uid(&inode->i_uid, inode->i_sb->u.isofs_sb.s_uid);
1234 		test_and_set_gid(&inode->i_gid, inode->i_sb->u.isofs_sb.s_gid);
1235 	}
1236 
1237 	/* get the volume sequence number */
1238 	volume_seq_no = isonum_723 (de->volume_sequence_number) ;
1239 
1240 	/* Install the inode operations vector */
1241 	if (S_ISREG(inode->i_mode)) {
1242 		inode->i_fop = &generic_ro_fops;
1243 		switch ( inode->u.isofs_i.i_file_format ) {
1244 #ifdef CONFIG_ZISOFS
1245 		case isofs_file_compressed:
1246 			inode->i_data.a_ops = &zisofs_aops;
1247 			break;
1248 #endif
1249 		default:
1250 			inode->i_data.a_ops = &isofs_aops;
1251 			break;
1252 		}
1253 	} else if (S_ISDIR(inode->i_mode)) {
1254 		inode->i_op = &isofs_dir_inode_operations;
1255 		inode->i_fop = &isofs_dir_operations;
1256 	} else if (S_ISLNK(inode->i_mode)) {
1257 		inode->i_op = &page_symlink_inode_operations;
1258 		inode->i_data.a_ops = &isofs_symlink_aops;
1259 	} else
1260 		/* XXX - parse_rock_ridge_inode() had already set i_rdev. */
1261 		init_special_inode(inode, inode->i_mode,
1262 				   kdev_t_to_nr(inode->i_rdev));
1263  out:
1264 	if (tmpde)
1265 		kfree(tmpde);
1266 	if (bh)
1267 		brelse(bh);
1268 	return;
1269 
1270  out_badread:
1271 	printk(KERN_WARNING "ISOFS: unable to read i-node block\n");
1272  fail:
1273 	make_bad_inode(inode);
1274 	goto out;
1275 }
1276 
1277 #ifdef LEAK_CHECK
1278 #undef malloc
1279 #undef free_s
1280 #undef sb_bread
1281 #undef brelse
1282 
leak_check_malloc(unsigned int size)1283 void * leak_check_malloc(unsigned int size){
1284   void * tmp;
1285   check_malloc++;
1286   tmp = kmalloc(size, GFP_KERNEL);
1287   return tmp;
1288 }
1289 
leak_check_free_s(void * obj,int size)1290 void leak_check_free_s(void * obj, int size){
1291   check_malloc--;
1292   return kfree(obj);
1293 }
1294 
leak_check_bread(struct super_block * sb,int block)1295 struct buffer_head * leak_check_bread(struct super_block *sb, int block){
1296   check_bread++;
1297   return sb_bread(sb, block);
1298 }
1299 
leak_check_brelse(struct buffer_head * bh)1300 void leak_check_brelse(struct buffer_head * bh){
1301   check_bread--;
1302   return brelse(bh);
1303 }
1304 
1305 #endif
1306 
1307 static DECLARE_FSTYPE_DEV(iso9660_fs_type, "iso9660", isofs_read_super);
1308 
init_iso9660_fs(void)1309 static int __init init_iso9660_fs(void)
1310 {
1311 #ifdef CONFIG_ZISOFS
1312 	int err;
1313 
1314 	err = zisofs_init();
1315 	if ( err )
1316 		return err;
1317 #endif
1318         return register_filesystem(&iso9660_fs_type);
1319 }
1320 
exit_iso9660_fs(void)1321 static void __exit exit_iso9660_fs(void)
1322 {
1323         unregister_filesystem(&iso9660_fs_type);
1324 #ifdef CONFIG_ZISOFS
1325 	zisofs_cleanup();
1326 #endif
1327 }
1328 
1329 EXPORT_NO_SYMBOLS;
1330 
1331 module_init(init_iso9660_fs)
1332 module_exit(exit_iso9660_fs)
1333 MODULE_LICENSE("GPL");
1334 
1335