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