diff options
-rw-r--r-- | fs/isofs/dir.c | 87 | ||||
-rw-r--r-- | fs/isofs/inode.c | 415 | ||||
-rw-r--r-- | fs/isofs/joliet.c | 10 | ||||
-rw-r--r-- | fs/isofs/namei.c | 26 |
4 files changed, 277 insertions, 261 deletions
diff --git a/fs/isofs/dir.c b/fs/isofs/dir.c index 0e94c31cad9b..1ba407c64df1 100644 --- a/fs/isofs/dir.c +++ b/fs/isofs/dir.c | |||
@@ -7,34 +7,18 @@ | |||
7 | * | 7 | * |
8 | * Steve Beynon : Missing last directory entries fixed | 8 | * Steve Beynon : Missing last directory entries fixed |
9 | * (stephen@askone.demon.co.uk) : 21st June 1996 | 9 | * (stephen@askone.demon.co.uk) : 21st June 1996 |
10 | * | 10 | * |
11 | * isofs directory handling functions | 11 | * isofs directory handling functions |
12 | */ | 12 | */ |
13 | #include <linux/smp_lock.h> | 13 | #include <linux/smp_lock.h> |
14 | #include "isofs.h" | 14 | #include "isofs.h" |
15 | 15 | ||
16 | static int isofs_readdir(struct file *, void *, filldir_t); | ||
17 | |||
18 | const struct file_operations isofs_dir_operations = | ||
19 | { | ||
20 | .read = generic_read_dir, | ||
21 | .readdir = isofs_readdir, | ||
22 | }; | ||
23 | |||
24 | /* | ||
25 | * directories can handle most operations... | ||
26 | */ | ||
27 | const struct inode_operations isofs_dir_inode_operations = | ||
28 | { | ||
29 | .lookup = isofs_lookup, | ||
30 | }; | ||
31 | |||
32 | int isofs_name_translate(struct iso_directory_record *de, char *new, struct inode *inode) | 16 | int isofs_name_translate(struct iso_directory_record *de, char *new, struct inode *inode) |
33 | { | 17 | { |
34 | char * old = de->name; | 18 | char * old = de->name; |
35 | int len = de->name_len[0]; | 19 | int len = de->name_len[0]; |
36 | int i; | 20 | int i; |
37 | 21 | ||
38 | for (i = 0; i < len; i++) { | 22 | for (i = 0; i < len; i++) { |
39 | unsigned char c = old[i]; | 23 | unsigned char c = old[i]; |
40 | if (!c) | 24 | if (!c) |
@@ -62,22 +46,27 @@ int isofs_name_translate(struct iso_directory_record *de, char *new, struct inod | |||
62 | } | 46 | } |
63 | 47 | ||
64 | /* Acorn extensions written by Matthew Wilcox <willy@bofh.ai> 1998 */ | 48 | /* Acorn extensions written by Matthew Wilcox <willy@bofh.ai> 1998 */ |
65 | int get_acorn_filename(struct iso_directory_record * de, | 49 | int get_acorn_filename(struct iso_directory_record *de, |
66 | char * retname, struct inode * inode) | 50 | char *retname, struct inode *inode) |
67 | { | 51 | { |
68 | int std; | 52 | int std; |
69 | unsigned char * chr; | 53 | unsigned char *chr; |
70 | int retnamlen = isofs_name_translate(de, retname, inode); | 54 | int retnamlen = isofs_name_translate(de, retname, inode); |
71 | if (retnamlen == 0) return 0; | 55 | |
56 | if (retnamlen == 0) | ||
57 | return 0; | ||
72 | std = sizeof(struct iso_directory_record) + de->name_len[0]; | 58 | std = sizeof(struct iso_directory_record) + de->name_len[0]; |
73 | if (std & 1) std++; | 59 | if (std & 1) |
74 | if ((*((unsigned char *) de) - std) != 32) return retnamlen; | 60 | std++; |
61 | if ((*((unsigned char *) de) - std) != 32) | ||
62 | return retnamlen; | ||
75 | chr = ((unsigned char *) de) + std; | 63 | chr = ((unsigned char *) de) + std; |
76 | if (strncmp(chr, "ARCHIMEDES", 10)) return retnamlen; | 64 | if (strncmp(chr, "ARCHIMEDES", 10)) |
77 | if ((*retname == '_') && ((chr[19] & 1) == 1)) *retname = '!'; | 65 | return retnamlen; |
66 | if ((*retname == '_') && ((chr[19] & 1) == 1)) | ||
67 | *retname = '!'; | ||
78 | if (((de->flags[0] & 2) == 0) && (chr[13] == 0xff) | 68 | if (((de->flags[0] & 2) == 0) && (chr[13] == 0xff) |
79 | && ((chr[12] & 0xf0) == 0xf0)) | 69 | && ((chr[12] & 0xf0) == 0xf0)) { |
80 | { | ||
81 | retname[retnamlen] = ','; | 70 | retname[retnamlen] = ','; |
82 | sprintf(retname+retnamlen+1, "%3.3x", | 71 | sprintf(retname+retnamlen+1, "%3.3x", |
83 | ((chr[12] & 0xf) << 8) | chr[11]); | 72 | ((chr[12] & 0xf) << 8) | chr[11]); |
@@ -91,7 +80,7 @@ int get_acorn_filename(struct iso_directory_record * de, | |||
91 | */ | 80 | */ |
92 | static int do_isofs_readdir(struct inode *inode, struct file *filp, | 81 | static int do_isofs_readdir(struct inode *inode, struct file *filp, |
93 | void *dirent, filldir_t filldir, | 82 | void *dirent, filldir_t filldir, |
94 | char * tmpname, struct iso_directory_record * tmpde) | 83 | char *tmpname, struct iso_directory_record *tmpde) |
95 | { | 84 | { |
96 | unsigned long bufsize = ISOFS_BUFFER_SIZE(inode); | 85 | unsigned long bufsize = ISOFS_BUFFER_SIZE(inode); |
97 | unsigned char bufbits = ISOFS_BUFFER_BITS(inode); | 86 | unsigned char bufbits = ISOFS_BUFFER_BITS(inode); |
@@ -121,9 +110,11 @@ static int do_isofs_readdir(struct inode *inode, struct file *filp, | |||
121 | 110 | ||
122 | de_len = *(unsigned char *) de; | 111 | de_len = *(unsigned char *) de; |
123 | 112 | ||
124 | /* If the length byte is zero, we should move on to the next | 113 | /* |
125 | CDROM sector. If we are at the end of the directory, we | 114 | * If the length byte is zero, we should move on to the next |
126 | kick out of the while loop. */ | 115 | * CDROM sector. If we are at the end of the directory, we |
116 | * kick out of the while loop. | ||
117 | */ | ||
127 | 118 | ||
128 | if (de_len == 0) { | 119 | if (de_len == 0) { |
129 | brelse(bh); | 120 | brelse(bh); |
@@ -157,11 +148,10 @@ static int do_isofs_readdir(struct inode *inode, struct file *filp, | |||
157 | 148 | ||
158 | if (first_de) { | 149 | if (first_de) { |
159 | isofs_normalize_block_and_offset(de, | 150 | isofs_normalize_block_and_offset(de, |
160 | &block_saved, | 151 | &block_saved, |
161 | &offset_saved); | 152 | &offset_saved); |
162 | inode_number = isofs_get_ino(block_saved, | 153 | inode_number = isofs_get_ino(block_saved, |
163 | offset_saved, | 154 | offset_saved, bufbits); |
164 | bufbits); | ||
165 | } | 155 | } |
166 | 156 | ||
167 | if (de->flags[-sbi->s_high_sierra] & 0x80) { | 157 | if (de->flags[-sbi->s_high_sierra] & 0x80) { |
@@ -199,7 +189,7 @@ static int do_isofs_readdir(struct inode *inode, struct file *filp, | |||
199 | */ | 189 | */ |
200 | if ((sbi->s_hide == 'y' && | 190 | if ((sbi->s_hide == 'y' && |
201 | (de->flags[-sbi->s_high_sierra] & 1)) || | 191 | (de->flags[-sbi->s_high_sierra] & 1)) || |
202 | (sbi->s_showassoc =='n' && | 192 | (sbi->s_showassoc =='n' && |
203 | (de->flags[-sbi->s_high_sierra] & 4))) { | 193 | (de->flags[-sbi->s_high_sierra] & 4))) { |
204 | filp->f_pos += de_len; | 194 | filp->f_pos += de_len; |
205 | continue; | 195 | continue; |
@@ -240,7 +230,8 @@ static int do_isofs_readdir(struct inode *inode, struct file *filp, | |||
240 | 230 | ||
241 | continue; | 231 | continue; |
242 | } | 232 | } |
243 | if (bh) brelse(bh); | 233 | if (bh) |
234 | brelse(bh); | ||
244 | return 0; | 235 | return 0; |
245 | } | 236 | } |
246 | 237 | ||
@@ -253,8 +244,8 @@ static int isofs_readdir(struct file *filp, | |||
253 | void *dirent, filldir_t filldir) | 244 | void *dirent, filldir_t filldir) |
254 | { | 245 | { |
255 | int result; | 246 | int result; |
256 | char * tmpname; | 247 | char *tmpname; |
257 | struct iso_directory_record * tmpde; | 248 | struct iso_directory_record *tmpde; |
258 | struct inode *inode = filp->f_path.dentry->d_inode; | 249 | struct inode *inode = filp->f_path.dentry->d_inode; |
259 | 250 | ||
260 | tmpname = (char *)__get_free_page(GFP_KERNEL); | 251 | tmpname = (char *)__get_free_page(GFP_KERNEL); |
@@ -270,3 +261,19 @@ static int isofs_readdir(struct file *filp, | |||
270 | unlock_kernel(); | 261 | unlock_kernel(); |
271 | return result; | 262 | return result; |
272 | } | 263 | } |
264 | |||
265 | const struct file_operations isofs_dir_operations = | ||
266 | { | ||
267 | .read = generic_read_dir, | ||
268 | .readdir = isofs_readdir, | ||
269 | }; | ||
270 | |||
271 | /* | ||
272 | * directories can handle most operations... | ||
273 | */ | ||
274 | const struct inode_operations isofs_dir_inode_operations = | ||
275 | { | ||
276 | .lookup = isofs_lookup, | ||
277 | }; | ||
278 | |||
279 | |||
diff --git a/fs/isofs/inode.c b/fs/isofs/inode.c index 5c3eecf7542e..15c866f1a1fd 100644 --- a/fs/isofs/inode.c +++ b/fs/isofs/inode.c | |||
@@ -73,20 +73,20 @@ static void isofs_destroy_inode(struct inode *inode) | |||
73 | kmem_cache_free(isofs_inode_cachep, ISOFS_I(inode)); | 73 | kmem_cache_free(isofs_inode_cachep, ISOFS_I(inode)); |
74 | } | 74 | } |
75 | 75 | ||
76 | static void init_once(void *foo, struct kmem_cache * cachep, unsigned long flags) | 76 | static void init_once(void *foo, struct kmem_cache *cachep, unsigned long flags) |
77 | { | 77 | { |
78 | struct iso_inode_info *ei = foo; | 78 | struct iso_inode_info *ei = foo; |
79 | 79 | ||
80 | inode_init_once(&ei->vfs_inode); | 80 | inode_init_once(&ei->vfs_inode); |
81 | } | 81 | } |
82 | 82 | ||
83 | static int init_inodecache(void) | 83 | static int init_inodecache(void) |
84 | { | 84 | { |
85 | isofs_inode_cachep = kmem_cache_create("isofs_inode_cache", | 85 | isofs_inode_cachep = kmem_cache_create("isofs_inode_cache", |
86 | sizeof(struct iso_inode_info), | 86 | sizeof(struct iso_inode_info), |
87 | 0, (SLAB_RECLAIM_ACCOUNT| | 87 | 0, (SLAB_RECLAIM_ACCOUNT| |
88 | SLAB_MEM_SPREAD), | 88 | SLAB_MEM_SPREAD), |
89 | init_once, NULL); | 89 | init_once, NULL); |
90 | if (isofs_inode_cachep == NULL) | 90 | if (isofs_inode_cachep == NULL) |
91 | return -ENOMEM; | 91 | return -ENOMEM; |
92 | return 0; | 92 | return 0; |
@@ -150,9 +150,9 @@ struct iso9660_options{ | |||
150 | uid_t uid; | 150 | uid_t uid; |
151 | char *iocharset; | 151 | char *iocharset; |
152 | unsigned char utf8; | 152 | unsigned char utf8; |
153 | /* LVE */ | 153 | /* LVE */ |
154 | s32 session; | 154 | s32 session; |
155 | s32 sbsector; | 155 | s32 sbsector; |
156 | }; | 156 | }; |
157 | 157 | ||
158 | /* | 158 | /* |
@@ -360,10 +360,12 @@ static int parse_options(char *options, struct iso9660_options *popt) | |||
360 | popt->check = 'u'; /* unset */ | 360 | popt->check = 'u'; /* unset */ |
361 | popt->nocompress = 0; | 361 | popt->nocompress = 0; |
362 | popt->blocksize = 1024; | 362 | popt->blocksize = 1024; |
363 | popt->mode = S_IRUGO | S_IXUGO; /* r-x for all. The disc could | 363 | popt->mode = S_IRUGO | S_IXUGO; /* |
364 | be shared with DOS machines so | 364 | * r-x for all. The disc could |
365 | virtually anything could be | 365 | * be shared with DOS machines so |
366 | a valid executable. */ | 366 | * virtually anything could be |
367 | * a valid executable. | ||
368 | */ | ||
367 | popt->gid = 0; | 369 | popt->gid = 0; |
368 | popt->uid = 0; | 370 | popt->uid = 0; |
369 | popt->iocharset = NULL; | 371 | popt->iocharset = NULL; |
@@ -503,30 +505,30 @@ static unsigned int isofs_get_last_session(struct super_block *sb, s32 session) | |||
503 | Te.cdte_format=CDROM_LBA; | 505 | Te.cdte_format=CDROM_LBA; |
504 | i = ioctl_by_bdev(bdev, CDROMREADTOCENTRY, (unsigned long) &Te); | 506 | i = ioctl_by_bdev(bdev, CDROMREADTOCENTRY, (unsigned long) &Te); |
505 | if (!i) { | 507 | if (!i) { |
506 | printk(KERN_DEBUG "Session %d start %d type %d\n", | 508 | printk(KERN_DEBUG "ISOFS: Session %d start %d type %d\n", |
507 | session, Te.cdte_addr.lba, | 509 | session, Te.cdte_addr.lba, |
508 | Te.cdte_ctrl&CDROM_DATA_TRACK); | 510 | Te.cdte_ctrl&CDROM_DATA_TRACK); |
509 | if ((Te.cdte_ctrl&CDROM_DATA_TRACK) == 4) | 511 | if ((Te.cdte_ctrl&CDROM_DATA_TRACK) == 4) |
510 | return Te.cdte_addr.lba; | 512 | return Te.cdte_addr.lba; |
511 | } | 513 | } |
512 | 514 | ||
513 | printk(KERN_ERR "Invalid session number or type of track\n"); | 515 | printk(KERN_ERR "ISOFS: Invalid session number or type of track\n"); |
514 | } | 516 | } |
515 | i = ioctl_by_bdev(bdev, CDROMMULTISESSION, (unsigned long) &ms_info); | 517 | i = ioctl_by_bdev(bdev, CDROMMULTISESSION, (unsigned long) &ms_info); |
516 | if (session > 0) | 518 | if (session > 0) |
517 | printk(KERN_ERR "Invalid session number\n"); | 519 | printk(KERN_ERR "ISOFS: Invalid session number\n"); |
518 | #if 0 | 520 | #if 0 |
519 | printk("isofs.inode: CDROMMULTISESSION: rc=%d\n",i); | 521 | printk(KERN_DEBUG "isofs.inode: CDROMMULTISESSION: rc=%d\n",i); |
520 | if (i==0) { | 522 | if (i==0) { |
521 | printk("isofs.inode: XA disk: %s\n",ms_info.xa_flag?"yes":"no"); | 523 | printk(KERN_DEBUG "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); | 524 | printk(KERN_DEBUG "isofs.inode: vol_desc_start = %d\n", ms_info.addr.lba); |
523 | } | 525 | } |
524 | #endif | 526 | #endif |
525 | if (i==0) | 527 | if (i==0) |
526 | #if WE_OBEY_THE_WRITTEN_STANDARDS | 528 | #if WE_OBEY_THE_WRITTEN_STANDARDS |
527 | if (ms_info.xa_flag) /* necessary for a valid ms_info.addr */ | 529 | if (ms_info.xa_flag) /* necessary for a valid ms_info.addr */ |
528 | #endif | 530 | #endif |
529 | vol_desc_start=ms_info.addr.lba; | 531 | vol_desc_start=ms_info.addr.lba; |
530 | return vol_desc_start; | 532 | return vol_desc_start; |
531 | } | 533 | } |
532 | 534 | ||
@@ -538,20 +540,20 @@ static unsigned int isofs_get_last_session(struct super_block *sb, s32 session) | |||
538 | */ | 540 | */ |
539 | static int isofs_fill_super(struct super_block *s, void *data, int silent) | 541 | static int isofs_fill_super(struct super_block *s, void *data, int silent) |
540 | { | 542 | { |
541 | struct buffer_head * bh = NULL, *pri_bh = NULL; | 543 | struct buffer_head *bh = NULL, *pri_bh = NULL; |
542 | struct hs_primary_descriptor * h_pri = NULL; | 544 | struct hs_primary_descriptor *h_pri = NULL; |
543 | struct iso_primary_descriptor * pri = NULL; | 545 | struct iso_primary_descriptor *pri = NULL; |
544 | struct iso_supplementary_descriptor *sec = NULL; | 546 | struct iso_supplementary_descriptor *sec = NULL; |
545 | struct iso_directory_record * rootp; | 547 | struct iso_directory_record *rootp; |
546 | int joliet_level = 0; | 548 | struct inode *inode; |
547 | int iso_blknum, block; | 549 | struct iso9660_options opt; |
548 | int orig_zonesize; | 550 | struct isofs_sb_info *sbi; |
549 | int table; | 551 | unsigned long first_data_zone; |
550 | unsigned int vol_desc_start; | 552 | int joliet_level = 0; |
551 | unsigned long first_data_zone; | 553 | int iso_blknum, block; |
552 | struct inode * inode; | 554 | int orig_zonesize; |
553 | struct iso9660_options opt; | 555 | int table; |
554 | struct isofs_sb_info * sbi; | 556 | unsigned int vol_desc_start; |
555 | 557 | ||
556 | sbi = kzalloc(sizeof(*sbi), GFP_KERNEL); | 558 | sbi = kzalloc(sizeof(*sbi), GFP_KERNEL); |
557 | if (!sbi) | 559 | if (!sbi) |
@@ -577,72 +579,73 @@ static int isofs_fill_super(struct super_block *s, void *data, int silent) | |||
577 | vol_desc_start = (opt.sbsector != -1) ? | 579 | vol_desc_start = (opt.sbsector != -1) ? |
578 | opt.sbsector : isofs_get_last_session(s,opt.session); | 580 | opt.sbsector : isofs_get_last_session(s,opt.session); |
579 | 581 | ||
580 | for (iso_blknum = vol_desc_start+16; | 582 | for (iso_blknum = vol_desc_start+16; |
581 | iso_blknum < vol_desc_start+100; iso_blknum++) | 583 | iso_blknum < vol_desc_start+100; iso_blknum++) { |
582 | { | 584 | struct hs_volume_descriptor *hdp; |
583 | struct hs_volume_descriptor * hdp; | 585 | struct iso_volume_descriptor *vdp; |
584 | struct iso_volume_descriptor * vdp; | 586 | |
585 | 587 | block = iso_blknum << (ISOFS_BLOCK_BITS - s->s_blocksize_bits); | |
586 | block = iso_blknum << (ISOFS_BLOCK_BITS - s->s_blocksize_bits); | 588 | if (!(bh = sb_bread(s, block))) |
587 | if (!(bh = sb_bread(s, block))) | 589 | goto out_no_read; |
588 | goto out_no_read; | 590 | |
589 | 591 | vdp = (struct iso_volume_descriptor *)bh->b_data; | |
590 | vdp = (struct iso_volume_descriptor *)bh->b_data; | 592 | hdp = (struct hs_volume_descriptor *)bh->b_data; |
591 | hdp = (struct hs_volume_descriptor *)bh->b_data; | 593 | |
592 | 594 | /* | |
593 | /* Due to the overlapping physical location of the descriptors, | 595 | * Due to the overlapping physical location of the descriptors, |
594 | * ISO CDs can match hdp->id==HS_STANDARD_ID as well. To ensure | 596 | * 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 | * proper identification in this case, we first check for ISO. |
596 | */ | 598 | */ |
597 | if (strncmp (vdp->id, ISO_STANDARD_ID, sizeof vdp->id) == 0) { | 599 | 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_END) |
599 | break; | 601 | break; |
600 | if (isonum_711 (vdp->type) == ISO_VD_PRIMARY) { | 602 | if (isonum_711(vdp->type) == ISO_VD_PRIMARY) { |
601 | if (pri == NULL) { | 603 | if (pri == NULL) { |
602 | pri = (struct iso_primary_descriptor *)vdp; | 604 | pri = (struct iso_primary_descriptor *)vdp; |
603 | /* Save the buffer in case we need it ... */ | 605 | /* Save the buffer in case we need it ... */ |
604 | pri_bh = bh; | 606 | pri_bh = bh; |
605 | bh = NULL; | 607 | bh = NULL; |
606 | } | 608 | } |
607 | } | 609 | } |
608 | #ifdef CONFIG_JOLIET | 610 | #ifdef CONFIG_JOLIET |
609 | else if (isonum_711 (vdp->type) == ISO_VD_SUPPLEMENTARY) { | 611 | else if (isonum_711(vdp->type) == ISO_VD_SUPPLEMENTARY) { |
610 | sec = (struct iso_supplementary_descriptor *)vdp; | 612 | sec = (struct iso_supplementary_descriptor *)vdp; |
611 | if (sec->escape[0] == 0x25 && sec->escape[1] == 0x2f) { | 613 | if (sec->escape[0] == 0x25 && sec->escape[1] == 0x2f) { |
612 | if (opt.joliet == 'y') { | 614 | if (opt.joliet == 'y') { |
613 | if (sec->escape[2] == 0x40) { | 615 | if (sec->escape[2] == 0x40) |
614 | joliet_level = 1; | 616 | joliet_level = 1; |
615 | } else if (sec->escape[2] == 0x43) { | 617 | else if (sec->escape[2] == 0x43) |
616 | joliet_level = 2; | 618 | joliet_level = 2; |
617 | } else if (sec->escape[2] == 0x45) { | 619 | else if (sec->escape[2] == 0x45) |
618 | joliet_level = 3; | 620 | joliet_level = 3; |
619 | } | 621 | |
620 | printk(KERN_DEBUG"ISO 9660 Extensions: Microsoft Joliet Level %d\n", | 622 | printk(KERN_DEBUG "ISO 9660 Extensions: " |
621 | joliet_level); | 623 | "Microsoft Joliet Level %d\n", |
624 | joliet_level); | ||
625 | } | ||
626 | goto root_found; | ||
627 | } else { | ||
628 | /* Unknown supplementary volume descriptor */ | ||
629 | sec = NULL; | ||
630 | } | ||
622 | } | 631 | } |
623 | goto root_found; | ||
624 | } else { | ||
625 | /* Unknown supplementary volume descriptor */ | ||
626 | sec = NULL; | ||
627 | } | ||
628 | } | ||
629 | #endif | 632 | #endif |
630 | } else { | 633 | } else { |
631 | if (strncmp (hdp->id, HS_STANDARD_ID, sizeof hdp->id) == 0) { | 634 | if (strncmp (hdp->id, HS_STANDARD_ID, sizeof hdp->id) == 0) { |
632 | if (isonum_711 (hdp->type) != ISO_VD_PRIMARY) | 635 | if (isonum_711(hdp->type) != ISO_VD_PRIMARY) |
633 | goto out_freebh; | 636 | goto out_freebh; |
634 | 637 | ||
635 | sbi->s_high_sierra = 1; | 638 | sbi->s_high_sierra = 1; |
636 | opt.rock = 'n'; | 639 | opt.rock = 'n'; |
637 | h_pri = (struct hs_primary_descriptor *)vdp; | 640 | h_pri = (struct hs_primary_descriptor *)vdp; |
638 | goto root_found; | 641 | goto root_found; |
642 | } | ||
639 | } | 643 | } |
640 | } | ||
641 | 644 | ||
642 | /* Just skip any volume descriptors we don't recognize */ | 645 | /* Just skip any volume descriptors we don't recognize */ |
643 | 646 | ||
644 | brelse(bh); | 647 | brelse(bh); |
645 | bh = NULL; | 648 | bh = NULL; |
646 | } | 649 | } |
647 | /* | 650 | /* |
648 | * If we fall through, either no volume descriptor was found, | 651 | * If we fall through, either no volume descriptor was found, |
@@ -657,24 +660,24 @@ static int isofs_fill_super(struct super_block *s, void *data, int silent) | |||
657 | root_found: | 660 | root_found: |
658 | 661 | ||
659 | if (joliet_level && (pri == NULL || opt.rock == 'n')) { | 662 | if (joliet_level && (pri == NULL || opt.rock == 'n')) { |
660 | /* This is the case of Joliet with the norock mount flag. | 663 | /* This is the case of Joliet with the norock mount flag. |
661 | * A disc with both Joliet and Rock Ridge is handled later | 664 | * A disc with both Joliet and Rock Ridge is handled later |
662 | */ | 665 | */ |
663 | pri = (struct iso_primary_descriptor *) sec; | 666 | pri = (struct iso_primary_descriptor *) sec; |
664 | } | 667 | } |
665 | 668 | ||
666 | if(sbi->s_high_sierra){ | 669 | if(sbi->s_high_sierra){ |
667 | rootp = (struct iso_directory_record *) h_pri->root_directory_record; | 670 | rootp = (struct iso_directory_record *) h_pri->root_directory_record; |
668 | sbi->s_nzones = isonum_733 (h_pri->volume_space_size); | 671 | sbi->s_nzones = isonum_733(h_pri->volume_space_size); |
669 | sbi->s_log_zone_size = isonum_723 (h_pri->logical_block_size); | 672 | sbi->s_log_zone_size = isonum_723(h_pri->logical_block_size); |
670 | sbi->s_max_size = isonum_733(h_pri->volume_space_size); | 673 | sbi->s_max_size = isonum_733(h_pri->volume_space_size); |
671 | } else { | 674 | } else { |
672 | if (!pri) | 675 | if (!pri) |
673 | goto out_freebh; | 676 | goto out_freebh; |
674 | rootp = (struct iso_directory_record *) pri->root_directory_record; | 677 | rootp = (struct iso_directory_record *) pri->root_directory_record; |
675 | sbi->s_nzones = isonum_733 (pri->volume_space_size); | 678 | sbi->s_nzones = isonum_733(pri->volume_space_size); |
676 | sbi->s_log_zone_size = isonum_723 (pri->logical_block_size); | 679 | 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_max_size = isonum_733(pri->volume_space_size); |
678 | } | 681 | } |
679 | 682 | ||
680 | sbi->s_ninodes = 0; /* No way to figure this out easily */ | 683 | sbi->s_ninodes = 0; /* No way to figure this out easily */ |
@@ -687,42 +690,43 @@ root_found: | |||
687 | * blocks that were 512 bytes (which should only very rarely | 690 | * blocks that were 512 bytes (which should only very rarely |
688 | * happen.) | 691 | * happen.) |
689 | */ | 692 | */ |
690 | if(orig_zonesize < opt.blocksize) | 693 | if (orig_zonesize < opt.blocksize) |
691 | goto out_bad_size; | 694 | goto out_bad_size; |
692 | 695 | ||
693 | /* RDE: convert log zone size to bit shift */ | 696 | /* RDE: convert log zone size to bit shift */ |
694 | switch (sbi->s_log_zone_size) | 697 | switch (sbi->s_log_zone_size) { |
695 | { case 512: sbi->s_log_zone_size = 9; break; | 698 | case 512: sbi->s_log_zone_size = 9; break; |
696 | case 1024: sbi->s_log_zone_size = 10; break; | 699 | case 1024: sbi->s_log_zone_size = 10; break; |
697 | case 2048: sbi->s_log_zone_size = 11; break; | 700 | case 2048: sbi->s_log_zone_size = 11; break; |
698 | 701 | ||
699 | default: | 702 | default: |
700 | goto out_bad_zone_size; | 703 | goto out_bad_zone_size; |
701 | } | 704 | } |
702 | 705 | ||
703 | s->s_magic = ISOFS_SUPER_MAGIC; | 706 | s->s_magic = ISOFS_SUPER_MAGIC; |
704 | s->s_maxbytes = 0xffffffff; /* We can handle files up to 4 GB */ | 707 | s->s_maxbytes = 0xffffffff; /* We can handle files up to 4 GB */ |
705 | 708 | ||
706 | /* The CDROM is read-only, has no nodes (devices) on it, and since | 709 | /* |
707 | all of the files appear to be owned by root, we really do not want | 710 | * The CDROM is read-only, has no nodes (devices) on it, and since |
708 | to allow suid. (suid or devices will not show up unless we have | 711 | * all of the files appear to be owned by root, we really do not want |
709 | Rock Ridge extensions) */ | 712 | * to allow suid. (suid or devices will not show up unless we have |
713 | * Rock Ridge extensions) | ||
714 | */ | ||
710 | 715 | ||
711 | s->s_flags |= MS_RDONLY /* | MS_NODEV | MS_NOSUID */; | 716 | s->s_flags |= MS_RDONLY /* | MS_NODEV | MS_NOSUID */; |
712 | 717 | ||
713 | /* Set this for reference. Its not currently used except on write | 718 | /* Set this for reference. Its not currently used except on write |
714 | which we don't have .. */ | 719 | which we don't have .. */ |
715 | 720 | ||
716 | first_data_zone = isonum_733 (rootp->extent) + | 721 | first_data_zone = isonum_733(rootp->extent) + |
717 | isonum_711 (rootp->ext_attr_length); | 722 | isonum_711(rootp->ext_attr_length); |
718 | sbi->s_firstdatazone = first_data_zone; | 723 | sbi->s_firstdatazone = first_data_zone; |
719 | #ifndef BEQUIET | 724 | #ifndef BEQUIET |
720 | printk(KERN_DEBUG "Max size:%ld Log zone size:%ld\n", | 725 | printk(KERN_DEBUG "ISOFS: Max size:%ld Log zone size:%ld\n", |
721 | sbi->s_max_size, | 726 | sbi->s_max_size, 1UL << sbi->s_log_zone_size); |
722 | 1UL << sbi->s_log_zone_size); | 727 | printk(KERN_DEBUG "ISOFS: First datazone:%ld\n", sbi->s_firstdatazone); |
723 | printk(KERN_DEBUG "First datazone:%ld\n", sbi->s_firstdatazone); | ||
724 | if(sbi->s_high_sierra) | 728 | if(sbi->s_high_sierra) |
725 | printk(KERN_DEBUG "Disc in High Sierra format.\n"); | 729 | printk(KERN_DEBUG "ISOFS: Disc in High Sierra format.\n"); |
726 | #endif | 730 | #endif |
727 | 731 | ||
728 | /* | 732 | /* |
@@ -737,8 +741,8 @@ root_found: | |||
737 | pri = (struct iso_primary_descriptor *) sec; | 741 | pri = (struct iso_primary_descriptor *) sec; |
738 | rootp = (struct iso_directory_record *) | 742 | rootp = (struct iso_directory_record *) |
739 | pri->root_directory_record; | 743 | pri->root_directory_record; |
740 | first_data_zone = isonum_733 (rootp->extent) + | 744 | first_data_zone = isonum_733(rootp->extent) + |
741 | isonum_711 (rootp->ext_attr_length); | 745 | isonum_711(rootp->ext_attr_length); |
742 | } | 746 | } |
743 | 747 | ||
744 | /* | 748 | /* |
@@ -771,7 +775,7 @@ root_found: | |||
771 | 775 | ||
772 | #ifdef CONFIG_JOLIET | 776 | #ifdef CONFIG_JOLIET |
773 | if (joliet_level && opt.utf8 == 0) { | 777 | if (joliet_level && opt.utf8 == 0) { |
774 | char * p = opt.iocharset ? opt.iocharset : CONFIG_NLS_DEFAULT; | 778 | char *p = opt.iocharset ? opt.iocharset : CONFIG_NLS_DEFAULT; |
775 | sbi->s_nls_iocharset = load_nls(p); | 779 | sbi->s_nls_iocharset = load_nls(p); |
776 | if (! sbi->s_nls_iocharset) { | 780 | if (! sbi->s_nls_iocharset) { |
777 | /* Fail only if explicit charset specified */ | 781 | /* Fail only if explicit charset specified */ |
@@ -821,7 +825,7 @@ root_found: | |||
821 | sbi->s_rock = 0; | 825 | sbi->s_rock = 0; |
822 | if (sbi->s_firstdatazone != first_data_zone) { | 826 | if (sbi->s_firstdatazone != first_data_zone) { |
823 | sbi->s_firstdatazone = first_data_zone; | 827 | sbi->s_firstdatazone = first_data_zone; |
824 | printk(KERN_DEBUG | 828 | printk(KERN_DEBUG |
825 | "ISOFS: changing to secondary root\n"); | 829 | "ISOFS: changing to secondary root\n"); |
826 | iput(inode); | 830 | iput(inode); |
827 | inode = isofs_iget(s, sbi->s_firstdatazone, 0); | 831 | inode = isofs_iget(s, sbi->s_firstdatazone, 0); |
@@ -830,8 +834,10 @@ root_found: | |||
830 | 834 | ||
831 | if (opt.check == 'u') { | 835 | if (opt.check == 'u') { |
832 | /* Only Joliet is case insensitive by default */ | 836 | /* Only Joliet is case insensitive by default */ |
833 | if (joliet_level) opt.check = 'r'; | 837 | if (joliet_level) |
834 | else opt.check = 's'; | 838 | opt.check = 'r'; |
839 | else | ||
840 | opt.check = 's'; | ||
835 | } | 841 | } |
836 | sbi->s_joliet_level = joliet_level; | 842 | sbi->s_joliet_level = joliet_level; |
837 | 843 | ||
@@ -846,8 +852,10 @@ root_found: | |||
846 | goto out_no_root; | 852 | goto out_no_root; |
847 | 853 | ||
848 | table = 0; | 854 | table = 0; |
849 | if (joliet_level) table += 2; | 855 | if (joliet_level) |
850 | if (opt.check == 'r') table++; | 856 | table += 2; |
857 | if (opt.check == 'r') | ||
858 | table++; | ||
851 | s->s_root->d_op = &isofs_dentry_ops[table]; | 859 | s->s_root->d_op = &isofs_dentry_ops[table]; |
852 | 860 | ||
853 | kfree(opt.iocharset); | 861 | kfree(opt.iocharset); |
@@ -858,10 +866,10 @@ root_found: | |||
858 | * Display error messages and free resources. | 866 | * Display error messages and free resources. |
859 | */ | 867 | */ |
860 | out_bad_root: | 868 | out_bad_root: |
861 | printk(KERN_WARNING "isofs_fill_super: root inode not initialized\n"); | 869 | printk(KERN_WARNING "%s: root inode not initialized\n", __func__); |
862 | goto out_iput; | 870 | goto out_iput; |
863 | out_no_root: | 871 | out_no_root: |
864 | printk(KERN_WARNING "isofs_fill_super: get root inode failed\n"); | 872 | printk(KERN_WARNING "%s: get root inode failed\n", __func__); |
865 | out_iput: | 873 | out_iput: |
866 | iput(inode); | 874 | iput(inode); |
867 | #ifdef CONFIG_JOLIET | 875 | #ifdef CONFIG_JOLIET |
@@ -870,21 +878,20 @@ out_iput: | |||
870 | #endif | 878 | #endif |
871 | goto out_freesbi; | 879 | goto out_freesbi; |
872 | out_no_read: | 880 | out_no_read: |
873 | printk(KERN_WARNING "isofs_fill_super: " | 881 | printk(KERN_WARNING "%s: bread failed, dev=%s, iso_blknum=%d, block=%d\n", |
874 | "bread failed, dev=%s, iso_blknum=%d, block=%d\n", | 882 | __func__, s->s_id, iso_blknum, block); |
875 | s->s_id, iso_blknum, block); | ||
876 | goto out_freesbi; | 883 | goto out_freesbi; |
877 | out_bad_zone_size: | 884 | out_bad_zone_size: |
878 | printk(KERN_WARNING "Bad logical zone size %ld\n", | 885 | printk(KERN_WARNING "ISOFS: Bad logical zone size %ld\n", |
879 | sbi->s_log_zone_size); | 886 | sbi->s_log_zone_size); |
880 | goto out_freebh; | 887 | goto out_freebh; |
881 | out_bad_size: | 888 | out_bad_size: |
882 | printk(KERN_WARNING "Logical zone size(%d) < hardware blocksize(%u)\n", | 889 | printk(KERN_WARNING "ISOFS: Logical zone size(%d) < hardware blocksize(%u)\n", |
883 | orig_zonesize, opt.blocksize); | 890 | orig_zonesize, opt.blocksize); |
884 | goto out_freebh; | 891 | goto out_freebh; |
885 | out_unknown_format: | 892 | out_unknown_format: |
886 | if (!silent) | 893 | if (!silent) |
887 | printk(KERN_WARNING "Unable to identify CD-ROM format.\n"); | 894 | printk(KERN_WARNING "ISOFS: Unable to identify CD-ROM format.\n"); |
888 | 895 | ||
889 | out_freebh: | 896 | out_freebh: |
890 | brelse(bh); | 897 | brelse(bh); |
@@ -902,7 +909,7 @@ static int isofs_statfs (struct dentry *dentry, struct kstatfs *buf) | |||
902 | buf->f_type = ISOFS_SUPER_MAGIC; | 909 | buf->f_type = ISOFS_SUPER_MAGIC; |
903 | buf->f_bsize = sb->s_blocksize; | 910 | buf->f_bsize = sb->s_blocksize; |
904 | buf->f_blocks = (ISOFS_SB(sb)->s_nzones | 911 | buf->f_blocks = (ISOFS_SB(sb)->s_nzones |
905 | << (ISOFS_SB(sb)->s_log_zone_size - sb->s_blocksize_bits)); | 912 | << (ISOFS_SB(sb)->s_log_zone_size - sb->s_blocksize_bits)); |
906 | buf->f_bfree = 0; | 913 | buf->f_bfree = 0; |
907 | buf->f_bavail = 0; | 914 | buf->f_bavail = 0; |
908 | buf->f_files = ISOFS_SB(sb)->s_ninodes; | 915 | buf->f_files = ISOFS_SB(sb)->s_ninodes; |
@@ -931,20 +938,20 @@ int isofs_get_blocks(struct inode *inode, sector_t iblock_s, | |||
931 | 938 | ||
932 | rv = 0; | 939 | rv = 0; |
933 | if (iblock < 0 || iblock != iblock_s) { | 940 | if (iblock < 0 || iblock != iblock_s) { |
934 | printk("isofs_get_blocks: block number too large\n"); | 941 | printk(KERN_DEBUG "%s: block number too large\n", __func__); |
935 | goto abort; | 942 | goto abort; |
936 | } | 943 | } |
937 | 944 | ||
938 | b_off = iblock; | 945 | b_off = iblock; |
939 | 946 | ||
940 | offset = 0; | 947 | offset = 0; |
941 | firstext = ei->i_first_extent; | 948 | firstext = ei->i_first_extent; |
942 | sect_size = ei->i_section_size >> ISOFS_BUFFER_BITS(inode); | 949 | sect_size = ei->i_section_size >> ISOFS_BUFFER_BITS(inode); |
943 | nextblk = ei->i_next_section_block; | 950 | nextblk = ei->i_next_section_block; |
944 | nextoff = ei->i_next_section_offset; | 951 | nextoff = ei->i_next_section_offset; |
945 | section = 0; | 952 | section = 0; |
946 | 953 | ||
947 | while ( nblocks ) { | 954 | while (nblocks) { |
948 | /* If we are *way* beyond the end of the file, print a message. | 955 | /* 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 | 956 | * 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. | 957 | * is normal, however because of the way the page cache works. |
@@ -953,11 +960,11 @@ int isofs_get_blocks(struct inode *inode, sector_t iblock_s, | |||
953 | * I/O errors. | 960 | * I/O errors. |
954 | */ | 961 | */ |
955 | if (b_off > ((inode->i_size + PAGE_CACHE_SIZE - 1) >> ISOFS_BUFFER_BITS(inode))) { | 962 | if (b_off > ((inode->i_size + PAGE_CACHE_SIZE - 1) >> ISOFS_BUFFER_BITS(inode))) { |
956 | printk("isofs_get_blocks: block >= EOF (%ld, %ld)\n", | 963 | printk(KERN_DEBUG "%s: block >= EOF (%ld, %ld)\n", |
957 | iblock, (unsigned long) inode->i_size); | 964 | __func__, iblock, (unsigned long) inode->i_size); |
958 | goto abort; | 965 | goto abort; |
959 | } | 966 | } |
960 | 967 | ||
961 | /* On the last section, nextblk == 0, section size is likely to | 968 | /* On the last section, nextblk == 0, section size is likely to |
962 | * exceed sect_size by a partial block, and access beyond the | 969 | * exceed sect_size by a partial block, and access beyond the |
963 | * end of the file will reach beyond the section size, too. | 970 | * end of the file will reach beyond the section size, too. |
@@ -976,20 +983,21 @@ int isofs_get_blocks(struct inode *inode, sector_t iblock_s, | |||
976 | iput(ninode); | 983 | iput(ninode); |
977 | 984 | ||
978 | if (++section > 100) { | 985 | if (++section > 100) { |
979 | printk("isofs_get_blocks: More than 100 file sections ?!?, aborting...\n"); | 986 | printk(KERN_DEBUG "%s: More than 100 file sections ?!?" |
980 | printk("isofs_get_blocks: block=%ld firstext=%u sect_size=%u " | 987 | " aborting...\n", __func__); |
981 | "nextblk=%lu nextoff=%lu\n", | 988 | printk(KERN_DEBUG "%s: block=%ld firstext=%u sect_size=%u " |
982 | iblock, firstext, (unsigned) sect_size, | 989 | "nextblk=%lu nextoff=%lu\n", __func__, |
983 | nextblk, nextoff); | 990 | iblock, firstext, (unsigned) sect_size, |
991 | nextblk, nextoff); | ||
984 | goto abort; | 992 | goto abort; |
985 | } | 993 | } |
986 | } | 994 | } |
987 | 995 | ||
988 | if ( *bh ) { | 996 | if (*bh) { |
989 | map_bh(*bh, inode->i_sb, firstext + b_off - offset); | 997 | map_bh(*bh, inode->i_sb, firstext + b_off - offset); |
990 | } else { | 998 | } else { |
991 | *bh = sb_getblk(inode->i_sb, firstext+b_off-offset); | 999 | *bh = sb_getblk(inode->i_sb, firstext+b_off-offset); |
992 | if ( !*bh ) | 1000 | if (!*bh) |
993 | goto abort; | 1001 | goto abort; |
994 | } | 1002 | } |
995 | bh++; /* Next buffer head */ | 1003 | bh++; /* Next buffer head */ |
@@ -1010,7 +1018,7 @@ static int isofs_get_block(struct inode *inode, sector_t iblock, | |||
1010 | struct buffer_head *bh_result, int create) | 1018 | struct buffer_head *bh_result, int create) |
1011 | { | 1019 | { |
1012 | if (create) { | 1020 | if (create) { |
1013 | printk("isofs_get_block: Kernel tries to allocate a block\n"); | 1021 | printk(KERN_DEBUG "%s: Kernel tries to allocate a block\n", __func__); |
1014 | return -EROFS; | 1022 | return -EROFS; |
1015 | } | 1023 | } |
1016 | 1024 | ||
@@ -1070,11 +1078,11 @@ static int isofs_read_level3_size(struct inode *inode) | |||
1070 | { | 1078 | { |
1071 | unsigned long bufsize = ISOFS_BUFFER_SIZE(inode); | 1079 | unsigned long bufsize = ISOFS_BUFFER_SIZE(inode); |
1072 | int high_sierra = ISOFS_SB(inode->i_sb)->s_high_sierra; | 1080 | int high_sierra = ISOFS_SB(inode->i_sb)->s_high_sierra; |
1073 | struct buffer_head * bh = NULL; | 1081 | struct buffer_head *bh = NULL; |
1074 | unsigned long block, offset, block_saved, offset_saved; | 1082 | unsigned long block, offset, block_saved, offset_saved; |
1075 | int i = 0; | 1083 | int i = 0; |
1076 | int more_entries = 0; | 1084 | int more_entries = 0; |
1077 | struct iso_directory_record * tmpde = NULL; | 1085 | struct iso_directory_record *tmpde = NULL; |
1078 | struct iso_inode_info *ei = ISOFS_I(inode); | 1086 | struct iso_inode_info *ei = ISOFS_I(inode); |
1079 | 1087 | ||
1080 | inode->i_size = 0; | 1088 | inode->i_size = 0; |
@@ -1089,7 +1097,7 @@ static int isofs_read_level3_size(struct inode *inode) | |||
1089 | offset = ei->i_iget5_offset; | 1097 | offset = ei->i_iget5_offset; |
1090 | 1098 | ||
1091 | do { | 1099 | do { |
1092 | struct iso_directory_record * de; | 1100 | struct iso_directory_record *de; |
1093 | unsigned int de_len; | 1101 | unsigned int de_len; |
1094 | 1102 | ||
1095 | if (!bh) { | 1103 | if (!bh) { |
@@ -1163,10 +1171,9 @@ out_noread: | |||
1163 | return -EIO; | 1171 | return -EIO; |
1164 | 1172 | ||
1165 | out_toomany: | 1173 | out_toomany: |
1166 | printk(KERN_INFO "isofs_read_level3_size: " | 1174 | printk(KERN_INFO "%s: More than 100 file sections ?!?, aborting...\n" |
1167 | "More than 100 file sections ?!?, aborting...\n" | 1175 | "isofs_read_level3_size: inode=%lu\n", |
1168 | "isofs_read_level3_size: inode=%lu\n", | 1176 | __func__, inode->i_ino); |
1169 | inode->i_ino); | ||
1170 | goto out; | 1177 | goto out; |
1171 | } | 1178 | } |
1172 | 1179 | ||
@@ -1177,9 +1184,9 @@ static void isofs_read_inode(struct inode *inode) | |||
1177 | unsigned long bufsize = ISOFS_BUFFER_SIZE(inode); | 1184 | unsigned long bufsize = ISOFS_BUFFER_SIZE(inode); |
1178 | unsigned long block; | 1185 | unsigned long block; |
1179 | int high_sierra = sbi->s_high_sierra; | 1186 | int high_sierra = sbi->s_high_sierra; |
1180 | struct buffer_head * bh = NULL; | 1187 | struct buffer_head *bh = NULL; |
1181 | struct iso_directory_record * de; | 1188 | struct iso_directory_record *de; |
1182 | struct iso_directory_record * tmpde = NULL; | 1189 | struct iso_directory_record *tmpde = NULL; |
1183 | unsigned int de_len; | 1190 | unsigned int de_len; |
1184 | unsigned long offset; | 1191 | unsigned long offset; |
1185 | struct iso_inode_info *ei = ISOFS_I(inode); | 1192 | struct iso_inode_info *ei = ISOFS_I(inode); |
@@ -1199,7 +1206,7 @@ static void isofs_read_inode(struct inode *inode) | |||
1199 | 1206 | ||
1200 | tmpde = kmalloc(de_len, GFP_KERNEL); | 1207 | tmpde = kmalloc(de_len, GFP_KERNEL); |
1201 | if (tmpde == NULL) { | 1208 | if (tmpde == NULL) { |
1202 | printk(KERN_INFO "isofs_read_inode: out of memory\n"); | 1209 | printk(KERN_INFO "%s: out of memory\n", __func__); |
1203 | goto fail; | 1210 | goto fail; |
1204 | } | 1211 | } |
1205 | memcpy(tmpde, bh->b_data + offset, frag1); | 1212 | memcpy(tmpde, bh->b_data + offset, frag1); |
@@ -1212,24 +1219,26 @@ static void isofs_read_inode(struct inode *inode) | |||
1212 | } | 1219 | } |
1213 | 1220 | ||
1214 | inode->i_ino = isofs_get_ino(ei->i_iget5_block, | 1221 | inode->i_ino = isofs_get_ino(ei->i_iget5_block, |
1215 | ei->i_iget5_offset, | 1222 | ei->i_iget5_offset, |
1216 | ISOFS_BUFFER_BITS(inode)); | 1223 | ISOFS_BUFFER_BITS(inode)); |
1217 | 1224 | ||
1218 | /* Assume it is a normal-format file unless told otherwise */ | 1225 | /* Assume it is a normal-format file unless told otherwise */ |
1219 | ei->i_file_format = isofs_file_normal; | 1226 | ei->i_file_format = isofs_file_normal; |
1220 | 1227 | ||
1221 | if (de->flags[-high_sierra] & 2) { | 1228 | if (de->flags[-high_sierra] & 2) { |
1222 | inode->i_mode = S_IRUGO | S_IXUGO | S_IFDIR; | 1229 | inode->i_mode = S_IRUGO | S_IXUGO | S_IFDIR; |
1223 | inode->i_nlink = 1; /* Set to 1. We know there are 2, but | 1230 | inode->i_nlink = 1; /* |
1224 | the find utility tries to optimize | 1231 | * Set to 1. We know there are 2, but |
1225 | if it is 2, and it screws up. It is | 1232 | * the find utility tries to optimize |
1226 | easier to give 1 which tells find to | 1233 | * if it is 2, and it screws up. It is |
1227 | do it the hard way. */ | 1234 | * easier to give 1 which tells find to |
1235 | * do it the hard way. | ||
1236 | */ | ||
1228 | } else { | 1237 | } else { |
1229 | /* Everybody gets to read the file. */ | 1238 | /* Everybody gets to read the file. */ |
1230 | inode->i_mode = sbi->s_mode; | 1239 | inode->i_mode = sbi->s_mode; |
1231 | inode->i_nlink = 1; | 1240 | inode->i_nlink = 1; |
1232 | inode->i_mode |= S_IFREG; | 1241 | inode->i_mode |= S_IFREG; |
1233 | } | 1242 | } |
1234 | inode->i_uid = sbi->s_uid; | 1243 | inode->i_uid = sbi->s_uid; |
1235 | inode->i_gid = sbi->s_gid; | 1244 | inode->i_gid = sbi->s_gid; |
@@ -1239,13 +1248,14 @@ static void isofs_read_inode(struct inode *inode) | |||
1239 | ei->i_format_parm[1] = 0; | 1248 | ei->i_format_parm[1] = 0; |
1240 | ei->i_format_parm[2] = 0; | 1249 | ei->i_format_parm[2] = 0; |
1241 | 1250 | ||
1242 | ei->i_section_size = isonum_733 (de->size); | 1251 | ei->i_section_size = isonum_733(de->size); |
1243 | if (de->flags[-high_sierra] & 0x80) { | 1252 | if (de->flags[-high_sierra] & 0x80) { |
1244 | if(isofs_read_level3_size(inode)) goto fail; | 1253 | if(isofs_read_level3_size(inode)) |
1254 | goto fail; | ||
1245 | } else { | 1255 | } else { |
1246 | ei->i_next_section_block = 0; | 1256 | ei->i_next_section_block = 0; |
1247 | ei->i_next_section_offset = 0; | 1257 | ei->i_next_section_offset = 0; |
1248 | inode->i_size = isonum_733 (de->size); | 1258 | inode->i_size = isonum_733(de->size); |
1249 | } | 1259 | } |
1250 | 1260 | ||
1251 | /* | 1261 | /* |
@@ -1258,23 +1268,24 @@ static void isofs_read_inode(struct inode *inode) | |||
1258 | inode->i_size &= 0x00ffffff; | 1268 | inode->i_size &= 0x00ffffff; |
1259 | 1269 | ||
1260 | if (de->interleave[0]) { | 1270 | if (de->interleave[0]) { |
1261 | printk("Interleaved files not (yet) supported.\n"); | 1271 | printk(KERN_DEBUG "ISOFS: Interleaved files not (yet) supported.\n"); |
1262 | inode->i_size = 0; | 1272 | inode->i_size = 0; |
1263 | } | 1273 | } |
1264 | 1274 | ||
1265 | /* I have no idea what file_unit_size is used for, so | 1275 | /* I have no idea what file_unit_size is used for, so |
1266 | we will flag it for now */ | 1276 | we will flag it for now */ |
1267 | if (de->file_unit_size[0] != 0) { | 1277 | if (de->file_unit_size[0] != 0) { |
1268 | printk("File unit size != 0 for ISO file (%ld).\n", | 1278 | printk(KERN_DEBUG "ISOFS: File unit size != 0 for ISO file (%ld).\n", |
1269 | inode->i_ino); | 1279 | inode->i_ino); |
1270 | } | 1280 | } |
1271 | 1281 | ||
1272 | /* I have no idea what other flag bits are used for, so | 1282 | /* I have no idea what other flag bits are used for, so |
1273 | we will flag it for now */ | 1283 | we will flag it for now */ |
1274 | #ifdef DEBUG | 1284 | #ifdef DEBUG |
1275 | if((de->flags[-high_sierra] & ~2)!= 0){ | 1285 | if((de->flags[-high_sierra] & ~2)!= 0){ |
1276 | printk("Unusual flag settings for ISO file (%ld %x).\n", | 1286 | printk(KERN_DEBUG "ISOFS: Unusual flag settings for ISO file " |
1277 | inode->i_ino, de->flags[-high_sierra]); | 1287 | "(%ld %x).\n", |
1288 | inode->i_ino, de->flags[-high_sierra]); | ||
1278 | } | 1289 | } |
1279 | #endif | 1290 | #endif |
1280 | 1291 | ||
@@ -1285,11 +1296,11 @@ static void isofs_read_inode(struct inode *inode) | |||
1285 | inode->i_atime.tv_nsec = | 1296 | inode->i_atime.tv_nsec = |
1286 | inode->i_ctime.tv_nsec = 0; | 1297 | inode->i_ctime.tv_nsec = 0; |
1287 | 1298 | ||
1288 | ei->i_first_extent = (isonum_733 (de->extent) + | 1299 | ei->i_first_extent = (isonum_733(de->extent) + |
1289 | isonum_711 (de->ext_attr_length)); | 1300 | isonum_711(de->ext_attr_length)); |
1290 | 1301 | ||
1291 | /* Set the number of blocks for stat() - should be done before RR */ | 1302 | /* Set the number of blocks for stat() - should be done before RR */ |
1292 | inode->i_blocks = (inode->i_size + 511) >> 9; | 1303 | inode->i_blocks = (inode->i_size + 511) >> 9; |
1293 | 1304 | ||
1294 | /* | 1305 | /* |
1295 | * Now test for possible Rock Ridge extensions which will override | 1306 | * Now test for possible Rock Ridge extensions which will override |
@@ -1306,7 +1317,7 @@ static void isofs_read_inode(struct inode *inode) | |||
1306 | /* Install the inode operations vector */ | 1317 | /* Install the inode operations vector */ |
1307 | if (S_ISREG(inode->i_mode)) { | 1318 | if (S_ISREG(inode->i_mode)) { |
1308 | inode->i_fop = &generic_ro_fops; | 1319 | inode->i_fop = &generic_ro_fops; |
1309 | switch ( ei->i_file_format ) { | 1320 | switch (ei->i_file_format) { |
1310 | #ifdef CONFIG_ZISOFS | 1321 | #ifdef CONFIG_ZISOFS |
1311 | case isofs_file_compressed: | 1322 | case isofs_file_compressed: |
1312 | inode->i_data.a_ops = &zisofs_aops; | 1323 | inode->i_data.a_ops = &zisofs_aops; |
@@ -1350,7 +1361,7 @@ static int isofs_iget5_test(struct inode *ino, void *data) | |||
1350 | struct isofs_iget5_callback_data *d = | 1361 | struct isofs_iget5_callback_data *d = |
1351 | (struct isofs_iget5_callback_data*)data; | 1362 | (struct isofs_iget5_callback_data*)data; |
1352 | return (i->i_iget5_block == d->block) | 1363 | return (i->i_iget5_block == d->block) |
1353 | && (i->i_iget5_offset == d->offset); | 1364 | && (i->i_iget5_offset == d->offset); |
1354 | } | 1365 | } |
1355 | 1366 | ||
1356 | static int isofs_iget5_set(struct inode *ino, void *data) | 1367 | static int isofs_iget5_set(struct inode *ino, void *data) |
@@ -1384,7 +1395,7 @@ struct inode *isofs_iget(struct super_block *sb, | |||
1384 | hashval = (block << sb->s_blocksize_bits) | offset; | 1395 | hashval = (block << sb->s_blocksize_bits) | offset; |
1385 | 1396 | ||
1386 | inode = iget5_locked(sb, hashval, &isofs_iget5_test, | 1397 | inode = iget5_locked(sb, hashval, &isofs_iget5_test, |
1387 | &isofs_iget5_set, &data); | 1398 | &isofs_iget5_set, &data); |
1388 | 1399 | ||
1389 | if (inode && (inode->i_state & I_NEW)) { | 1400 | if (inode && (inode->i_state & I_NEW)) { |
1390 | sb->s_op->read_inode(inode); | 1401 | sb->s_op->read_inode(inode); |
@@ -1398,7 +1409,7 @@ static int isofs_get_sb(struct file_system_type *fs_type, | |||
1398 | int flags, const char *dev_name, void *data, struct vfsmount *mnt) | 1409 | int flags, const char *dev_name, void *data, struct vfsmount *mnt) |
1399 | { | 1410 | { |
1400 | return get_sb_bdev(fs_type, flags, dev_name, data, isofs_fill_super, | 1411 | return get_sb_bdev(fs_type, flags, dev_name, data, isofs_fill_super, |
1401 | mnt); | 1412 | mnt); |
1402 | } | 1413 | } |
1403 | 1414 | ||
1404 | static struct file_system_type iso9660_fs_type = { | 1415 | static struct file_system_type iso9660_fs_type = { |
diff --git a/fs/isofs/joliet.c b/fs/isofs/joliet.c index fb8fe7a9ddc6..92c14b850e9c 100644 --- a/fs/isofs/joliet.c +++ b/fs/isofs/joliet.c | |||
@@ -80,22 +80,20 @@ get_joliet_filename(struct iso_directory_record * de, unsigned char *outname, st | |||
80 | 80 | ||
81 | if (utf8) { | 81 | if (utf8) { |
82 | len = wcsntombs_be(outname, de->name, | 82 | len = wcsntombs_be(outname, de->name, |
83 | de->name_len[0] >> 1, PAGE_SIZE); | 83 | de->name_len[0] >> 1, PAGE_SIZE); |
84 | } else { | 84 | } else { |
85 | len = uni16_to_x8(outname, (__be16 *) de->name, | 85 | len = uni16_to_x8(outname, (__be16 *) de->name, |
86 | de->name_len[0] >> 1, nls); | 86 | de->name_len[0] >> 1, nls); |
87 | } | 87 | } |
88 | if ((len > 2) && (outname[len-2] == ';') && (outname[len-1] == '1')) { | 88 | if ((len > 2) && (outname[len-2] == ';') && (outname[len-1] == '1')) |
89 | len -= 2; | 89 | len -= 2; |
90 | } | ||
91 | 90 | ||
92 | /* | 91 | /* |
93 | * Windows doesn't like periods at the end of a name, | 92 | * Windows doesn't like periods at the end of a name, |
94 | * so neither do we | 93 | * so neither do we |
95 | */ | 94 | */ |
96 | while (len >= 2 && (outname[len-1] == '.')) { | 95 | while (len >= 2 && (outname[len-1] == '.')) |
97 | len--; | 96 | len--; |
98 | } | ||
99 | 97 | ||
100 | return len; | 98 | return len; |
101 | } | 99 | } |
diff --git a/fs/isofs/namei.c b/fs/isofs/namei.c index c04b3a14a3e9..c8c7e5138a01 100644 --- a/fs/isofs/namei.c +++ b/fs/isofs/namei.c | |||
@@ -15,7 +15,7 @@ | |||
15 | * some sanity tests. | 15 | * some sanity tests. |
16 | */ | 16 | */ |
17 | static int | 17 | static int |
18 | isofs_cmp(struct dentry * dentry, const char * compare, int dlen) | 18 | isofs_cmp(struct dentry *dentry, const char *compare, int dlen) |
19 | { | 19 | { |
20 | struct qstr qstr; | 20 | struct qstr qstr; |
21 | 21 | ||
@@ -48,24 +48,24 @@ isofs_cmp(struct dentry * dentry, const char * compare, int dlen) | |||
48 | */ | 48 | */ |
49 | static unsigned long | 49 | static unsigned long |
50 | isofs_find_entry(struct inode *dir, struct dentry *dentry, | 50 | isofs_find_entry(struct inode *dir, struct dentry *dentry, |
51 | unsigned long *block_rv, unsigned long* offset_rv, | 51 | unsigned long *block_rv, unsigned long *offset_rv, |
52 | char * tmpname, struct iso_directory_record * tmpde) | 52 | char *tmpname, struct iso_directory_record *tmpde) |
53 | { | 53 | { |
54 | unsigned long bufsize = ISOFS_BUFFER_SIZE(dir); | 54 | unsigned long bufsize = ISOFS_BUFFER_SIZE(dir); |
55 | unsigned char bufbits = ISOFS_BUFFER_BITS(dir); | 55 | unsigned char bufbits = ISOFS_BUFFER_BITS(dir); |
56 | unsigned long block, f_pos, offset, block_saved, offset_saved; | 56 | unsigned long block, f_pos, offset, block_saved, offset_saved; |
57 | struct buffer_head * bh = NULL; | 57 | struct buffer_head *bh = NULL; |
58 | struct isofs_sb_info *sbi = ISOFS_SB(dir->i_sb); | 58 | struct isofs_sb_info *sbi = ISOFS_SB(dir->i_sb); |
59 | 59 | ||
60 | if (!ISOFS_I(dir)->i_first_extent) | 60 | if (!ISOFS_I(dir)->i_first_extent) |
61 | return 0; | 61 | return 0; |
62 | 62 | ||
63 | f_pos = 0; | 63 | f_pos = 0; |
64 | offset = 0; | 64 | offset = 0; |
65 | block = 0; | 65 | block = 0; |
66 | 66 | ||
67 | while (f_pos < dir->i_size) { | 67 | while (f_pos < dir->i_size) { |
68 | struct iso_directory_record * de; | 68 | struct iso_directory_record *de; |
69 | int de_len, match, i, dlen; | 69 | int de_len, match, i, dlen; |
70 | char *dpnt; | 70 | char *dpnt; |
71 | 71 | ||
@@ -114,7 +114,7 @@ isofs_find_entry(struct inode *dir, struct dentry *dentry, | |||
114 | 114 | ||
115 | if (sbi->s_rock && | 115 | if (sbi->s_rock && |
116 | ((i = get_rock_ridge_filename(de, tmpname, dir)))) { | 116 | ((i = get_rock_ridge_filename(de, tmpname, dir)))) { |
117 | dlen = i; /* possibly -1 */ | 117 | dlen = i; /* possibly -1 */ |
118 | dpnt = tmpname; | 118 | dpnt = tmpname; |
119 | #ifdef CONFIG_JOLIET | 119 | #ifdef CONFIG_JOLIET |
120 | } else if (sbi->s_joliet_level) { | 120 | } else if (sbi->s_joliet_level) { |
@@ -145,8 +145,8 @@ isofs_find_entry(struct inode *dir, struct dentry *dentry, | |||
145 | isofs_normalize_block_and_offset(de, | 145 | isofs_normalize_block_and_offset(de, |
146 | &block_saved, | 146 | &block_saved, |
147 | &offset_saved); | 147 | &offset_saved); |
148 | *block_rv = block_saved; | 148 | *block_rv = block_saved; |
149 | *offset_rv = offset_saved; | 149 | *offset_rv = offset_saved; |
150 | brelse(bh); | 150 | brelse(bh); |
151 | return 1; | 151 | return 1; |
152 | } | 152 | } |
@@ -155,7 +155,7 @@ isofs_find_entry(struct inode *dir, struct dentry *dentry, | |||
155 | return 0; | 155 | return 0; |
156 | } | 156 | } |
157 | 157 | ||
158 | struct dentry *isofs_lookup(struct inode * dir, struct dentry * dentry, struct nameidata *nd) | 158 | struct dentry *isofs_lookup(struct inode *dir, struct dentry *dentry, struct nameidata *nd) |
159 | { | 159 | { |
160 | int found; | 160 | int found; |
161 | unsigned long block, offset; | 161 | unsigned long block, offset; |
@@ -170,9 +170,9 @@ struct dentry *isofs_lookup(struct inode * dir, struct dentry * dentry, struct n | |||
170 | 170 | ||
171 | lock_kernel(); | 171 | lock_kernel(); |
172 | found = isofs_find_entry(dir, dentry, | 172 | found = isofs_find_entry(dir, dentry, |
173 | &block, &offset, | 173 | &block, &offset, |
174 | page_address(page), | 174 | page_address(page), |
175 | 1024 + page_address(page)); | 175 | 1024 + page_address(page)); |
176 | __free_page(page); | 176 | __free_page(page); |
177 | 177 | ||
178 | inode = NULL; | 178 | inode = NULL; |