2 * linux/fs/isofs/inode.c
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
14 #include <linux/init.h>
15 #include <linux/module.h>
17 #include <linux/slab.h>
18 #include <linux/nls.h>
19 #include <linux/ctype.h>
20 #include <linux/smp_lock.h>
21 #include <linux/statfs.h>
22 #include <linux/cdrom.h>
23 #include <linux/parser.h>
30 static int isofs_hashi(struct dentry *parent, struct qstr *qstr);
31 static int isofs_hash(struct dentry *parent, struct qstr *qstr);
32 static int isofs_dentry_cmpi(struct dentry *dentry, struct qstr *a, struct qstr *b);
33 static int isofs_dentry_cmp(struct dentry *dentry, struct qstr *a, struct qstr *b);
36 static int isofs_hashi_ms(struct dentry *parent, struct qstr *qstr);
37 static int isofs_hash_ms(struct dentry *parent, struct qstr *qstr);
38 static int isofs_dentry_cmpi_ms(struct dentry *dentry, struct qstr *a, struct qstr *b);
39 static int isofs_dentry_cmp_ms(struct dentry *dentry, struct qstr *a, struct qstr *b);
42 static void isofs_put_super(struct super_block *sb)
44 struct isofs_sb_info *sbi = ISOFS_SB(sb);
46 if (sbi->s_nls_iocharset) {
47 unload_nls(sbi->s_nls_iocharset);
48 sbi->s_nls_iocharset = NULL;
57 static void isofs_read_inode(struct inode *);
58 static int isofs_statfs (struct dentry *, struct kstatfs *);
60 static struct kmem_cache *isofs_inode_cachep;
62 static struct inode *isofs_alloc_inode(struct super_block *sb)
64 struct iso_inode_info *ei;
65 ei = kmem_cache_alloc(isofs_inode_cachep, GFP_KERNEL);
68 return &ei->vfs_inode;
71 static void isofs_destroy_inode(struct inode *inode)
73 kmem_cache_free(isofs_inode_cachep, ISOFS_I(inode));
76 static void init_once(void *foo, struct kmem_cache * cachep, unsigned long flags)
78 struct iso_inode_info *ei = foo;
80 inode_init_once(&ei->vfs_inode);
83 static int init_inodecache(void)
85 isofs_inode_cachep = kmem_cache_create("isofs_inode_cache",
86 sizeof(struct iso_inode_info),
87 0, (SLAB_RECLAIM_ACCOUNT|
90 if (isofs_inode_cachep == NULL)
95 static void destroy_inodecache(void)
97 kmem_cache_destroy(isofs_inode_cachep);
100 static int isofs_remount(struct super_block *sb, int *flags, char *data)
102 /* we probably want a lot more here */
107 static const struct super_operations isofs_sops = {
108 .alloc_inode = isofs_alloc_inode,
109 .destroy_inode = isofs_destroy_inode,
110 .read_inode = isofs_read_inode,
111 .put_super = isofs_put_super,
112 .statfs = isofs_statfs,
113 .remount_fs = isofs_remount,
117 static struct dentry_operations isofs_dentry_ops[] = {
119 .d_hash = isofs_hash,
120 .d_compare = isofs_dentry_cmp,
123 .d_hash = isofs_hashi,
124 .d_compare = isofs_dentry_cmpi,
128 .d_hash = isofs_hash_ms,
129 .d_compare = isofs_dentry_cmp_ms,
132 .d_hash = isofs_hashi_ms,
133 .d_compare = isofs_dentry_cmpi_ms,
138 struct iso9660_options{
147 unsigned int blocksize;
159 * Compute the hash for the isofs name corresponding to the dentry.
162 isofs_hash_common(struct dentry *dentry, struct qstr *qstr, int ms)
170 while (len && name[len-1] == '.')
174 qstr->hash = full_name_hash(name, len);
180 * Compute the hash for the isofs name corresponding to the dentry.
183 isofs_hashi_common(struct dentry *dentry, struct qstr *qstr, int ms)
193 while (len && name[len-1] == '.')
197 hash = init_name_hash();
199 c = tolower(*name++);
200 hash = partial_name_hash(tolower(c), hash);
202 qstr->hash = end_name_hash(hash);
208 * Case insensitive compare of two isofs names.
210 static int isofs_dentry_cmpi_common(struct dentry *dentry, struct qstr *a,
211 struct qstr *b, int ms)
215 /* A filename cannot end in '.' or we treat it like it has none */
219 while (alen && a->name[alen-1] == '.')
221 while (blen && b->name[blen-1] == '.')
225 if (strnicmp(a->name, b->name, alen) == 0)
232 * Case sensitive compare of two isofs names.
234 static int isofs_dentry_cmp_common(struct dentry *dentry, struct qstr *a,
235 struct qstr *b, int ms)
239 /* A filename cannot end in '.' or we treat it like it has none */
243 while (alen && a->name[alen-1] == '.')
245 while (blen && b->name[blen-1] == '.')
249 if (strncmp(a->name, b->name, alen) == 0)
256 isofs_hash(struct dentry *dentry, struct qstr *qstr)
258 return isofs_hash_common(dentry, qstr, 0);
262 isofs_hashi(struct dentry *dentry, struct qstr *qstr)
264 return isofs_hashi_common(dentry, qstr, 0);
268 isofs_dentry_cmp(struct dentry *dentry,struct qstr *a,struct qstr *b)
270 return isofs_dentry_cmp_common(dentry, a, b, 0);
274 isofs_dentry_cmpi(struct dentry *dentry,struct qstr *a,struct qstr *b)
276 return isofs_dentry_cmpi_common(dentry, a, b, 0);
281 isofs_hash_ms(struct dentry *dentry, struct qstr *qstr)
283 return isofs_hash_common(dentry, qstr, 1);
287 isofs_hashi_ms(struct dentry *dentry, struct qstr *qstr)
289 return isofs_hashi_common(dentry, qstr, 1);
293 isofs_dentry_cmp_ms(struct dentry *dentry,struct qstr *a,struct qstr *b)
295 return isofs_dentry_cmp_common(dentry, a, b, 1);
299 isofs_dentry_cmpi_ms(struct dentry *dentry,struct qstr *a,struct qstr *b)
301 return isofs_dentry_cmpi_common(dentry, a, b, 1);
306 Opt_block, Opt_check_r, Opt_check_s, Opt_cruft, Opt_gid, Opt_ignore,
307 Opt_iocharset, Opt_map_a, Opt_map_n, Opt_map_o, Opt_mode, Opt_nojoliet,
308 Opt_norock, Opt_sb, Opt_session, Opt_uid, Opt_unhide, Opt_utf8, Opt_err,
309 Opt_nocompress, Opt_hide, Opt_showassoc,
312 static match_table_t tokens = {
313 {Opt_norock, "norock"},
314 {Opt_nojoliet, "nojoliet"},
315 {Opt_unhide, "unhide"},
317 {Opt_showassoc, "showassoc"},
318 {Opt_cruft, "cruft"},
320 {Opt_iocharset, "iocharset=%s"},
321 {Opt_map_a, "map=acorn"},
322 {Opt_map_a, "map=a"},
323 {Opt_map_n, "map=normal"},
324 {Opt_map_n, "map=n"},
325 {Opt_map_o, "map=off"},
326 {Opt_map_o, "map=o"},
327 {Opt_session, "session=%u"},
328 {Opt_sb, "sbsector=%u"},
329 {Opt_check_r, "check=relaxed"},
330 {Opt_check_r, "check=r"},
331 {Opt_check_s, "check=strict"},
332 {Opt_check_s, "check=s"},
335 {Opt_mode, "mode=%u"},
336 {Opt_block, "block=%u"},
337 {Opt_ignore, "conv=binary"},
338 {Opt_ignore, "conv=b"},
339 {Opt_ignore, "conv=text"},
340 {Opt_ignore, "conv=t"},
341 {Opt_ignore, "conv=mtext"},
342 {Opt_ignore, "conv=m"},
343 {Opt_ignore, "conv=auto"},
344 {Opt_ignore, "conv=a"},
345 {Opt_nocompress, "nocompress"},
349 static int parse_options(char *options, struct iso9660_options *popt)
359 popt->showassoc = 'n';
360 popt->check = 'u'; /* unset */
361 popt->nocompress = 0;
362 popt->blocksize = 1024;
363 popt->mode = S_IRUGO | S_IXUGO; /* r-x for all. The disc could
364 be shared with DOS machines so
365 virtually anything could be
366 a valid executable. */
369 popt->iocharset = NULL;
376 while ((p = strsep(&options, ",")) != NULL) {
378 substring_t args[MAX_OPT_ARGS];
384 token = match_token(p, tokens, args);
397 popt->showassoc = 'y';
407 popt->iocharset = match_strdup(&args[0]);
420 if (match_int(&args[0], &option))
425 popt->session = n + 1;
428 if (match_int(&args[0], &option))
430 popt->sbsector = option;
441 if (match_int(&args[0], &option))
446 if (match_int(&args[0], &option))
451 if (match_int(&args[0], &option))
456 if (match_int(&args[0], &option))
459 if (n != 512 && n != 1024 && n != 2048)
464 popt->nocompress = 1;
474 * look if the driver can tell the multi session redirection value
476 * don't change this if you don't know what you do, please!
477 * Multisession is legal only with XA disks.
478 * A non-XA disk with more than one volume descriptor may do it right, but
479 * usually is written in a nowhere standardized "multi-partition" manner.
480 * Multisession uses absolute addressing (solely the first frame of the whole
481 * track is #0), multi-partition uses relative addressing (each first frame of
482 * each track is #0), and a track is not a session.
484 * A broken CDwriter software or drive firmware does not set new standards,
485 * at least not if conflicting with the existing ones.
489 #define WE_OBEY_THE_WRITTEN_STANDARDS 1
491 static unsigned int isofs_get_last_session(struct super_block *sb, s32 session)
493 struct cdrom_multisession ms_info;
494 unsigned int vol_desc_start;
495 struct block_device *bdev = sb->s_bdev;
499 ms_info.addr_format=CDROM_LBA;
500 if(session >= 0 && session <= 99) {
501 struct cdrom_tocentry Te;
502 Te.cdte_track=session;
503 Te.cdte_format=CDROM_LBA;
504 i = ioctl_by_bdev(bdev, CDROMREADTOCENTRY, (unsigned long) &Te);
506 printk(KERN_DEBUG "Session %d start %d type %d\n",
507 session, Te.cdte_addr.lba,
508 Te.cdte_ctrl&CDROM_DATA_TRACK);
509 if ((Te.cdte_ctrl&CDROM_DATA_TRACK) == 4)
510 return Te.cdte_addr.lba;
513 printk(KERN_ERR "Invalid session number or type of track\n");
515 i = ioctl_by_bdev(bdev, CDROMMULTISESSION, (unsigned long) &ms_info);
517 printk(KERN_ERR "Invalid session number\n");
519 printk("isofs.inode: CDROMMULTISESSION: rc=%d\n",i);
521 printk("isofs.inode: XA disk: %s\n",ms_info.xa_flag?"yes":"no");
522 printk("isofs.inode: vol_desc_start = %d\n", ms_info.addr.lba);
526 #if WE_OBEY_THE_WRITTEN_STANDARDS
527 if (ms_info.xa_flag) /* necessary for a valid ms_info.addr */
529 vol_desc_start=ms_info.addr.lba;
530 return vol_desc_start;
534 * Initialize the superblock and read the root inode.
536 * Note: a check_disk_change() has been done immediately prior
537 * to this call, so we don't need to check again.
539 static int isofs_fill_super(struct super_block *s, void *data, int silent)
541 struct buffer_head * bh = NULL, *pri_bh = NULL;
542 struct hs_primary_descriptor * h_pri = NULL;
543 struct iso_primary_descriptor * pri = NULL;
544 struct iso_supplementary_descriptor *sec = NULL;
545 struct iso_directory_record * rootp;
546 int joliet_level = 0;
547 int iso_blknum, block;
550 unsigned int vol_desc_start;
551 unsigned long first_data_zone;
552 struct inode * inode;
553 struct iso9660_options opt;
554 struct isofs_sb_info * sbi;
556 sbi = kzalloc(sizeof(*sbi), GFP_KERNEL);
561 if (!parse_options((char *)data, &opt))
565 * First of all, get the hardware blocksize for this device.
566 * If we don't know what it is, or the hardware blocksize is
567 * larger than the blocksize the user specified, then use
571 * What if bugger tells us to go beyond page size?
573 opt.blocksize = sb_min_blocksize(s, opt.blocksize);
575 sbi->s_high_sierra = 0; /* default is iso9660 */
577 vol_desc_start = (opt.sbsector != -1) ?
578 opt.sbsector : isofs_get_last_session(s,opt.session);
580 for (iso_blknum = vol_desc_start+16;
581 iso_blknum < vol_desc_start+100; iso_blknum++)
583 struct hs_volume_descriptor * hdp;
584 struct iso_volume_descriptor * vdp;
586 block = iso_blknum << (ISOFS_BLOCK_BITS - s->s_blocksize_bits);
587 if (!(bh = sb_bread(s, block)))
590 vdp = (struct iso_volume_descriptor *)bh->b_data;
591 hdp = (struct hs_volume_descriptor *)bh->b_data;
593 /* Due to the overlapping physical location of the descriptors,
594 * ISO CDs can match hdp->id==HS_STANDARD_ID as well. To ensure
595 * proper identification in this case, we first check for ISO.
597 if (strncmp (vdp->id, ISO_STANDARD_ID, sizeof vdp->id) == 0) {
598 if (isonum_711 (vdp->type) == ISO_VD_END)
600 if (isonum_711 (vdp->type) == ISO_VD_PRIMARY) {
602 pri = (struct iso_primary_descriptor *)vdp;
603 /* Save the buffer in case we need it ... */
609 else if (isonum_711 (vdp->type) == ISO_VD_SUPPLEMENTARY) {
610 sec = (struct iso_supplementary_descriptor *)vdp;
611 if (sec->escape[0] == 0x25 && sec->escape[1] == 0x2f) {
612 if (opt.joliet == 'y') {
613 if (sec->escape[2] == 0x40) {
615 } else if (sec->escape[2] == 0x43) {
617 } else if (sec->escape[2] == 0x45) {
620 printk(KERN_DEBUG"ISO 9660 Extensions: Microsoft Joliet Level %d\n",
625 /* Unknown supplementary volume descriptor */
631 if (strncmp (hdp->id, HS_STANDARD_ID, sizeof hdp->id) == 0) {
632 if (isonum_711 (hdp->type) != ISO_VD_PRIMARY)
635 sbi->s_high_sierra = 1;
637 h_pri = (struct hs_primary_descriptor *)vdp;
642 /* Just skip any volume descriptors we don't recognize */
648 * If we fall through, either no volume descriptor was found,
649 * or else we passed a primary descriptor looking for others.
652 goto out_unknown_format;
659 if (joliet_level && (pri == NULL || opt.rock == 'n')) {
660 /* This is the case of Joliet with the norock mount flag.
661 * A disc with both Joliet and Rock Ridge is handled later
663 pri = (struct iso_primary_descriptor *) sec;
666 if(sbi->s_high_sierra){
667 rootp = (struct iso_directory_record *) h_pri->root_directory_record;
668 sbi->s_nzones = isonum_733 (h_pri->volume_space_size);
669 sbi->s_log_zone_size = isonum_723 (h_pri->logical_block_size);
670 sbi->s_max_size = isonum_733(h_pri->volume_space_size);
674 rootp = (struct iso_directory_record *) pri->root_directory_record;
675 sbi->s_nzones = isonum_733 (pri->volume_space_size);
676 sbi->s_log_zone_size = isonum_723 (pri->logical_block_size);
677 sbi->s_max_size = isonum_733(pri->volume_space_size);
680 sbi->s_ninodes = 0; /* No way to figure this out easily */
682 orig_zonesize = sbi->s_log_zone_size;
684 * If the zone size is smaller than the hardware sector size,
685 * this is a fatal error. This would occur if the disc drive
686 * had sectors that were 2048 bytes, but the filesystem had
687 * blocks that were 512 bytes (which should only very rarely
690 if(orig_zonesize < opt.blocksize)
693 /* RDE: convert log zone size to bit shift */
694 switch (sbi->s_log_zone_size)
695 { case 512: sbi->s_log_zone_size = 9; break;
696 case 1024: sbi->s_log_zone_size = 10; break;
697 case 2048: sbi->s_log_zone_size = 11; break;
700 goto out_bad_zone_size;
703 s->s_magic = ISOFS_SUPER_MAGIC;
704 s->s_maxbytes = 0xffffffff; /* We can handle files up to 4 GB */
706 /* The CDROM is read-only, has no nodes (devices) on it, and since
707 all of the files appear to be owned by root, we really do not want
708 to allow suid. (suid or devices will not show up unless we have
709 Rock Ridge extensions) */
711 s->s_flags |= MS_RDONLY /* | MS_NODEV | MS_NOSUID */;
713 /* Set this for reference. Its not currently used except on write
714 which we don't have .. */
716 first_data_zone = isonum_733 (rootp->extent) +
717 isonum_711 (rootp->ext_attr_length);
718 sbi->s_firstdatazone = first_data_zone;
720 printk(KERN_DEBUG "Max size:%ld Log zone size:%ld\n",
722 1UL << sbi->s_log_zone_size);
723 printk(KERN_DEBUG "First datazone:%ld\n", sbi->s_firstdatazone);
724 if(sbi->s_high_sierra)
725 printk(KERN_DEBUG "Disc in High Sierra format.\n");
729 * If the Joliet level is set, we _may_ decide to use the
730 * secondary descriptor, but can't be sure until after we
731 * read the root inode. But before reading the root inode
732 * we may need to change the device blocksize, and would
733 * rather release the old buffer first. So, we cache the
734 * first_data_zone value from the secondary descriptor.
737 pri = (struct iso_primary_descriptor *) sec;
738 rootp = (struct iso_directory_record *)
739 pri->root_directory_record;
740 first_data_zone = isonum_733 (rootp->extent) +
741 isonum_711 (rootp->ext_attr_length);
745 * We're all done using the volume descriptor, and may need
746 * to change the device blocksize, so release the buffer now.
752 * Force the blocksize to 512 for 512 byte sectors. The file
753 * read primitives really get it wrong in a bad way if we don't
756 * Note - we should never be setting the blocksize to something
757 * less than the hardware sector size for the device. If we
758 * do, we would end up having to read larger buffers and split
759 * out portions to satisfy requests.
761 * Note2- the idea here is that we want to deal with the optimal
762 * zonesize in the filesystem. If we have it set to something less,
763 * then we have horrible problems with trying to piece together
764 * bits of adjacent blocks in order to properly read directory
765 * entries. By forcing the blocksize in this way, we ensure
766 * that we will never be required to do this.
768 sb_set_blocksize(s, orig_zonesize);
770 sbi->s_nls_iocharset = NULL;
773 if (joliet_level && opt.utf8 == 0) {
774 char * p = opt.iocharset ? opt.iocharset : CONFIG_NLS_DEFAULT;
775 sbi->s_nls_iocharset = load_nls(p);
776 if (! sbi->s_nls_iocharset) {
777 /* Fail only if explicit charset specified */
780 sbi->s_nls_iocharset = load_nls_default();
784 s->s_op = &isofs_sops;
785 s->s_export_op = &isofs_export_ops;
786 sbi->s_mapping = opt.map;
787 sbi->s_rock = (opt.rock == 'y' ? 2 : 0);
788 sbi->s_rock_offset = -1; /* initial offset, will guess until SP is found*/
789 sbi->s_cruft = opt.cruft;
790 sbi->s_hide = opt.hide;
791 sbi->s_showassoc = opt.showassoc;
792 sbi->s_uid = opt.uid;
793 sbi->s_gid = opt.gid;
794 sbi->s_utf8 = opt.utf8;
795 sbi->s_nocompress = opt.nocompress;
797 * It would be incredibly stupid to allow people to mark every file
798 * on the disk as suid, so we merely allow them to set the default
801 sbi->s_mode = opt.mode & 0777;
804 * Read the root inode, which _may_ result in changing
805 * the s_rock flag. Once we have the final s_rock value,
806 * we then decide whether to use the Joliet descriptor.
808 inode = isofs_iget(s, sbi->s_firstdatazone, 0);
811 * If this disk has both Rock Ridge and Joliet on it, then we
812 * want to use Rock Ridge by default. This can be overridden
813 * by using the norock mount option. There is still one other
814 * possibility that is not taken into account: a Rock Ridge
815 * CD with Unicode names. Until someone sees such a beast, it
816 * will not be supported.
818 if (sbi->s_rock == 1) {
820 } else if (joliet_level) {
822 if (sbi->s_firstdatazone != first_data_zone) {
823 sbi->s_firstdatazone = first_data_zone;
825 "ISOFS: changing to secondary root\n");
827 inode = isofs_iget(s, sbi->s_firstdatazone, 0);
831 if (opt.check == 'u') {
832 /* Only Joliet is case insensitive by default */
833 if (joliet_level) opt.check = 'r';
834 else opt.check = 's';
836 sbi->s_joliet_level = joliet_level;
838 /* check the root inode */
843 /* get the root dentry */
844 s->s_root = d_alloc_root(inode);
849 if (joliet_level) table += 2;
850 if (opt.check == 'r') table++;
851 s->s_root->d_op = &isofs_dentry_ops[table];
853 kfree(opt.iocharset);
858 * Display error messages and free resources.
861 printk(KERN_WARNING "isofs_fill_super: root inode not initialized\n");
864 printk(KERN_WARNING "isofs_fill_super: get root inode failed\n");
868 if (sbi->s_nls_iocharset)
869 unload_nls(sbi->s_nls_iocharset);
873 printk(KERN_WARNING "isofs_fill_super: "
874 "bread failed, dev=%s, iso_blknum=%d, block=%d\n",
875 s->s_id, iso_blknum, block);
878 printk(KERN_WARNING "Bad logical zone size %ld\n",
879 sbi->s_log_zone_size);
882 printk(KERN_WARNING "Logical zone size(%d) < hardware blocksize(%u)\n",
883 orig_zonesize, opt.blocksize);
887 printk(KERN_WARNING "Unable to identify CD-ROM format.\n");
892 kfree(opt.iocharset);
898 static int isofs_statfs (struct dentry *dentry, struct kstatfs *buf)
900 struct super_block *sb = dentry->d_sb;
902 buf->f_type = ISOFS_SUPER_MAGIC;
903 buf->f_bsize = sb->s_blocksize;
904 buf->f_blocks = (ISOFS_SB(sb)->s_nzones
905 << (ISOFS_SB(sb)->s_log_zone_size - sb->s_blocksize_bits));
908 buf->f_files = ISOFS_SB(sb)->s_ninodes;
910 buf->f_namelen = NAME_MAX;
915 * Get a set of blocks; filling in buffer_heads if already allocated
916 * or getblk() if they are not. Returns the number of blocks inserted
919 int isofs_get_blocks(struct inode *inode, sector_t iblock_s,
920 struct buffer_head **bh, unsigned long nblocks)
923 unsigned offset, sect_size;
924 unsigned int firstext;
925 unsigned long nextblk, nextoff;
926 long iblock = (long)iblock_s;
928 struct iso_inode_info *ei = ISOFS_I(inode);
933 if (iblock < 0 || iblock != iblock_s) {
934 printk("isofs_get_blocks: block number too large\n");
941 firstext = ei->i_first_extent;
942 sect_size = ei->i_section_size >> ISOFS_BUFFER_BITS(inode);
943 nextblk = ei->i_next_section_block;
944 nextoff = ei->i_next_section_offset;
948 /* If we are *way* beyond the end of the file, print a message.
949 * Access beyond the end of the file up to the next page boundary
950 * is normal, however because of the way the page cache works.
951 * In this case, we just return 0 so that we can properly fill
952 * the page with useless information without generating any
955 if (b_off > ((inode->i_size + PAGE_CACHE_SIZE - 1) >> ISOFS_BUFFER_BITS(inode))) {
956 printk("isofs_get_blocks: block >= EOF (%ld, %ld)\n",
957 iblock, (unsigned long) inode->i_size);
961 /* On the last section, nextblk == 0, section size is likely to
962 * exceed sect_size by a partial block, and access beyond the
963 * end of the file will reach beyond the section size, too.
965 while (nextblk && (b_off >= (offset + sect_size))) {
966 struct inode *ninode;
969 ninode = isofs_iget(inode->i_sb, nextblk, nextoff);
972 firstext = ISOFS_I(ninode)->i_first_extent;
973 sect_size = ISOFS_I(ninode)->i_section_size >> ISOFS_BUFFER_BITS(ninode);
974 nextblk = ISOFS_I(ninode)->i_next_section_block;
975 nextoff = ISOFS_I(ninode)->i_next_section_offset;
978 if (++section > 100) {
979 printk("isofs_get_blocks: More than 100 file sections ?!?, aborting...\n");
980 printk("isofs_get_blocks: block=%ld firstext=%u sect_size=%u "
981 "nextblk=%lu nextoff=%lu\n",
982 iblock, firstext, (unsigned) sect_size,
989 map_bh(*bh, inode->i_sb, firstext + b_off - offset);
991 *bh = sb_getblk(inode->i_sb, firstext+b_off-offset);
995 bh++; /* Next buffer head */
996 b_off++; /* Next buffer offset */
1007 * Used by the standard interfaces.
1009 static int isofs_get_block(struct inode *inode, sector_t iblock,
1010 struct buffer_head *bh_result, int create)
1013 printk("isofs_get_block: Kernel tries to allocate a block\n");
1017 return isofs_get_blocks(inode, iblock, &bh_result, 1) ? 0 : -EIO;
1020 static int isofs_bmap(struct inode *inode, sector_t block)
1022 struct buffer_head dummy;
1026 dummy.b_blocknr = -1000;
1027 error = isofs_get_block(inode, block, &dummy, 0);
1029 return dummy.b_blocknr;
1033 struct buffer_head *isofs_bread(struct inode *inode, sector_t block)
1035 sector_t blknr = isofs_bmap(inode, block);
1038 return sb_bread(inode->i_sb, blknr);
1041 static int isofs_readpage(struct file *file, struct page *page)
1043 return block_read_full_page(page,isofs_get_block);
1046 static sector_t _isofs_bmap(struct address_space *mapping, sector_t block)
1048 return generic_block_bmap(mapping,block,isofs_get_block);
1051 static const struct address_space_operations isofs_aops = {
1052 .readpage = isofs_readpage,
1053 .sync_page = block_sync_page,
1057 static inline void test_and_set_uid(uid_t *p, uid_t value)
1063 static inline void test_and_set_gid(gid_t *p, gid_t value)
1069 static int isofs_read_level3_size(struct inode *inode)
1071 unsigned long bufsize = ISOFS_BUFFER_SIZE(inode);
1072 int high_sierra = ISOFS_SB(inode->i_sb)->s_high_sierra;
1073 struct buffer_head * bh = NULL;
1074 unsigned long block, offset, block_saved, offset_saved;
1076 int more_entries = 0;
1077 struct iso_directory_record * tmpde = NULL;
1078 struct iso_inode_info *ei = ISOFS_I(inode);
1082 /* The first 16 blocks are reserved as the System Area. Thus,
1083 * no inodes can appear in block 0. We use this to flag that
1084 * this is the last section. */
1085 ei->i_next_section_block = 0;
1086 ei->i_next_section_offset = 0;
1088 block = ei->i_iget5_block;
1089 offset = ei->i_iget5_offset;
1092 struct iso_directory_record * de;
1093 unsigned int de_len;
1096 bh = sb_bread(inode->i_sb, block);
1100 de = (struct iso_directory_record *) (bh->b_data + offset);
1101 de_len = *(unsigned char *) de;
1111 block_saved = block;
1112 offset_saved = offset;
1115 /* Make sure we have a full directory entry */
1116 if (offset >= bufsize) {
1117 int slop = bufsize - offset + de_len;
1119 tmpde = kmalloc(256, GFP_KERNEL);
1123 memcpy(tmpde, de, slop);
1124 offset &= bufsize - 1;
1129 bh = sb_bread(inode->i_sb, block);
1132 memcpy((void *)tmpde+slop, bh->b_data, offset);
1137 inode->i_size += isonum_733(de->size);
1139 ei->i_next_section_block = block_saved;
1140 ei->i_next_section_offset = offset_saved;
1143 more_entries = de->flags[-high_sierra] & 0x80;
1148 } while (more_entries);
1161 printk(KERN_INFO "ISOFS: unable to read i-node block %lu\n", block);
1166 printk(KERN_INFO "isofs_read_level3_size: "
1167 "More than 100 file sections ?!?, aborting...\n"
1168 "isofs_read_level3_size: inode=%lu\n",
1173 static void isofs_read_inode(struct inode *inode)
1175 struct super_block *sb = inode->i_sb;
1176 struct isofs_sb_info *sbi = ISOFS_SB(sb);
1177 unsigned long bufsize = ISOFS_BUFFER_SIZE(inode);
1178 unsigned long block;
1179 int high_sierra = sbi->s_high_sierra;
1180 struct buffer_head * bh = NULL;
1181 struct iso_directory_record * de;
1182 struct iso_directory_record * tmpde = NULL;
1183 unsigned int de_len;
1184 unsigned long offset;
1185 struct iso_inode_info *ei = ISOFS_I(inode);
1187 block = ei->i_iget5_block;
1188 bh = sb_bread(inode->i_sb, block);
1192 offset = ei->i_iget5_offset;
1194 de = (struct iso_directory_record *) (bh->b_data + offset);
1195 de_len = *(unsigned char *) de;
1197 if (offset + de_len > bufsize) {
1198 int frag1 = bufsize - offset;
1200 tmpde = kmalloc(de_len, GFP_KERNEL);
1201 if (tmpde == NULL) {
1202 printk(KERN_INFO "isofs_read_inode: out of memory\n");
1205 memcpy(tmpde, bh->b_data + offset, frag1);
1207 bh = sb_bread(inode->i_sb, ++block);
1210 memcpy((char *)tmpde+frag1, bh->b_data, de_len - frag1);
1214 inode->i_ino = isofs_get_ino(ei->i_iget5_block,
1216 ISOFS_BUFFER_BITS(inode));
1218 /* Assume it is a normal-format file unless told otherwise */
1219 ei->i_file_format = isofs_file_normal;
1221 if (de->flags[-high_sierra] & 2) {
1222 inode->i_mode = S_IRUGO | S_IXUGO | S_IFDIR;
1223 inode->i_nlink = 1; /* Set to 1. We know there are 2, but
1224 the find utility tries to optimize
1225 if it is 2, and it screws up. It is
1226 easier to give 1 which tells find to
1227 do it the hard way. */
1229 /* Everybody gets to read the file. */
1230 inode->i_mode = sbi->s_mode;
1232 inode->i_mode |= S_IFREG;
1234 inode->i_uid = sbi->s_uid;
1235 inode->i_gid = sbi->s_gid;
1236 inode->i_blocks = 0;
1238 ei->i_format_parm[0] = 0;
1239 ei->i_format_parm[1] = 0;
1240 ei->i_format_parm[2] = 0;
1242 ei->i_section_size = isonum_733 (de->size);
1243 if (de->flags[-high_sierra] & 0x80) {
1244 if(isofs_read_level3_size(inode)) goto fail;
1246 ei->i_next_section_block = 0;
1247 ei->i_next_section_offset = 0;
1248 inode->i_size = isonum_733 (de->size);
1252 * Some dipshit decided to store some other bit of information
1253 * in the high byte of the file length. Truncate size in case
1254 * this CDROM was mounted with the cruft option.
1257 if (sbi->s_cruft == 'y')
1258 inode->i_size &= 0x00ffffff;
1260 if (de->interleave[0]) {
1261 printk("Interleaved files not (yet) supported.\n");
1265 /* I have no idea what file_unit_size is used for, so
1266 we will flag it for now */
1267 if (de->file_unit_size[0] != 0) {
1268 printk("File unit size != 0 for ISO file (%ld).\n",
1272 /* I have no idea what other flag bits are used for, so
1273 we will flag it for now */
1275 if((de->flags[-high_sierra] & ~2)!= 0){
1276 printk("Unusual flag settings for ISO file (%ld %x).\n",
1277 inode->i_ino, de->flags[-high_sierra]);
1281 inode->i_mtime.tv_sec =
1282 inode->i_atime.tv_sec =
1283 inode->i_ctime.tv_sec = iso_date(de->date, high_sierra);
1284 inode->i_mtime.tv_nsec =
1285 inode->i_atime.tv_nsec =
1286 inode->i_ctime.tv_nsec = 0;
1288 ei->i_first_extent = (isonum_733 (de->extent) +
1289 isonum_711 (de->ext_attr_length));
1291 /* Set the number of blocks for stat() - should be done before RR */
1292 inode->i_blocks = (inode->i_size + 511) >> 9;
1295 * Now test for possible Rock Ridge extensions which will override
1296 * some of these numbers in the inode structure.
1300 parse_rock_ridge_inode(de, inode);
1301 /* if we want uid/gid set, override the rock ridge setting */
1302 test_and_set_uid(&inode->i_uid, sbi->s_uid);
1303 test_and_set_gid(&inode->i_gid, sbi->s_gid);
1306 /* Install the inode operations vector */
1307 if (S_ISREG(inode->i_mode)) {
1308 inode->i_fop = &generic_ro_fops;
1309 switch ( ei->i_file_format ) {
1310 #ifdef CONFIG_ZISOFS
1311 case isofs_file_compressed:
1312 inode->i_data.a_ops = &zisofs_aops;
1316 inode->i_data.a_ops = &isofs_aops;
1319 } else if (S_ISDIR(inode->i_mode)) {
1320 inode->i_op = &isofs_dir_inode_operations;
1321 inode->i_fop = &isofs_dir_operations;
1322 } else if (S_ISLNK(inode->i_mode)) {
1323 inode->i_op = &page_symlink_inode_operations;
1324 inode->i_data.a_ops = &isofs_symlink_aops;
1326 /* XXX - parse_rock_ridge_inode() had already set i_rdev. */
1327 init_special_inode(inode, inode->i_mode, inode->i_rdev);
1336 printk(KERN_WARNING "ISOFS: unable to read i-node block\n");
1338 make_bad_inode(inode);
1342 struct isofs_iget5_callback_data {
1343 unsigned long block;
1344 unsigned long offset;
1347 static int isofs_iget5_test(struct inode *ino, void *data)
1349 struct iso_inode_info *i = ISOFS_I(ino);
1350 struct isofs_iget5_callback_data *d =
1351 (struct isofs_iget5_callback_data*)data;
1352 return (i->i_iget5_block == d->block)
1353 && (i->i_iget5_offset == d->offset);
1356 static int isofs_iget5_set(struct inode *ino, void *data)
1358 struct iso_inode_info *i = ISOFS_I(ino);
1359 struct isofs_iget5_callback_data *d =
1360 (struct isofs_iget5_callback_data*)data;
1361 i->i_iget5_block = d->block;
1362 i->i_iget5_offset = d->offset;
1366 /* Store, in the inode's containing structure, the block and block
1367 * offset that point to the underlying meta-data for the inode. The
1368 * code below is otherwise similar to the iget() code in
1369 * include/linux/fs.h */
1370 struct inode *isofs_iget(struct super_block *sb,
1371 unsigned long block,
1372 unsigned long offset)
1374 unsigned long hashval;
1375 struct inode *inode;
1376 struct isofs_iget5_callback_data data;
1378 if (offset >= 1ul << sb->s_blocksize_bits)
1382 data.offset = offset;
1384 hashval = (block << sb->s_blocksize_bits) | offset;
1386 inode = iget5_locked(sb, hashval, &isofs_iget5_test,
1387 &isofs_iget5_set, &data);
1389 if (inode && (inode->i_state & I_NEW)) {
1390 sb->s_op->read_inode(inode);
1391 unlock_new_inode(inode);
1397 static int isofs_get_sb(struct file_system_type *fs_type,
1398 int flags, const char *dev_name, void *data, struct vfsmount *mnt)
1400 return get_sb_bdev(fs_type, flags, dev_name, data, isofs_fill_super,
1404 static struct file_system_type iso9660_fs_type = {
1405 .owner = THIS_MODULE,
1407 .get_sb = isofs_get_sb,
1408 .kill_sb = kill_block_super,
1409 .fs_flags = FS_REQUIRES_DEV,
1412 static int __init init_iso9660_fs(void)
1414 int err = init_inodecache();
1417 #ifdef CONFIG_ZISOFS
1418 err = zisofs_init();
1422 err = register_filesystem(&iso9660_fs_type);
1427 #ifdef CONFIG_ZISOFS
1431 destroy_inodecache();
1436 static void __exit exit_iso9660_fs(void)
1438 unregister_filesystem(&iso9660_fs_type);
1439 #ifdef CONFIG_ZISOFS
1442 destroy_inodecache();
1445 module_init(init_iso9660_fs)
1446 module_exit(exit_iso9660_fs)
1447 MODULE_LICENSE("GPL");
1448 /* Actual filesystem name is iso9660, as requested in filesystems.c */
1449 MODULE_ALIAS("iso9660");