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