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