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