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 kmem_cache_t
*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
, SLAB_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
, kmem_cache_t
* cachep
, unsigned long flags
)
78 struct iso_inode_info
*ei
= foo
;
80 if ((flags
& (SLAB_CTOR_VERIFY
|SLAB_CTOR_CONSTRUCTOR
)) ==
81 SLAB_CTOR_CONSTRUCTOR
)
82 inode_init_once(&ei
->vfs_inode
);
85 static int init_inodecache(void)
87 isofs_inode_cachep
= kmem_cache_create("isofs_inode_cache",
88 sizeof(struct iso_inode_info
),
89 0, (SLAB_RECLAIM_ACCOUNT
|
92 if (isofs_inode_cachep
== NULL
)
97 static void destroy_inodecache(void)
99 kmem_cache_destroy(isofs_inode_cachep
);
102 static int isofs_remount(struct super_block
*sb
, int *flags
, char *data
)
104 /* we probably want a lot more here */
109 static struct super_operations isofs_sops
= {
110 .alloc_inode
= isofs_alloc_inode
,
111 .destroy_inode
= isofs_destroy_inode
,
112 .read_inode
= isofs_read_inode
,
113 .put_super
= isofs_put_super
,
114 .statfs
= isofs_statfs
,
115 .remount_fs
= isofs_remount
,
119 static struct dentry_operations isofs_dentry_ops
[] = {
121 .d_hash
= isofs_hash
,
122 .d_compare
= isofs_dentry_cmp
,
125 .d_hash
= isofs_hashi
,
126 .d_compare
= isofs_dentry_cmpi
,
130 .d_hash
= isofs_hash_ms
,
131 .d_compare
= isofs_dentry_cmp_ms
,
134 .d_hash
= isofs_hashi_ms
,
135 .d_compare
= isofs_dentry_cmpi_ms
,
140 struct iso9660_options
{
149 unsigned int blocksize
;
161 * Compute the hash for the isofs name corresponding to the dentry.
164 isofs_hash_common(struct dentry
*dentry
, struct qstr
*qstr
, int ms
)
172 while (len
&& name
[len
-1] == '.')
176 qstr
->hash
= full_name_hash(name
, len
);
182 * Compute the hash for the isofs name corresponding to the dentry.
185 isofs_hashi_common(struct dentry
*dentry
, struct qstr
*qstr
, int ms
)
195 while (len
&& name
[len
-1] == '.')
199 hash
= init_name_hash();
201 c
= tolower(*name
++);
202 hash
= partial_name_hash(tolower(c
), hash
);
204 qstr
->hash
= end_name_hash(hash
);
210 * Case insensitive compare of two isofs names.
212 static int isofs_dentry_cmpi_common(struct dentry
*dentry
, struct qstr
*a
,
213 struct qstr
*b
, int ms
)
217 /* A filename cannot end in '.' or we treat it like it has none */
221 while (alen
&& a
->name
[alen
-1] == '.')
223 while (blen
&& b
->name
[blen
-1] == '.')
227 if (strnicmp(a
->name
, b
->name
, alen
) == 0)
234 * Case sensitive compare of two isofs names.
236 static int isofs_dentry_cmp_common(struct dentry
*dentry
, struct qstr
*a
,
237 struct qstr
*b
, int ms
)
241 /* A filename cannot end in '.' or we treat it like it has none */
245 while (alen
&& a
->name
[alen
-1] == '.')
247 while (blen
&& b
->name
[blen
-1] == '.')
251 if (strncmp(a
->name
, b
->name
, alen
) == 0)
258 isofs_hash(struct dentry
*dentry
, struct qstr
*qstr
)
260 return isofs_hash_common(dentry
, qstr
, 0);
264 isofs_hashi(struct dentry
*dentry
, struct qstr
*qstr
)
266 return isofs_hashi_common(dentry
, qstr
, 0);
270 isofs_dentry_cmp(struct dentry
*dentry
,struct qstr
*a
,struct qstr
*b
)
272 return isofs_dentry_cmp_common(dentry
, a
, b
, 0);
276 isofs_dentry_cmpi(struct dentry
*dentry
,struct qstr
*a
,struct qstr
*b
)
278 return isofs_dentry_cmpi_common(dentry
, a
, b
, 0);
283 isofs_hash_ms(struct dentry
*dentry
, struct qstr
*qstr
)
285 return isofs_hash_common(dentry
, qstr
, 1);
289 isofs_hashi_ms(struct dentry
*dentry
, struct qstr
*qstr
)
291 return isofs_hashi_common(dentry
, qstr
, 1);
295 isofs_dentry_cmp_ms(struct dentry
*dentry
,struct qstr
*a
,struct qstr
*b
)
297 return isofs_dentry_cmp_common(dentry
, a
, b
, 1);
301 isofs_dentry_cmpi_ms(struct dentry
*dentry
,struct qstr
*a
,struct qstr
*b
)
303 return isofs_dentry_cmpi_common(dentry
, a
, b
, 1);
308 Opt_block
, Opt_check_r
, Opt_check_s
, Opt_cruft
, Opt_gid
, Opt_ignore
,
309 Opt_iocharset
, Opt_map_a
, Opt_map_n
, Opt_map_o
, Opt_mode
, Opt_nojoliet
,
310 Opt_norock
, Opt_sb
, Opt_session
, Opt_uid
, Opt_unhide
, Opt_utf8
, Opt_err
,
311 Opt_nocompress
, Opt_hide
, Opt_showassoc
,
314 static match_table_t tokens
= {
315 {Opt_norock
, "norock"},
316 {Opt_nojoliet
, "nojoliet"},
317 {Opt_unhide
, "unhide"},
319 {Opt_showassoc
, "showassoc"},
320 {Opt_cruft
, "cruft"},
322 {Opt_iocharset
, "iocharset=%s"},
323 {Opt_map_a
, "map=acorn"},
324 {Opt_map_a
, "map=a"},
325 {Opt_map_n
, "map=normal"},
326 {Opt_map_n
, "map=n"},
327 {Opt_map_o
, "map=off"},
328 {Opt_map_o
, "map=o"},
329 {Opt_session
, "session=%u"},
330 {Opt_sb
, "sbsector=%u"},
331 {Opt_check_r
, "check=relaxed"},
332 {Opt_check_r
, "check=r"},
333 {Opt_check_s
, "check=strict"},
334 {Opt_check_s
, "check=s"},
337 {Opt_mode
, "mode=%u"},
338 {Opt_block
, "block=%u"},
339 {Opt_ignore
, "conv=binary"},
340 {Opt_ignore
, "conv=b"},
341 {Opt_ignore
, "conv=text"},
342 {Opt_ignore
, "conv=t"},
343 {Opt_ignore
, "conv=mtext"},
344 {Opt_ignore
, "conv=m"},
345 {Opt_ignore
, "conv=auto"},
346 {Opt_ignore
, "conv=a"},
347 {Opt_nocompress
, "nocompress"},
351 static int parse_options(char *options
, struct iso9660_options
*popt
)
361 popt
->showassoc
= 'n';
362 popt
->check
= 'u'; /* unset */
363 popt
->nocompress
= 0;
364 popt
->blocksize
= 1024;
365 popt
->mode
= S_IRUGO
| S_IXUGO
; /* r-x for all. The disc could
366 be shared with DOS machines so
367 virtually anything could be
368 a valid executable. */
371 popt
->iocharset
= NULL
;
378 while ((p
= strsep(&options
, ",")) != NULL
) {
380 substring_t args
[MAX_OPT_ARGS
];
386 token
= match_token(p
, tokens
, args
);
399 popt
->showassoc
= 'y';
409 popt
->iocharset
= match_strdup(&args
[0]);
422 if (match_int(&args
[0], &option
))
427 popt
->session
= n
+ 1;
430 if (match_int(&args
[0], &option
))
432 popt
->sbsector
= option
;
443 if (match_int(&args
[0], &option
))
448 if (match_int(&args
[0], &option
))
453 if (match_int(&args
[0], &option
))
458 if (match_int(&args
[0], &option
))
461 if (n
!= 512 && n
!= 1024 && n
!= 2048)
466 popt
->nocompress
= 1;
476 * look if the driver can tell the multi session redirection value
478 * don't change this if you don't know what you do, please!
479 * Multisession is legal only with XA disks.
480 * A non-XA disk with more than one volume descriptor may do it right, but
481 * usually is written in a nowhere standardized "multi-partition" manner.
482 * Multisession uses absolute addressing (solely the first frame of the whole
483 * track is #0), multi-partition uses relative addressing (each first frame of
484 * each track is #0), and a track is not a session.
486 * A broken CDwriter software or drive firmware does not set new standards,
487 * at least not if conflicting with the existing ones.
491 #define WE_OBEY_THE_WRITTEN_STANDARDS 1
493 static unsigned int isofs_get_last_session(struct super_block
*sb
, s32 session
)
495 struct cdrom_multisession ms_info
;
496 unsigned int vol_desc_start
;
497 struct block_device
*bdev
= sb
->s_bdev
;
501 ms_info
.addr_format
=CDROM_LBA
;
502 if(session
>= 0 && session
<= 99) {
503 struct cdrom_tocentry Te
;
504 Te
.cdte_track
=session
;
505 Te
.cdte_format
=CDROM_LBA
;
506 i
= ioctl_by_bdev(bdev
, CDROMREADTOCENTRY
, (unsigned long) &Te
);
508 printk(KERN_DEBUG
"Session %d start %d type %d\n",
509 session
, Te
.cdte_addr
.lba
,
510 Te
.cdte_ctrl
&CDROM_DATA_TRACK
);
511 if ((Te
.cdte_ctrl
&CDROM_DATA_TRACK
) == 4)
512 return Te
.cdte_addr
.lba
;
515 printk(KERN_ERR
"Invalid session number or type of track\n");
517 i
= ioctl_by_bdev(bdev
, CDROMMULTISESSION
, (unsigned long) &ms_info
);
519 printk(KERN_ERR
"Invalid session number\n");
521 printk("isofs.inode: CDROMMULTISESSION: rc=%d\n",i
);
523 printk("isofs.inode: XA disk: %s\n",ms_info
.xa_flag
?"yes":"no");
524 printk("isofs.inode: vol_desc_start = %d\n", ms_info
.addr
.lba
);
528 #if WE_OBEY_THE_WRITTEN_STANDARDS
529 if (ms_info
.xa_flag
) /* necessary for a valid ms_info.addr */
531 vol_desc_start
=ms_info
.addr
.lba
;
532 return vol_desc_start
;
536 * Initialize the superblock and read the root inode.
538 * Note: a check_disk_change() has been done immediately prior
539 * to this call, so we don't need to check again.
541 static int isofs_fill_super(struct super_block
*s
, void *data
, int silent
)
543 struct buffer_head
* bh
= NULL
, *pri_bh
= NULL
;
544 struct hs_primary_descriptor
* h_pri
= NULL
;
545 struct iso_primary_descriptor
* pri
= NULL
;
546 struct iso_supplementary_descriptor
*sec
= NULL
;
547 struct iso_directory_record
* rootp
;
548 int joliet_level
= 0;
549 int iso_blknum
, block
;
552 unsigned int vol_desc_start
;
553 unsigned long first_data_zone
;
554 struct inode
* inode
;
555 struct iso9660_options opt
;
556 struct isofs_sb_info
* sbi
;
558 sbi
= kzalloc(sizeof(*sbi
), GFP_KERNEL
);
563 if (!parse_options((char *)data
, &opt
))
567 * First of all, get the hardware blocksize for this device.
568 * If we don't know what it is, or the hardware blocksize is
569 * larger than the blocksize the user specified, then use
573 * What if bugger tells us to go beyond page size?
575 opt
.blocksize
= sb_min_blocksize(s
, opt
.blocksize
);
577 sbi
->s_high_sierra
= 0; /* default is iso9660 */
579 vol_desc_start
= (opt
.sbsector
!= -1) ?
580 opt
.sbsector
: isofs_get_last_session(s
,opt
.session
);
582 for (iso_blknum
= vol_desc_start
+16;
583 iso_blknum
< vol_desc_start
+100; iso_blknum
++)
585 struct hs_volume_descriptor
* hdp
;
586 struct iso_volume_descriptor
* vdp
;
588 block
= iso_blknum
<< (ISOFS_BLOCK_BITS
- s
->s_blocksize_bits
);
589 if (!(bh
= sb_bread(s
, block
)))
592 vdp
= (struct iso_volume_descriptor
*)bh
->b_data
;
593 hdp
= (struct hs_volume_descriptor
*)bh
->b_data
;
595 /* Due to the overlapping physical location of the descriptors,
596 * ISO CDs can match hdp->id==HS_STANDARD_ID as well. To ensure
597 * proper identification in this case, we first check for ISO.
599 if (strncmp (vdp
->id
, ISO_STANDARD_ID
, sizeof vdp
->id
) == 0) {
600 if (isonum_711 (vdp
->type
) == ISO_VD_END
)
602 if (isonum_711 (vdp
->type
) == ISO_VD_PRIMARY
) {
604 pri
= (struct iso_primary_descriptor
*)vdp
;
605 /* Save the buffer in case we need it ... */
611 else if (isonum_711 (vdp
->type
) == ISO_VD_SUPPLEMENTARY
) {
612 sec
= (struct iso_supplementary_descriptor
*)vdp
;
613 if (sec
->escape
[0] == 0x25 && sec
->escape
[1] == 0x2f) {
614 if (opt
.joliet
== 'y') {
615 if (sec
->escape
[2] == 0x40) {
617 } else if (sec
->escape
[2] == 0x43) {
619 } else if (sec
->escape
[2] == 0x45) {
622 printk(KERN_DEBUG
"ISO 9660 Extensions: Microsoft Joliet Level %d\n",
627 /* Unknown supplementary volume descriptor */
633 if (strncmp (hdp
->id
, HS_STANDARD_ID
, sizeof hdp
->id
) == 0) {
634 if (isonum_711 (hdp
->type
) != ISO_VD_PRIMARY
)
637 sbi
->s_high_sierra
= 1;
639 h_pri
= (struct hs_primary_descriptor
*)vdp
;
644 /* Just skip any volume descriptors we don't recognize */
650 * If we fall through, either no volume descriptor was found,
651 * or else we passed a primary descriptor looking for others.
654 goto out_unknown_format
;
661 if (joliet_level
&& (pri
== NULL
|| opt
.rock
== 'n')) {
662 /* This is the case of Joliet with the norock mount flag.
663 * A disc with both Joliet and Rock Ridge is handled later
665 pri
= (struct iso_primary_descriptor
*) sec
;
668 if(sbi
->s_high_sierra
){
669 rootp
= (struct iso_directory_record
*) h_pri
->root_directory_record
;
670 sbi
->s_nzones
= isonum_733 (h_pri
->volume_space_size
);
671 sbi
->s_log_zone_size
= isonum_723 (h_pri
->logical_block_size
);
672 sbi
->s_max_size
= isonum_733(h_pri
->volume_space_size
);
676 rootp
= (struct iso_directory_record
*) pri
->root_directory_record
;
677 sbi
->s_nzones
= isonum_733 (pri
->volume_space_size
);
678 sbi
->s_log_zone_size
= isonum_723 (pri
->logical_block_size
);
679 sbi
->s_max_size
= isonum_733(pri
->volume_space_size
);
682 sbi
->s_ninodes
= 0; /* No way to figure this out easily */
684 orig_zonesize
= sbi
->s_log_zone_size
;
686 * If the zone size is smaller than the hardware sector size,
687 * this is a fatal error. This would occur if the disc drive
688 * had sectors that were 2048 bytes, but the filesystem had
689 * blocks that were 512 bytes (which should only very rarely
692 if(orig_zonesize
< opt
.blocksize
)
695 /* RDE: convert log zone size to bit shift */
696 switch (sbi
->s_log_zone_size
)
697 { case 512: sbi
->s_log_zone_size
= 9; break;
698 case 1024: sbi
->s_log_zone_size
= 10; break;
699 case 2048: sbi
->s_log_zone_size
= 11; break;
702 goto out_bad_zone_size
;
705 s
->s_magic
= ISOFS_SUPER_MAGIC
;
706 s
->s_maxbytes
= 0xffffffff; /* We can handle files up to 4 GB */
708 /* The CDROM is read-only, has no nodes (devices) on it, and since
709 all of the files appear to be owned by root, we really do not want
710 to allow suid. (suid or devices will not show up unless we have
711 Rock Ridge extensions) */
713 s
->s_flags
|= MS_RDONLY
/* | MS_NODEV | MS_NOSUID */;
715 /* Set this for reference. Its not currently used except on write
716 which we don't have .. */
718 first_data_zone
= isonum_733 (rootp
->extent
) +
719 isonum_711 (rootp
->ext_attr_length
);
720 sbi
->s_firstdatazone
= first_data_zone
;
722 printk(KERN_DEBUG
"Max size:%ld Log zone size:%ld\n",
724 1UL << sbi
->s_log_zone_size
);
725 printk(KERN_DEBUG
"First datazone:%ld\n", sbi
->s_firstdatazone
);
726 if(sbi
->s_high_sierra
)
727 printk(KERN_DEBUG
"Disc in High Sierra format.\n");
731 * If the Joliet level is set, we _may_ decide to use the
732 * secondary descriptor, but can't be sure until after we
733 * read the root inode. But before reading the root inode
734 * we may need to change the device blocksize, and would
735 * rather release the old buffer first. So, we cache the
736 * first_data_zone value from the secondary descriptor.
739 pri
= (struct iso_primary_descriptor
*) sec
;
740 rootp
= (struct iso_directory_record
*)
741 pri
->root_directory_record
;
742 first_data_zone
= isonum_733 (rootp
->extent
) +
743 isonum_711 (rootp
->ext_attr_length
);
747 * We're all done using the volume descriptor, and may need
748 * to change the device blocksize, so release the buffer now.
754 * Force the blocksize to 512 for 512 byte sectors. The file
755 * read primitives really get it wrong in a bad way if we don't
758 * Note - we should never be setting the blocksize to something
759 * less than the hardware sector size for the device. If we
760 * do, we would end up having to read larger buffers and split
761 * out portions to satisfy requests.
763 * Note2- the idea here is that we want to deal with the optimal
764 * zonesize in the filesystem. If we have it set to something less,
765 * then we have horrible problems with trying to piece together
766 * bits of adjacent blocks in order to properly read directory
767 * entries. By forcing the blocksize in this way, we ensure
768 * that we will never be required to do this.
770 sb_set_blocksize(s
, orig_zonesize
);
772 sbi
->s_nls_iocharset
= NULL
;
775 if (joliet_level
&& opt
.utf8
== 0) {
776 char * p
= opt
.iocharset
? opt
.iocharset
: CONFIG_NLS_DEFAULT
;
777 sbi
->s_nls_iocharset
= load_nls(p
);
778 if (! sbi
->s_nls_iocharset
) {
779 /* Fail only if explicit charset specified */
782 sbi
->s_nls_iocharset
= load_nls_default();
786 s
->s_op
= &isofs_sops
;
787 s
->s_export_op
= &isofs_export_ops
;
788 sbi
->s_mapping
= opt
.map
;
789 sbi
->s_rock
= (opt
.rock
== 'y' ? 2 : 0);
790 sbi
->s_rock_offset
= -1; /* initial offset, will guess until SP is found*/
791 sbi
->s_cruft
= opt
.cruft
;
792 sbi
->s_hide
= opt
.hide
;
793 sbi
->s_showassoc
= opt
.showassoc
;
794 sbi
->s_uid
= opt
.uid
;
795 sbi
->s_gid
= opt
.gid
;
796 sbi
->s_utf8
= opt
.utf8
;
797 sbi
->s_nocompress
= opt
.nocompress
;
799 * It would be incredibly stupid to allow people to mark every file
800 * on the disk as suid, so we merely allow them to set the default
803 sbi
->s_mode
= opt
.mode
& 0777;
806 * Read the root inode, which _may_ result in changing
807 * the s_rock flag. Once we have the final s_rock value,
808 * we then decide whether to use the Joliet descriptor.
810 inode
= isofs_iget(s
, sbi
->s_firstdatazone
, 0);
813 * If this disk has both Rock Ridge and Joliet on it, then we
814 * want to use Rock Ridge by default. This can be overridden
815 * by using the norock mount option. There is still one other
816 * possibility that is not taken into account: a Rock Ridge
817 * CD with Unicode names. Until someone sees such a beast, it
818 * will not be supported.
820 if (sbi
->s_rock
== 1) {
822 } else if (joliet_level
) {
824 if (sbi
->s_firstdatazone
!= first_data_zone
) {
825 sbi
->s_firstdatazone
= first_data_zone
;
827 "ISOFS: changing to secondary root\n");
829 inode
= isofs_iget(s
, sbi
->s_firstdatazone
, 0);
833 if (opt
.check
== 'u') {
834 /* Only Joliet is case insensitive by default */
835 if (joliet_level
) opt
.check
= 'r';
836 else opt
.check
= 's';
838 sbi
->s_joliet_level
= joliet_level
;
840 /* check the root inode */
845 /* get the root dentry */
846 s
->s_root
= d_alloc_root(inode
);
851 if (joliet_level
) table
+= 2;
852 if (opt
.check
== 'r') table
++;
853 s
->s_root
->d_op
= &isofs_dentry_ops
[table
];
855 kfree(opt
.iocharset
);
860 * Display error messages and free resources.
863 printk(KERN_WARNING
"isofs_fill_super: root inode not initialized\n");
866 printk(KERN_WARNING
"isofs_fill_super: get root inode failed\n");
870 if (sbi
->s_nls_iocharset
)
871 unload_nls(sbi
->s_nls_iocharset
);
875 printk(KERN_WARNING
"isofs_fill_super: "
876 "bread failed, dev=%s, iso_blknum=%d, block=%d\n",
877 s
->s_id
, iso_blknum
, block
);
880 printk(KERN_WARNING
"Bad logical zone size %ld\n",
881 sbi
->s_log_zone_size
);
884 printk(KERN_WARNING
"Logical zone size(%d) < hardware blocksize(%u)\n",
885 orig_zonesize
, opt
.blocksize
);
889 printk(KERN_WARNING
"Unable to identify CD-ROM format.\n");
894 kfree(opt
.iocharset
);
900 static int isofs_statfs (struct dentry
*dentry
, struct kstatfs
*buf
)
902 struct super_block
*sb
= dentry
->d_sb
;
904 buf
->f_type
= ISOFS_SUPER_MAGIC
;
905 buf
->f_bsize
= sb
->s_blocksize
;
906 buf
->f_blocks
= (ISOFS_SB(sb
)->s_nzones
907 << (ISOFS_SB(sb
)->s_log_zone_size
- sb
->s_blocksize_bits
));
910 buf
->f_files
= ISOFS_SB(sb
)->s_ninodes
;
912 buf
->f_namelen
= NAME_MAX
;
917 * Get a set of blocks; filling in buffer_heads if already allocated
918 * or getblk() if they are not. Returns the number of blocks inserted
921 int isofs_get_blocks(struct inode
*inode
, sector_t iblock_s
,
922 struct buffer_head
**bh
, unsigned long nblocks
)
925 unsigned offset
, sect_size
;
926 unsigned int firstext
;
927 unsigned long nextblk
, nextoff
;
928 long iblock
= (long)iblock_s
;
930 struct iso_inode_info
*ei
= ISOFS_I(inode
);
935 if (iblock
< 0 || iblock
!= iblock_s
) {
936 printk("isofs_get_blocks: block number too large\n");
943 firstext
= ei
->i_first_extent
;
944 sect_size
= ei
->i_section_size
>> ISOFS_BUFFER_BITS(inode
);
945 nextblk
= ei
->i_next_section_block
;
946 nextoff
= ei
->i_next_section_offset
;
950 /* If we are *way* beyond the end of the file, print a message.
951 * Access beyond the end of the file up to the next page boundary
952 * is normal, however because of the way the page cache works.
953 * In this case, we just return 0 so that we can properly fill
954 * the page with useless information without generating any
957 if (b_off
> ((inode
->i_size
+ PAGE_CACHE_SIZE
- 1) >> ISOFS_BUFFER_BITS(inode
))) {
958 printk("isofs_get_blocks: block >= EOF (%ld, %ld)\n",
959 iblock
, (unsigned long) inode
->i_size
);
963 /* On the last section, nextblk == 0, section size is likely to
964 * exceed sect_size by a partial block, and access beyond the
965 * end of the file will reach beyond the section size, too.
967 while (nextblk
&& (b_off
>= (offset
+ sect_size
))) {
968 struct inode
*ninode
;
971 ninode
= isofs_iget(inode
->i_sb
, nextblk
, nextoff
);
974 firstext
= ISOFS_I(ninode
)->i_first_extent
;
975 sect_size
= ISOFS_I(ninode
)->i_section_size
>> ISOFS_BUFFER_BITS(ninode
);
976 nextblk
= ISOFS_I(ninode
)->i_next_section_block
;
977 nextoff
= ISOFS_I(ninode
)->i_next_section_offset
;
980 if (++section
> 100) {
981 printk("isofs_get_blocks: More than 100 file sections ?!?, aborting...\n");
982 printk("isofs_get_blocks: block=%ld firstext=%u sect_size=%u "
983 "nextblk=%lu nextoff=%lu\n",
984 iblock
, firstext
, (unsigned) sect_size
,
991 map_bh(*bh
, inode
->i_sb
, firstext
+ b_off
- offset
);
993 *bh
= sb_getblk(inode
->i_sb
, firstext
+b_off
-offset
);
997 bh
++; /* Next buffer head */
998 b_off
++; /* Next buffer offset */
1009 * Used by the standard interfaces.
1011 static int isofs_get_block(struct inode
*inode
, sector_t iblock
,
1012 struct buffer_head
*bh_result
, int create
)
1015 printk("isofs_get_block: Kernel tries to allocate a block\n");
1019 return isofs_get_blocks(inode
, iblock
, &bh_result
, 1) ? 0 : -EIO
;
1022 static int isofs_bmap(struct inode
*inode
, sector_t block
)
1024 struct buffer_head dummy
;
1028 dummy
.b_blocknr
= -1000;
1029 error
= isofs_get_block(inode
, block
, &dummy
, 0);
1031 return dummy
.b_blocknr
;
1035 struct buffer_head
*isofs_bread(struct inode
*inode
, sector_t block
)
1037 sector_t blknr
= isofs_bmap(inode
, block
);
1040 return sb_bread(inode
->i_sb
, blknr
);
1043 static int isofs_readpage(struct file
*file
, struct page
*page
)
1045 return block_read_full_page(page
,isofs_get_block
);
1048 static sector_t
_isofs_bmap(struct address_space
*mapping
, sector_t block
)
1050 return generic_block_bmap(mapping
,block
,isofs_get_block
);
1053 static const struct address_space_operations isofs_aops
= {
1054 .readpage
= isofs_readpage
,
1055 .sync_page
= block_sync_page
,
1059 static inline void test_and_set_uid(uid_t
*p
, uid_t value
)
1065 static inline void test_and_set_gid(gid_t
*p
, gid_t value
)
1071 static int isofs_read_level3_size(struct inode
*inode
)
1073 unsigned long bufsize
= ISOFS_BUFFER_SIZE(inode
);
1074 int high_sierra
= ISOFS_SB(inode
->i_sb
)->s_high_sierra
;
1075 struct buffer_head
* bh
= NULL
;
1076 unsigned long block
, offset
, block_saved
, offset_saved
;
1078 int more_entries
= 0;
1079 struct iso_directory_record
* tmpde
= NULL
;
1080 struct iso_inode_info
*ei
= ISOFS_I(inode
);
1084 /* The first 16 blocks are reserved as the System Area. Thus,
1085 * no inodes can appear in block 0. We use this to flag that
1086 * this is the last section. */
1087 ei
->i_next_section_block
= 0;
1088 ei
->i_next_section_offset
= 0;
1090 block
= ei
->i_iget5_block
;
1091 offset
= ei
->i_iget5_offset
;
1094 struct iso_directory_record
* de
;
1095 unsigned int de_len
;
1098 bh
= sb_bread(inode
->i_sb
, block
);
1102 de
= (struct iso_directory_record
*) (bh
->b_data
+ offset
);
1103 de_len
= *(unsigned char *) de
;
1113 block_saved
= block
;
1114 offset_saved
= offset
;
1117 /* Make sure we have a full directory entry */
1118 if (offset
>= bufsize
) {
1119 int slop
= bufsize
- offset
+ de_len
;
1121 tmpde
= kmalloc(256, GFP_KERNEL
);
1125 memcpy(tmpde
, de
, slop
);
1126 offset
&= bufsize
- 1;
1131 bh
= sb_bread(inode
->i_sb
, block
);
1134 memcpy((void *)tmpde
+slop
, bh
->b_data
, offset
);
1139 inode
->i_size
+= isonum_733(de
->size
);
1141 ei
->i_next_section_block
= block_saved
;
1142 ei
->i_next_section_offset
= offset_saved
;
1145 more_entries
= de
->flags
[-high_sierra
] & 0x80;
1150 } while (more_entries
);
1163 printk(KERN_INFO
"ISOFS: unable to read i-node block %lu\n", block
);
1168 printk(KERN_INFO
"isofs_read_level3_size: "
1169 "More than 100 file sections ?!?, aborting...\n"
1170 "isofs_read_level3_size: inode=%lu\n",
1175 static void isofs_read_inode(struct inode
*inode
)
1177 struct super_block
*sb
= inode
->i_sb
;
1178 struct isofs_sb_info
*sbi
= ISOFS_SB(sb
);
1179 unsigned long bufsize
= ISOFS_BUFFER_SIZE(inode
);
1180 unsigned long block
;
1181 int high_sierra
= sbi
->s_high_sierra
;
1182 struct buffer_head
* bh
= NULL
;
1183 struct iso_directory_record
* de
;
1184 struct iso_directory_record
* tmpde
= NULL
;
1185 unsigned int de_len
;
1186 unsigned long offset
;
1187 struct iso_inode_info
*ei
= ISOFS_I(inode
);
1189 block
= ei
->i_iget5_block
;
1190 bh
= sb_bread(inode
->i_sb
, block
);
1194 offset
= ei
->i_iget5_offset
;
1196 de
= (struct iso_directory_record
*) (bh
->b_data
+ offset
);
1197 de_len
= *(unsigned char *) de
;
1199 if (offset
+ de_len
> bufsize
) {
1200 int frag1
= bufsize
- offset
;
1202 tmpde
= kmalloc(de_len
, GFP_KERNEL
);
1203 if (tmpde
== NULL
) {
1204 printk(KERN_INFO
"isofs_read_inode: out of memory\n");
1207 memcpy(tmpde
, bh
->b_data
+ offset
, frag1
);
1209 bh
= sb_bread(inode
->i_sb
, ++block
);
1212 memcpy((char *)tmpde
+frag1
, bh
->b_data
, de_len
- frag1
);
1216 inode
->i_ino
= isofs_get_ino(ei
->i_iget5_block
,
1218 ISOFS_BUFFER_BITS(inode
));
1220 /* Assume it is a normal-format file unless told otherwise */
1221 ei
->i_file_format
= isofs_file_normal
;
1223 if (de
->flags
[-high_sierra
] & 2) {
1224 inode
->i_mode
= S_IRUGO
| S_IXUGO
| S_IFDIR
;
1225 inode
->i_nlink
= 1; /* Set to 1. We know there are 2, but
1226 the find utility tries to optimize
1227 if it is 2, and it screws up. It is
1228 easier to give 1 which tells find to
1229 do it the hard way. */
1231 /* Everybody gets to read the file. */
1232 inode
->i_mode
= sbi
->s_mode
;
1234 inode
->i_mode
|= S_IFREG
;
1236 inode
->i_uid
= sbi
->s_uid
;
1237 inode
->i_gid
= sbi
->s_gid
;
1238 inode
->i_blocks
= 0;
1240 ei
->i_format_parm
[0] = 0;
1241 ei
->i_format_parm
[1] = 0;
1242 ei
->i_format_parm
[2] = 0;
1244 ei
->i_section_size
= isonum_733 (de
->size
);
1245 if (de
->flags
[-high_sierra
] & 0x80) {
1246 if(isofs_read_level3_size(inode
)) goto fail
;
1248 ei
->i_next_section_block
= 0;
1249 ei
->i_next_section_offset
= 0;
1250 inode
->i_size
= isonum_733 (de
->size
);
1254 * Some dipshit decided to store some other bit of information
1255 * in the high byte of the file length. Truncate size in case
1256 * this CDROM was mounted with the cruft option.
1259 if (sbi
->s_cruft
== 'y')
1260 inode
->i_size
&= 0x00ffffff;
1262 if (de
->interleave
[0]) {
1263 printk("Interleaved files not (yet) supported.\n");
1267 /* I have no idea what file_unit_size is used for, so
1268 we will flag it for now */
1269 if (de
->file_unit_size
[0] != 0) {
1270 printk("File unit size != 0 for ISO file (%ld).\n",
1274 /* I have no idea what other flag bits are used for, so
1275 we will flag it for now */
1277 if((de
->flags
[-high_sierra
] & ~2)!= 0){
1278 printk("Unusual flag settings for ISO file (%ld %x).\n",
1279 inode
->i_ino
, de
->flags
[-high_sierra
]);
1283 inode
->i_mtime
.tv_sec
=
1284 inode
->i_atime
.tv_sec
=
1285 inode
->i_ctime
.tv_sec
= iso_date(de
->date
, high_sierra
);
1286 inode
->i_mtime
.tv_nsec
=
1287 inode
->i_atime
.tv_nsec
=
1288 inode
->i_ctime
.tv_nsec
= 0;
1290 ei
->i_first_extent
= (isonum_733 (de
->extent
) +
1291 isonum_711 (de
->ext_attr_length
));
1293 /* Set the number of blocks for stat() - should be done before RR */
1294 inode
->i_blocks
= (inode
->i_size
+ 511) >> 9;
1297 * Now test for possible Rock Ridge extensions which will override
1298 * some of these numbers in the inode structure.
1302 parse_rock_ridge_inode(de
, inode
);
1303 /* if we want uid/gid set, override the rock ridge setting */
1304 test_and_set_uid(&inode
->i_uid
, sbi
->s_uid
);
1305 test_and_set_gid(&inode
->i_gid
, sbi
->s_gid
);
1308 /* Install the inode operations vector */
1309 if (S_ISREG(inode
->i_mode
)) {
1310 inode
->i_fop
= &generic_ro_fops
;
1311 switch ( ei
->i_file_format
) {
1312 #ifdef CONFIG_ZISOFS
1313 case isofs_file_compressed
:
1314 inode
->i_data
.a_ops
= &zisofs_aops
;
1318 inode
->i_data
.a_ops
= &isofs_aops
;
1321 } else if (S_ISDIR(inode
->i_mode
)) {
1322 inode
->i_op
= &isofs_dir_inode_operations
;
1323 inode
->i_fop
= &isofs_dir_operations
;
1324 } else if (S_ISLNK(inode
->i_mode
)) {
1325 inode
->i_op
= &page_symlink_inode_operations
;
1326 inode
->i_data
.a_ops
= &isofs_symlink_aops
;
1328 /* XXX - parse_rock_ridge_inode() had already set i_rdev. */
1329 init_special_inode(inode
, inode
->i_mode
, inode
->i_rdev
);
1338 printk(KERN_WARNING
"ISOFS: unable to read i-node block\n");
1340 make_bad_inode(inode
);
1344 struct isofs_iget5_callback_data
{
1345 unsigned long block
;
1346 unsigned long offset
;
1349 static int isofs_iget5_test(struct inode
*ino
, void *data
)
1351 struct iso_inode_info
*i
= ISOFS_I(ino
);
1352 struct isofs_iget5_callback_data
*d
=
1353 (struct isofs_iget5_callback_data
*)data
;
1354 return (i
->i_iget5_block
== d
->block
)
1355 && (i
->i_iget5_offset
== d
->offset
);
1358 static int isofs_iget5_set(struct inode
*ino
, void *data
)
1360 struct iso_inode_info
*i
= ISOFS_I(ino
);
1361 struct isofs_iget5_callback_data
*d
=
1362 (struct isofs_iget5_callback_data
*)data
;
1363 i
->i_iget5_block
= d
->block
;
1364 i
->i_iget5_offset
= d
->offset
;
1368 /* Store, in the inode's containing structure, the block and block
1369 * offset that point to the underlying meta-data for the inode. The
1370 * code below is otherwise similar to the iget() code in
1371 * include/linux/fs.h */
1372 struct inode
*isofs_iget(struct super_block
*sb
,
1373 unsigned long block
,
1374 unsigned long offset
)
1376 unsigned long hashval
;
1377 struct inode
*inode
;
1378 struct isofs_iget5_callback_data data
;
1380 if (offset
>= 1ul << sb
->s_blocksize_bits
)
1384 data
.offset
= offset
;
1386 hashval
= (block
<< sb
->s_blocksize_bits
) | offset
;
1388 inode
= iget5_locked(sb
, hashval
, &isofs_iget5_test
,
1389 &isofs_iget5_set
, &data
);
1391 if (inode
&& (inode
->i_state
& I_NEW
)) {
1392 sb
->s_op
->read_inode(inode
);
1393 unlock_new_inode(inode
);
1399 static int isofs_get_sb(struct file_system_type
*fs_type
,
1400 int flags
, const char *dev_name
, void *data
, struct vfsmount
*mnt
)
1402 return get_sb_bdev(fs_type
, flags
, dev_name
, data
, isofs_fill_super
,
1406 static struct file_system_type iso9660_fs_type
= {
1407 .owner
= THIS_MODULE
,
1409 .get_sb
= isofs_get_sb
,
1410 .kill_sb
= kill_block_super
,
1411 .fs_flags
= FS_REQUIRES_DEV
,
1414 static int __init
init_iso9660_fs(void)
1416 int err
= init_inodecache();
1419 #ifdef CONFIG_ZISOFS
1420 err
= zisofs_init();
1424 err
= register_filesystem(&iso9660_fs_type
);
1429 #ifdef CONFIG_ZISOFS
1433 destroy_inodecache();
1438 static void __exit
exit_iso9660_fs(void)
1440 unregister_filesystem(&iso9660_fs_type
);
1441 #ifdef CONFIG_ZISOFS
1444 destroy_inodecache();
1447 module_init(init_iso9660_fs
)
1448 module_exit(exit_iso9660_fs
)
1449 MODULE_LICENSE("GPL");
1450 /* Actual filesystem name is iso9660, as requested in filesystems.c */
1451 MODULE_ALIAS("iso9660");