1 /* 2 * super.c 3 * 4 * PURPOSE 5 * Super block routines for the OSTA-UDF(tm) filesystem. 6 * 7 * DESCRIPTION 8 * OSTA-UDF(tm) = Optical Storage Technology Association 9 * Universal Disk Format. 10 * 11 * This code is based on version 2.00 of the UDF specification, 12 * and revision 3 of the ECMA 167 standard [equivalent to ISO 13346]. 13 * http://www.osta.org/ 14 * http://www.ecma.ch/ 15 * http://www.iso.org/ 16 * 17 * COPYRIGHT 18 * This file is distributed under the terms of the GNU General Public 19 * License (GPL). Copies of the GPL can be obtained from: 20 * ftp://prep.ai.mit.edu/pub/gnu/GPL 21 * Each contributing author retains all rights to their own work. 22 * 23 * (C) 1998 Dave Boynton 24 * (C) 1998-2004 Ben Fennema 25 * (C) 2000 Stelias Computing Inc 26 * 27 * HISTORY 28 * 29 * 09/24/98 dgb changed to allow compiling outside of kernel, and 30 * added some debugging. 31 * 10/01/98 dgb updated to allow (some) possibility of compiling w/2.0.34 32 * 10/16/98 attempting some multi-session support 33 * 10/17/98 added freespace count for "df" 34 * 11/11/98 gr added novrs option 35 * 11/26/98 dgb added fileset,anchor mount options 36 * 12/06/98 blf really hosed things royally. vat/sparing support. sequenced vol descs 37 * rewrote option handling based on isofs 38 * 12/20/98 find the free space bitmap (if it exists) 39 */ 40 41 #include "udfdecl.h" 42 43 #include <linux/config.h> 44 #include <linux/blkdev.h> 45 #include <linux/slab.h> 46 #include <linux/kernel.h> 47 #include <linux/module.h> 48 #include <linux/parser.h> 49 #include <linux/stat.h> 50 #include <linux/cdrom.h> 51 #include <linux/nls.h> 52 #include <linux/smp_lock.h> 53 #include <linux/buffer_head.h> 54 #include <linux/vfs.h> 55 #include <linux/vmalloc.h> 56 #include <asm/byteorder.h> 57 58 #include <linux/udf_fs.h> 59 #include "udf_sb.h" 60 #include "udf_i.h" 61 62 #include <linux/init.h> 63 #include <asm/uaccess.h> 64 65 #define VDS_POS_PRIMARY_VOL_DESC 0 66 #define VDS_POS_UNALLOC_SPACE_DESC 1 67 #define VDS_POS_LOGICAL_VOL_DESC 2 68 #define VDS_POS_PARTITION_DESC 3 69 #define VDS_POS_IMP_USE_VOL_DESC 4 70 #define VDS_POS_VOL_DESC_PTR 5 71 #define VDS_POS_TERMINATING_DESC 6 72 #define VDS_POS_LENGTH 7 73 74 static char error_buf[1024]; 75 76 /* These are the "meat" - everything else is stuffing */ 77 static int udf_fill_super(struct super_block *, void *, int); 78 static void udf_put_super(struct super_block *); 79 static void udf_write_super(struct super_block *); 80 static int udf_remount_fs(struct super_block *, int *, char *); 81 static int udf_check_valid(struct super_block *, int, int); 82 static int udf_vrs(struct super_block *sb, int silent); 83 static int udf_load_partition(struct super_block *, kernel_lb_addr *); 84 static int udf_load_logicalvol(struct super_block *, struct buffer_head *, kernel_lb_addr *); 85 static void udf_load_logicalvolint(struct super_block *, kernel_extent_ad); 86 static void udf_find_anchor(struct super_block *); 87 static int udf_find_fileset(struct super_block *, kernel_lb_addr *, kernel_lb_addr *); 88 static void udf_load_pvoldesc(struct super_block *, struct buffer_head *); 89 static void udf_load_fileset(struct super_block *, struct buffer_head *, kernel_lb_addr *); 90 static void udf_load_partdesc(struct super_block *, struct buffer_head *); 91 static void udf_open_lvid(struct super_block *); 92 static void udf_close_lvid(struct super_block *); 93 static unsigned int udf_count_free(struct super_block *); 94 static int udf_statfs(struct super_block *, struct kstatfs *); 95 96 /* UDF filesystem type */ 97 static struct super_block *udf_get_sb(struct file_system_type *fs_type, 98 int flags, const char *dev_name, void *data) 99 { 100 return get_sb_bdev(fs_type, flags, dev_name, data, udf_fill_super); 101 } 102 103 static struct file_system_type udf_fstype = { 104 .owner = THIS_MODULE, 105 .name = "udf", 106 .get_sb = udf_get_sb, 107 .kill_sb = kill_block_super, 108 .fs_flags = FS_REQUIRES_DEV, 109 }; 110 111 static kmem_cache_t * udf_inode_cachep; 112 113 static struct inode *udf_alloc_inode(struct super_block *sb) 114 { 115 struct udf_inode_info *ei; 116 ei = (struct udf_inode_info *)kmem_cache_alloc(udf_inode_cachep, SLAB_KERNEL); 117 if (!ei) 118 return NULL; 119 return &ei->vfs_inode; 120 } 121 122 static void udf_destroy_inode(struct inode *inode) 123 { 124 kmem_cache_free(udf_inode_cachep, UDF_I(inode)); 125 } 126 127 static void init_once(void * foo, kmem_cache_t * cachep, unsigned long flags) 128 { 129 struct udf_inode_info *ei = (struct udf_inode_info *) foo; 130 131 if ((flags & (SLAB_CTOR_VERIFY|SLAB_CTOR_CONSTRUCTOR)) == 132 SLAB_CTOR_CONSTRUCTOR) 133 { 134 ei->i_ext.i_data = NULL; 135 inode_init_once(&ei->vfs_inode); 136 } 137 } 138 139 static int init_inodecache(void) 140 { 141 udf_inode_cachep = kmem_cache_create("udf_inode_cache", 142 sizeof(struct udf_inode_info), 143 0, SLAB_RECLAIM_ACCOUNT, 144 init_once, NULL); 145 if (udf_inode_cachep == NULL) 146 return -ENOMEM; 147 return 0; 148 } 149 150 static void destroy_inodecache(void) 151 { 152 if (kmem_cache_destroy(udf_inode_cachep)) 153 printk(KERN_INFO "udf_inode_cache: not all structures were freed\n"); 154 } 155 156 /* Superblock operations */ 157 static struct super_operations udf_sb_ops = { 158 .alloc_inode = udf_alloc_inode, 159 .destroy_inode = udf_destroy_inode, 160 .write_inode = udf_write_inode, 161 .delete_inode = udf_delete_inode, 162 .clear_inode = udf_clear_inode, 163 .put_super = udf_put_super, 164 .write_super = udf_write_super, 165 .statfs = udf_statfs, 166 .remount_fs = udf_remount_fs, 167 }; 168 169 struct udf_options 170 { 171 unsigned char novrs; 172 unsigned int blocksize; 173 unsigned int session; 174 unsigned int lastblock; 175 unsigned int anchor; 176 unsigned int volume; 177 unsigned short partition; 178 unsigned int fileset; 179 unsigned int rootdir; 180 unsigned int flags; 181 mode_t umask; 182 gid_t gid; 183 uid_t uid; 184 struct nls_table *nls_map; 185 }; 186 187 static int __init init_udf_fs(void) 188 { 189 int err; 190 err = init_inodecache(); 191 if (err) 192 goto out1; 193 err = register_filesystem(&udf_fstype); 194 if (err) 195 goto out; 196 return 0; 197 out: 198 destroy_inodecache(); 199 out1: 200 return err; 201 } 202 203 static void __exit exit_udf_fs(void) 204 { 205 unregister_filesystem(&udf_fstype); 206 destroy_inodecache(); 207 } 208 209 module_init(init_udf_fs) 210 module_exit(exit_udf_fs) 211 212 /* 213 * udf_parse_options 214 * 215 * PURPOSE 216 * Parse mount options. 217 * 218 * DESCRIPTION 219 * The following mount options are supported: 220 * 221 * gid= Set the default group. 222 * umask= Set the default umask. 223 * uid= Set the default user. 224 * bs= Set the block size. 225 * unhide Show otherwise hidden files. 226 * undelete Show deleted files in lists. 227 * adinicb Embed data in the inode (default) 228 * noadinicb Don't embed data in the inode 229 * shortad Use short ad's 230 * longad Use long ad's (default) 231 * nostrict Unset strict conformance 232 * iocharset= Set the NLS character set 233 * 234 * The remaining are for debugging and disaster recovery: 235 * 236 * novrs Skip volume sequence recognition 237 * 238 * The following expect a offset from 0. 239 * 240 * session= Set the CDROM session (default= last session) 241 * anchor= Override standard anchor location. (default= 256) 242 * volume= Override the VolumeDesc location. (unused) 243 * partition= Override the PartitionDesc location. (unused) 244 * lastblock= Set the last block of the filesystem/ 245 * 246 * The following expect a offset from the partition root. 247 * 248 * fileset= Override the fileset block location. (unused) 249 * rootdir= Override the root directory location. (unused) 250 * WARNING: overriding the rootdir to a non-directory may 251 * yield highly unpredictable results. 252 * 253 * PRE-CONDITIONS 254 * options Pointer to mount options string. 255 * uopts Pointer to mount options variable. 256 * 257 * POST-CONDITIONS 258 * <return> 1 Mount options parsed okay. 259 * <return> 0 Error parsing mount options. 260 * 261 * HISTORY 262 * July 1, 1997 - Andrew E. Mileski 263 * Written, tested, and released. 264 */ 265 266 enum { 267 Opt_novrs, Opt_nostrict, Opt_bs, Opt_unhide, Opt_undelete, 268 Opt_noadinicb, Opt_adinicb, Opt_shortad, Opt_longad, 269 Opt_gid, Opt_uid, Opt_umask, Opt_session, Opt_lastblock, 270 Opt_anchor, Opt_volume, Opt_partition, Opt_fileset, 271 Opt_rootdir, Opt_utf8, Opt_iocharset, 272 Opt_err, Opt_uforget, Opt_uignore, Opt_gforget, Opt_gignore 273 }; 274 275 static match_table_t tokens = { 276 {Opt_novrs, "novrs"}, 277 {Opt_nostrict, "nostrict"}, 278 {Opt_bs, "bs=%u"}, 279 {Opt_unhide, "unhide"}, 280 {Opt_undelete, "undelete"}, 281 {Opt_noadinicb, "noadinicb"}, 282 {Opt_adinicb, "adinicb"}, 283 {Opt_shortad, "shortad"}, 284 {Opt_longad, "longad"}, 285 {Opt_uforget, "uid=forget"}, 286 {Opt_uignore, "uid=ignore"}, 287 {Opt_gforget, "gid=forget"}, 288 {Opt_gignore, "gid=ignore"}, 289 {Opt_gid, "gid=%u"}, 290 {Opt_uid, "uid=%u"}, 291 {Opt_umask, "umask=%o"}, 292 {Opt_session, "session=%u"}, 293 {Opt_lastblock, "lastblock=%u"}, 294 {Opt_anchor, "anchor=%u"}, 295 {Opt_volume, "volume=%u"}, 296 {Opt_partition, "partition=%u"}, 297 {Opt_fileset, "fileset=%u"}, 298 {Opt_rootdir, "rootdir=%u"}, 299 {Opt_utf8, "utf8"}, 300 {Opt_iocharset, "iocharset=%s"}, 301 {Opt_err, NULL} 302 }; 303 304 static int 305 udf_parse_options(char *options, struct udf_options *uopt) 306 { 307 char *p; 308 int option; 309 310 uopt->novrs = 0; 311 uopt->blocksize = 2048; 312 uopt->partition = 0xFFFF; 313 uopt->session = 0xFFFFFFFF; 314 uopt->lastblock = 0; 315 uopt->anchor = 0; 316 uopt->volume = 0xFFFFFFFF; 317 uopt->rootdir = 0xFFFFFFFF; 318 uopt->fileset = 0xFFFFFFFF; 319 uopt->nls_map = NULL; 320 321 if (!options) 322 return 1; 323 324 while ((p = strsep(&options, ",")) != NULL) 325 { 326 substring_t args[MAX_OPT_ARGS]; 327 int token; 328 if (!*p) 329 continue; 330 331 token = match_token(p, tokens, args); 332 switch (token) 333 { 334 case Opt_novrs: 335 uopt->novrs = 1; 336 case Opt_bs: 337 if (match_int(&args[0], &option)) 338 return 0; 339 uopt->blocksize = option; 340 break; 341 case Opt_unhide: 342 uopt->flags |= (1 << UDF_FLAG_UNHIDE); 343 break; 344 case Opt_undelete: 345 uopt->flags |= (1 << UDF_FLAG_UNDELETE); 346 break; 347 case Opt_noadinicb: 348 uopt->flags &= ~(1 << UDF_FLAG_USE_AD_IN_ICB); 349 break; 350 case Opt_adinicb: 351 uopt->flags |= (1 << UDF_FLAG_USE_AD_IN_ICB); 352 break; 353 case Opt_shortad: 354 uopt->flags |= (1 << UDF_FLAG_USE_SHORT_AD); 355 break; 356 case Opt_longad: 357 uopt->flags &= ~(1 << UDF_FLAG_USE_SHORT_AD); 358 break; 359 case Opt_gid: 360 if (match_int(args, &option)) 361 return 0; 362 uopt->gid = option; 363 break; 364 case Opt_uid: 365 if (match_int(args, &option)) 366 return 0; 367 uopt->uid = option; 368 break; 369 case Opt_umask: 370 if (match_octal(args, &option)) 371 return 0; 372 uopt->umask = option; 373 break; 374 case Opt_nostrict: 375 uopt->flags &= ~(1 << UDF_FLAG_STRICT); 376 break; 377 case Opt_session: 378 if (match_int(args, &option)) 379 return 0; 380 uopt->session = option; 381 break; 382 case Opt_lastblock: 383 if (match_int(args, &option)) 384 return 0; 385 uopt->lastblock = option; 386 break; 387 case Opt_anchor: 388 if (match_int(args, &option)) 389 return 0; 390 uopt->anchor = option; 391 break; 392 case Opt_volume: 393 if (match_int(args, &option)) 394 return 0; 395 uopt->volume = option; 396 break; 397 case Opt_partition: 398 if (match_int(args, &option)) 399 return 0; 400 uopt->partition = option; 401 break; 402 case Opt_fileset: 403 if (match_int(args, &option)) 404 return 0; 405 uopt->fileset = option; 406 break; 407 case Opt_rootdir: 408 if (match_int(args, &option)) 409 return 0; 410 uopt->rootdir = option; 411 break; 412 case Opt_utf8: 413 uopt->flags |= (1 << UDF_FLAG_UTF8); 414 break; 415 #ifdef CONFIG_UDF_NLS 416 case Opt_iocharset: 417 uopt->nls_map = load_nls(args[0].from); 418 uopt->flags |= (1 << UDF_FLAG_NLS_MAP); 419 break; 420 #endif 421 case Opt_uignore: 422 uopt->flags |= (1 << UDF_FLAG_UID_IGNORE); 423 break; 424 case Opt_uforget: 425 uopt->flags |= (1 << UDF_FLAG_UID_FORGET); 426 break; 427 case Opt_gignore: 428 uopt->flags |= (1 << UDF_FLAG_GID_IGNORE); 429 break; 430 case Opt_gforget: 431 uopt->flags |= (1 << UDF_FLAG_GID_FORGET); 432 break; 433 default: 434 printk(KERN_ERR "udf: bad mount option \"%s\" " 435 "or missing value\n", p); 436 return 0; 437 } 438 } 439 return 1; 440 } 441 442 void 443 udf_write_super(struct super_block *sb) 444 { 445 lock_kernel(); 446 if (!(sb->s_flags & MS_RDONLY)) 447 udf_open_lvid(sb); 448 sb->s_dirt = 0; 449 unlock_kernel(); 450 } 451 452 static int 453 udf_remount_fs(struct super_block *sb, int *flags, char *options) 454 { 455 struct udf_options uopt; 456 457 uopt.flags = UDF_SB(sb)->s_flags ; 458 uopt.uid = UDF_SB(sb)->s_uid ; 459 uopt.gid = UDF_SB(sb)->s_gid ; 460 uopt.umask = UDF_SB(sb)->s_umask ; 461 462 if ( !udf_parse_options(options, &uopt) ) 463 return -EINVAL; 464 465 UDF_SB(sb)->s_flags = uopt.flags; 466 UDF_SB(sb)->s_uid = uopt.uid; 467 UDF_SB(sb)->s_gid = uopt.gid; 468 UDF_SB(sb)->s_umask = uopt.umask; 469 470 if (UDF_SB_LVIDBH(sb)) { 471 int write_rev = le16_to_cpu(UDF_SB_LVIDIU(sb)->minUDFWriteRev); 472 if (write_rev > UDF_MAX_WRITE_VERSION) 473 *flags |= MS_RDONLY; 474 } 475 476 if ((*flags & MS_RDONLY) == (sb->s_flags & MS_RDONLY)) 477 return 0; 478 if (*flags & MS_RDONLY) 479 udf_close_lvid(sb); 480 else 481 udf_open_lvid(sb); 482 483 return 0; 484 } 485 486 /* 487 * udf_set_blocksize 488 * 489 * PURPOSE 490 * Set the block size to be used in all transfers. 491 * 492 * DESCRIPTION 493 * To allow room for a DMA transfer, it is best to guess big when unsure. 494 * This routine picks 2048 bytes as the blocksize when guessing. This 495 * should be adequate until devices with larger block sizes become common. 496 * 497 * Note that the Linux kernel can currently only deal with blocksizes of 498 * 512, 1024, 2048, 4096, and 8192 bytes. 499 * 500 * PRE-CONDITIONS 501 * sb Pointer to _locked_ superblock. 502 * 503 * POST-CONDITIONS 504 * sb->s_blocksize Blocksize. 505 * sb->s_blocksize_bits log2 of blocksize. 506 * <return> 0 Blocksize is valid. 507 * <return> 1 Blocksize is invalid. 508 * 509 * HISTORY 510 * July 1, 1997 - Andrew E. Mileski 511 * Written, tested, and released. 512 */ 513 static int 514 udf_set_blocksize(struct super_block *sb, int bsize) 515 { 516 if (!sb_min_blocksize(sb, bsize)) { 517 udf_debug("Bad block size (%d)\n", bsize); 518 printk(KERN_ERR "udf: bad block size (%d)\n", bsize); 519 return 0; 520 } 521 return sb->s_blocksize; 522 } 523 524 static int 525 udf_vrs(struct super_block *sb, int silent) 526 { 527 struct volStructDesc *vsd = NULL; 528 int sector = 32768; 529 int sectorsize; 530 struct buffer_head *bh = NULL; 531 int iso9660=0; 532 int nsr02=0; 533 int nsr03=0; 534 535 /* Block size must be a multiple of 512 */ 536 if (sb->s_blocksize & 511) 537 return 0; 538 539 if (sb->s_blocksize < sizeof(struct volStructDesc)) 540 sectorsize = sizeof(struct volStructDesc); 541 else 542 sectorsize = sb->s_blocksize; 543 544 sector += (UDF_SB_SESSION(sb) << sb->s_blocksize_bits); 545 546 udf_debug("Starting at sector %u (%ld byte sectors)\n", 547 (sector >> sb->s_blocksize_bits), sb->s_blocksize); 548 /* Process the sequence (if applicable) */ 549 for (;!nsr02 && !nsr03; sector += sectorsize) 550 { 551 /* Read a block */ 552 bh = udf_tread(sb, sector >> sb->s_blocksize_bits); 553 if (!bh) 554 break; 555 556 /* Look for ISO descriptors */ 557 vsd = (struct volStructDesc *)(bh->b_data + 558 (sector & (sb->s_blocksize - 1))); 559 560 if (vsd->stdIdent[0] == 0) 561 { 562 udf_release_data(bh); 563 break; 564 } 565 else if (!strncmp(vsd->stdIdent, VSD_STD_ID_CD001, VSD_STD_ID_LEN)) 566 { 567 iso9660 = sector; 568 switch (vsd->structType) 569 { 570 case 0: 571 udf_debug("ISO9660 Boot Record found\n"); 572 break; 573 case 1: 574 udf_debug("ISO9660 Primary Volume Descriptor found\n"); 575 break; 576 case 2: 577 udf_debug("ISO9660 Supplementary Volume Descriptor found\n"); 578 break; 579 case 3: 580 udf_debug("ISO9660 Volume Partition Descriptor found\n"); 581 break; 582 case 255: 583 udf_debug("ISO9660 Volume Descriptor Set Terminator found\n"); 584 break; 585 default: 586 udf_debug("ISO9660 VRS (%u) found\n", vsd->structType); 587 break; 588 } 589 } 590 else if (!strncmp(vsd->stdIdent, VSD_STD_ID_BEA01, VSD_STD_ID_LEN)) 591 { 592 } 593 else if (!strncmp(vsd->stdIdent, VSD_STD_ID_TEA01, VSD_STD_ID_LEN)) 594 { 595 udf_release_data(bh); 596 break; 597 } 598 else if (!strncmp(vsd->stdIdent, VSD_STD_ID_NSR02, VSD_STD_ID_LEN)) 599 { 600 nsr02 = sector; 601 } 602 else if (!strncmp(vsd->stdIdent, VSD_STD_ID_NSR03, VSD_STD_ID_LEN)) 603 { 604 nsr03 = sector; 605 } 606 udf_release_data(bh); 607 } 608 609 if (nsr03) 610 return nsr03; 611 else if (nsr02) 612 return nsr02; 613 else if (sector - (UDF_SB_SESSION(sb) << sb->s_blocksize_bits) == 32768) 614 return -1; 615 else 616 return 0; 617 } 618 619 /* 620 * udf_find_anchor 621 * 622 * PURPOSE 623 * Find an anchor volume descriptor. 624 * 625 * PRE-CONDITIONS 626 * sb Pointer to _locked_ superblock. 627 * lastblock Last block on media. 628 * 629 * POST-CONDITIONS 630 * <return> 1 if not found, 0 if ok 631 * 632 * HISTORY 633 * July 1, 1997 - Andrew E. Mileski 634 * Written, tested, and released. 635 */ 636 static void 637 udf_find_anchor(struct super_block *sb) 638 { 639 int lastblock = UDF_SB_LASTBLOCK(sb); 640 struct buffer_head *bh = NULL; 641 uint16_t ident; 642 uint32_t location; 643 int i; 644 645 if (lastblock) 646 { 647 int varlastblock = udf_variable_to_fixed(lastblock); 648 int last[] = { lastblock, lastblock - 2, 649 lastblock - 150, lastblock - 152, 650 varlastblock, varlastblock - 2, 651 varlastblock - 150, varlastblock - 152 }; 652 653 lastblock = 0; 654 655 /* Search for an anchor volume descriptor pointer */ 656 657 /* according to spec, anchor is in either: 658 * block 256 659 * lastblock-256 660 * lastblock 661 * however, if the disc isn't closed, it could be 512 */ 662 663 for (i=0; (!lastblock && i<sizeof(last)/sizeof(int)); i++) 664 { 665 if (last[i] < 0 || !(bh = sb_bread(sb, last[i]))) 666 { 667 ident = location = 0; 668 } 669 else 670 { 671 ident = le16_to_cpu(((tag *)bh->b_data)->tagIdent); 672 location = le32_to_cpu(((tag *)bh->b_data)->tagLocation); 673 udf_release_data(bh); 674 } 675 676 if (ident == TAG_IDENT_AVDP) 677 { 678 if (location == last[i] - UDF_SB_SESSION(sb)) 679 { 680 lastblock = UDF_SB_ANCHOR(sb)[0] = last[i] - UDF_SB_SESSION(sb); 681 UDF_SB_ANCHOR(sb)[1] = last[i] - 256 - UDF_SB_SESSION(sb); 682 } 683 else if (location == udf_variable_to_fixed(last[i]) - UDF_SB_SESSION(sb)) 684 { 685 UDF_SET_FLAG(sb, UDF_FLAG_VARCONV); 686 lastblock = UDF_SB_ANCHOR(sb)[0] = udf_variable_to_fixed(last[i]) - UDF_SB_SESSION(sb); 687 UDF_SB_ANCHOR(sb)[1] = lastblock - 256 - UDF_SB_SESSION(sb); 688 } 689 else 690 udf_debug("Anchor found at block %d, location mismatch %d.\n", 691 last[i], location); 692 } 693 else if (ident == TAG_IDENT_FE || ident == TAG_IDENT_EFE) 694 { 695 lastblock = last[i]; 696 UDF_SB_ANCHOR(sb)[3] = 512; 697 } 698 else 699 { 700 if (last[i] < 256 || !(bh = sb_bread(sb, last[i] - 256))) 701 { 702 ident = location = 0; 703 } 704 else 705 { 706 ident = le16_to_cpu(((tag *)bh->b_data)->tagIdent); 707 location = le32_to_cpu(((tag *)bh->b_data)->tagLocation); 708 udf_release_data(bh); 709 } 710 711 if (ident == TAG_IDENT_AVDP && 712 location == last[i] - 256 - UDF_SB_SESSION(sb)) 713 { 714 lastblock = last[i]; 715 UDF_SB_ANCHOR(sb)[1] = last[i] - 256; 716 } 717 else 718 { 719 if (last[i] < 312 + UDF_SB_SESSION(sb) || !(bh = sb_bread(sb, last[i] - 312 - UDF_SB_SESSION(sb)))) 720 { 721 ident = location = 0; 722 } 723 else 724 { 725 ident = le16_to_cpu(((tag *)bh->b_data)->tagIdent); 726 location = le32_to_cpu(((tag *)bh->b_data)->tagLocation); 727 udf_release_data(bh); 728 } 729 730 if (ident == TAG_IDENT_AVDP && 731 location == udf_variable_to_fixed(last[i]) - 256) 732 { 733 UDF_SET_FLAG(sb, UDF_FLAG_VARCONV); 734 lastblock = udf_variable_to_fixed(last[i]); 735 UDF_SB_ANCHOR(sb)[1] = lastblock - 256; 736 } 737 } 738 } 739 } 740 } 741 742 if (!lastblock) 743 { 744 /* We havn't found the lastblock. check 312 */ 745 if ((bh = sb_bread(sb, 312 + UDF_SB_SESSION(sb)))) 746 { 747 ident = le16_to_cpu(((tag *)bh->b_data)->tagIdent); 748 location = le32_to_cpu(((tag *)bh->b_data)->tagLocation); 749 udf_release_data(bh); 750 751 if (ident == TAG_IDENT_AVDP && location == 256) 752 UDF_SET_FLAG(sb, UDF_FLAG_VARCONV); 753 } 754 } 755 756 for (i=0; i<sizeof(UDF_SB_ANCHOR(sb))/sizeof(int); i++) 757 { 758 if (UDF_SB_ANCHOR(sb)[i]) 759 { 760 if (!(bh = udf_read_tagged(sb, 761 UDF_SB_ANCHOR(sb)[i], UDF_SB_ANCHOR(sb)[i], &ident))) 762 { 763 UDF_SB_ANCHOR(sb)[i] = 0; 764 } 765 else 766 { 767 udf_release_data(bh); 768 if ((ident != TAG_IDENT_AVDP) && (i || 769 (ident != TAG_IDENT_FE && ident != TAG_IDENT_EFE))) 770 { 771 UDF_SB_ANCHOR(sb)[i] = 0; 772 } 773 } 774 } 775 } 776 777 UDF_SB_LASTBLOCK(sb) = lastblock; 778 } 779 780 static int 781 udf_find_fileset(struct super_block *sb, kernel_lb_addr *fileset, kernel_lb_addr *root) 782 { 783 struct buffer_head *bh = NULL; 784 long lastblock; 785 uint16_t ident; 786 787 if (fileset->logicalBlockNum != 0xFFFFFFFF || 788 fileset->partitionReferenceNum != 0xFFFF) 789 { 790 bh = udf_read_ptagged(sb, *fileset, 0, &ident); 791 792 if (!bh) 793 return 1; 794 else if (ident != TAG_IDENT_FSD) 795 { 796 udf_release_data(bh); 797 return 1; 798 } 799 800 } 801 802 if (!bh) /* Search backwards through the partitions */ 803 { 804 kernel_lb_addr newfileset; 805 806 return 1; 807 808 for (newfileset.partitionReferenceNum=UDF_SB_NUMPARTS(sb)-1; 809 (newfileset.partitionReferenceNum != 0xFFFF && 810 fileset->logicalBlockNum == 0xFFFFFFFF && 811 fileset->partitionReferenceNum == 0xFFFF); 812 newfileset.partitionReferenceNum--) 813 { 814 lastblock = UDF_SB_PARTLEN(sb, newfileset.partitionReferenceNum); 815 newfileset.logicalBlockNum = 0; 816 817 do 818 { 819 bh = udf_read_ptagged(sb, newfileset, 0, &ident); 820 if (!bh) 821 { 822 newfileset.logicalBlockNum ++; 823 continue; 824 } 825 826 switch (ident) 827 { 828 case TAG_IDENT_SBD: 829 { 830 struct spaceBitmapDesc *sp; 831 sp = (struct spaceBitmapDesc *)bh->b_data; 832 newfileset.logicalBlockNum += 1 + 833 ((le32_to_cpu(sp->numOfBytes) + sizeof(struct spaceBitmapDesc) - 1) 834 >> sb->s_blocksize_bits); 835 udf_release_data(bh); 836 break; 837 } 838 case TAG_IDENT_FSD: 839 { 840 *fileset = newfileset; 841 break; 842 } 843 default: 844 { 845 newfileset.logicalBlockNum ++; 846 udf_release_data(bh); 847 bh = NULL; 848 break; 849 } 850 } 851 } 852 while (newfileset.logicalBlockNum < lastblock && 853 fileset->logicalBlockNum == 0xFFFFFFFF && 854 fileset->partitionReferenceNum == 0xFFFF); 855 } 856 } 857 858 if ((fileset->logicalBlockNum != 0xFFFFFFFF || 859 fileset->partitionReferenceNum != 0xFFFF) && bh) 860 { 861 udf_debug("Fileset at block=%d, partition=%d\n", 862 fileset->logicalBlockNum, fileset->partitionReferenceNum); 863 864 UDF_SB_PARTITION(sb) = fileset->partitionReferenceNum; 865 udf_load_fileset(sb, bh, root); 866 udf_release_data(bh); 867 return 0; 868 } 869 return 1; 870 } 871 872 static void 873 udf_load_pvoldesc(struct super_block *sb, struct buffer_head *bh) 874 { 875 struct primaryVolDesc *pvoldesc; 876 time_t recording; 877 long recording_usec; 878 struct ustr instr; 879 struct ustr outstr; 880 881 pvoldesc = (struct primaryVolDesc *)bh->b_data; 882 883 if ( udf_stamp_to_time(&recording, &recording_usec, 884 lets_to_cpu(pvoldesc->recordingDateAndTime)) ) 885 { 886 kernel_timestamp ts; 887 ts = lets_to_cpu(pvoldesc->recordingDateAndTime); 888 udf_debug("recording time %ld/%ld, %04u/%02u/%02u %02u:%02u (%x)\n", 889 recording, recording_usec, 890 ts.year, ts.month, ts.day, ts.hour, ts.minute, ts.typeAndTimezone); 891 UDF_SB_RECORDTIME(sb).tv_sec = recording; 892 UDF_SB_RECORDTIME(sb).tv_nsec = recording_usec * 1000; 893 } 894 895 if ( !udf_build_ustr(&instr, pvoldesc->volIdent, 32) ) 896 { 897 if (udf_CS0toUTF8(&outstr, &instr)) 898 { 899 strncpy( UDF_SB_VOLIDENT(sb), outstr.u_name, 900 outstr.u_len > 31 ? 31 : outstr.u_len); 901 udf_debug("volIdent[] = '%s'\n", UDF_SB_VOLIDENT(sb)); 902 } 903 } 904 905 if ( !udf_build_ustr(&instr, pvoldesc->volSetIdent, 128) ) 906 { 907 if (udf_CS0toUTF8(&outstr, &instr)) 908 udf_debug("volSetIdent[] = '%s'\n", outstr.u_name); 909 } 910 } 911 912 static void 913 udf_load_fileset(struct super_block *sb, struct buffer_head *bh, kernel_lb_addr *root) 914 { 915 struct fileSetDesc *fset; 916 917 fset = (struct fileSetDesc *)bh->b_data; 918 919 *root = lelb_to_cpu(fset->rootDirectoryICB.extLocation); 920 921 UDF_SB_SERIALNUM(sb) = le16_to_cpu(fset->descTag.tagSerialNum); 922 923 udf_debug("Rootdir at block=%d, partition=%d\n", 924 root->logicalBlockNum, root->partitionReferenceNum); 925 } 926 927 static void 928 udf_load_partdesc(struct super_block *sb, struct buffer_head *bh) 929 { 930 struct partitionDesc *p; 931 int i; 932 933 p = (struct partitionDesc *)bh->b_data; 934 935 for (i=0; i<UDF_SB_NUMPARTS(sb); i++) 936 { 937 udf_debug("Searching map: (%d == %d)\n", 938 UDF_SB_PARTMAPS(sb)[i].s_partition_num, le16_to_cpu(p->partitionNumber)); 939 if (UDF_SB_PARTMAPS(sb)[i].s_partition_num == le16_to_cpu(p->partitionNumber)) 940 { 941 UDF_SB_PARTLEN(sb,i) = le32_to_cpu(p->partitionLength); /* blocks */ 942 UDF_SB_PARTROOT(sb,i) = le32_to_cpu(p->partitionStartingLocation); 943 if (le32_to_cpu(p->accessType) == PD_ACCESS_TYPE_READ_ONLY) 944 UDF_SB_PARTFLAGS(sb,i) |= UDF_PART_FLAG_READ_ONLY; 945 if (le32_to_cpu(p->accessType) == PD_ACCESS_TYPE_WRITE_ONCE) 946 UDF_SB_PARTFLAGS(sb,i) |= UDF_PART_FLAG_WRITE_ONCE; 947 if (le32_to_cpu(p->accessType) == PD_ACCESS_TYPE_REWRITABLE) 948 UDF_SB_PARTFLAGS(sb,i) |= UDF_PART_FLAG_REWRITABLE; 949 if (le32_to_cpu(p->accessType) == PD_ACCESS_TYPE_OVERWRITABLE) 950 UDF_SB_PARTFLAGS(sb,i) |= UDF_PART_FLAG_OVERWRITABLE; 951 952 if (!strcmp(p->partitionContents.ident, PD_PARTITION_CONTENTS_NSR02) || 953 !strcmp(p->partitionContents.ident, PD_PARTITION_CONTENTS_NSR03)) 954 { 955 struct partitionHeaderDesc *phd; 956 957 phd = (struct partitionHeaderDesc *)(p->partitionContentsUse); 958 if (phd->unallocSpaceTable.extLength) 959 { 960 kernel_lb_addr loc = { le32_to_cpu(phd->unallocSpaceTable.extPosition), i }; 961 962 UDF_SB_PARTMAPS(sb)[i].s_uspace.s_table = 963 udf_iget(sb, loc); 964 UDF_SB_PARTFLAGS(sb,i) |= UDF_PART_FLAG_UNALLOC_TABLE; 965 udf_debug("unallocSpaceTable (part %d) @ %ld\n", 966 i, UDF_SB_PARTMAPS(sb)[i].s_uspace.s_table->i_ino); 967 } 968 if (phd->unallocSpaceBitmap.extLength) 969 { 970 UDF_SB_ALLOC_BITMAP(sb, i, s_uspace); 971 if (UDF_SB_PARTMAPS(sb)[i].s_uspace.s_bitmap != NULL) 972 { 973 UDF_SB_PARTMAPS(sb)[i].s_uspace.s_bitmap->s_extLength = 974 le32_to_cpu(phd->unallocSpaceBitmap.extLength); 975 UDF_SB_PARTMAPS(sb)[i].s_uspace.s_bitmap->s_extPosition = 976 le32_to_cpu(phd->unallocSpaceBitmap.extPosition); 977 UDF_SB_PARTFLAGS(sb,i) |= UDF_PART_FLAG_UNALLOC_BITMAP; 978 udf_debug("unallocSpaceBitmap (part %d) @ %d\n", 979 i, UDF_SB_PARTMAPS(sb)[i].s_uspace.s_bitmap->s_extPosition); 980 } 981 } 982 if (phd->partitionIntegrityTable.extLength) 983 udf_debug("partitionIntegrityTable (part %d)\n", i); 984 if (phd->freedSpaceTable.extLength) 985 { 986 kernel_lb_addr loc = { le32_to_cpu(phd->freedSpaceTable.extPosition), i }; 987 988 UDF_SB_PARTMAPS(sb)[i].s_fspace.s_table = 989 udf_iget(sb, loc); 990 UDF_SB_PARTFLAGS(sb,i) |= UDF_PART_FLAG_FREED_TABLE; 991 udf_debug("freedSpaceTable (part %d) @ %ld\n", 992 i, UDF_SB_PARTMAPS(sb)[i].s_fspace.s_table->i_ino); 993 } 994 if (phd->freedSpaceBitmap.extLength) 995 { 996 UDF_SB_ALLOC_BITMAP(sb, i, s_fspace); 997 if (UDF_SB_PARTMAPS(sb)[i].s_fspace.s_bitmap != NULL) 998 { 999 UDF_SB_PARTMAPS(sb)[i].s_fspace.s_bitmap->s_extLength = 1000 le32_to_cpu(phd->freedSpaceBitmap.extLength); 1001 UDF_SB_PARTMAPS(sb)[i].s_fspace.s_bitmap->s_extPosition = 1002 le32_to_cpu(phd->freedSpaceBitmap.extPosition); 1003 UDF_SB_PARTFLAGS(sb,i) |= UDF_PART_FLAG_FREED_BITMAP; 1004 udf_debug("freedSpaceBitmap (part %d) @ %d\n", 1005 i, UDF_SB_PARTMAPS(sb)[i].s_fspace.s_bitmap->s_extPosition); 1006 } 1007 } 1008 } 1009 break; 1010 } 1011 } 1012 if (i == UDF_SB_NUMPARTS(sb)) 1013 { 1014 udf_debug("Partition (%d) not found in partition map\n", le16_to_cpu(p->partitionNumber)); 1015 } 1016 else 1017 { 1018 udf_debug("Partition (%d:%d type %x) starts at physical %d, block length %d\n", 1019 le16_to_cpu(p->partitionNumber), i, UDF_SB_PARTTYPE(sb,i), 1020 UDF_SB_PARTROOT(sb,i), UDF_SB_PARTLEN(sb,i)); 1021 } 1022 } 1023 1024 static int 1025 udf_load_logicalvol(struct super_block *sb, struct buffer_head * bh, kernel_lb_addr *fileset) 1026 { 1027 struct logicalVolDesc *lvd; 1028 int i, j, offset; 1029 uint8_t type; 1030 1031 lvd = (struct logicalVolDesc *)bh->b_data; 1032 1033 UDF_SB_ALLOC_PARTMAPS(sb, le32_to_cpu(lvd->numPartitionMaps)); 1034 1035 for (i=0,offset=0; 1036 i<UDF_SB_NUMPARTS(sb) && offset<le32_to_cpu(lvd->mapTableLength); 1037 i++,offset+=((struct genericPartitionMap *)&(lvd->partitionMaps[offset]))->partitionMapLength) 1038 { 1039 type = ((struct genericPartitionMap *)&(lvd->partitionMaps[offset]))->partitionMapType; 1040 if (type == 1) 1041 { 1042 struct genericPartitionMap1 *gpm1 = (struct genericPartitionMap1 *)&(lvd->partitionMaps[offset]); 1043 UDF_SB_PARTTYPE(sb,i) = UDF_TYPE1_MAP15; 1044 UDF_SB_PARTVSN(sb,i) = le16_to_cpu(gpm1->volSeqNum); 1045 UDF_SB_PARTNUM(sb,i) = le16_to_cpu(gpm1->partitionNum); 1046 UDF_SB_PARTFUNC(sb,i) = NULL; 1047 } 1048 else if (type == 2) 1049 { 1050 struct udfPartitionMap2 *upm2 = (struct udfPartitionMap2 *)&(lvd->partitionMaps[offset]); 1051 if (!strncmp(upm2->partIdent.ident, UDF_ID_VIRTUAL, strlen(UDF_ID_VIRTUAL))) 1052 { 1053 if (le16_to_cpu(((__le16 *)upm2->partIdent.identSuffix)[0]) == 0x0150) 1054 { 1055 UDF_SB_PARTTYPE(sb,i) = UDF_VIRTUAL_MAP15; 1056 UDF_SB_PARTFUNC(sb,i) = udf_get_pblock_virt15; 1057 } 1058 else if (le16_to_cpu(((__le16 *)upm2->partIdent.identSuffix)[0]) == 0x0200) 1059 { 1060 UDF_SB_PARTTYPE(sb,i) = UDF_VIRTUAL_MAP20; 1061 UDF_SB_PARTFUNC(sb,i) = udf_get_pblock_virt20; 1062 } 1063 } 1064 else if (!strncmp(upm2->partIdent.ident, UDF_ID_SPARABLE, strlen(UDF_ID_SPARABLE))) 1065 { 1066 uint32_t loc; 1067 uint16_t ident; 1068 struct sparingTable *st; 1069 struct sparablePartitionMap *spm = (struct sparablePartitionMap *)&(lvd->partitionMaps[offset]); 1070 1071 UDF_SB_PARTTYPE(sb,i) = UDF_SPARABLE_MAP15; 1072 UDF_SB_TYPESPAR(sb,i).s_packet_len = le16_to_cpu(spm->packetLength); 1073 for (j=0; j<spm->numSparingTables; j++) 1074 { 1075 loc = le32_to_cpu(spm->locSparingTable[j]); 1076 UDF_SB_TYPESPAR(sb,i).s_spar_map[j] = 1077 udf_read_tagged(sb, loc, loc, &ident); 1078 if (UDF_SB_TYPESPAR(sb,i).s_spar_map[j] != NULL) 1079 { 1080 st = (struct sparingTable *)UDF_SB_TYPESPAR(sb,i).s_spar_map[j]->b_data; 1081 if (ident != 0 || 1082 strncmp(st->sparingIdent.ident, UDF_ID_SPARING, strlen(UDF_ID_SPARING))) 1083 { 1084 udf_release_data(UDF_SB_TYPESPAR(sb,i).s_spar_map[j]); 1085 UDF_SB_TYPESPAR(sb,i).s_spar_map[j] = NULL; 1086 } 1087 } 1088 } 1089 UDF_SB_PARTFUNC(sb,i) = udf_get_pblock_spar15; 1090 } 1091 else 1092 { 1093 udf_debug("Unknown ident: %s\n", upm2->partIdent.ident); 1094 continue; 1095 } 1096 UDF_SB_PARTVSN(sb,i) = le16_to_cpu(upm2->volSeqNum); 1097 UDF_SB_PARTNUM(sb,i) = le16_to_cpu(upm2->partitionNum); 1098 } 1099 udf_debug("Partition (%d:%d) type %d on volume %d\n", 1100 i, UDF_SB_PARTNUM(sb,i), type, UDF_SB_PARTVSN(sb,i)); 1101 } 1102 1103 if (fileset) 1104 { 1105 long_ad *la = (long_ad *)&(lvd->logicalVolContentsUse[0]); 1106 1107 *fileset = lelb_to_cpu(la->extLocation); 1108 udf_debug("FileSet found in LogicalVolDesc at block=%d, partition=%d\n", 1109 fileset->logicalBlockNum, 1110 fileset->partitionReferenceNum); 1111 } 1112 if (lvd->integritySeqExt.extLength) 1113 udf_load_logicalvolint(sb, leea_to_cpu(lvd->integritySeqExt)); 1114 return 0; 1115 } 1116 1117 /* 1118 * udf_load_logicalvolint 1119 * 1120 */ 1121 static void 1122 udf_load_logicalvolint(struct super_block *sb, kernel_extent_ad loc) 1123 { 1124 struct buffer_head *bh = NULL; 1125 uint16_t ident; 1126 1127 while (loc.extLength > 0 && 1128 (bh = udf_read_tagged(sb, loc.extLocation, 1129 loc.extLocation, &ident)) && 1130 ident == TAG_IDENT_LVID) 1131 { 1132 UDF_SB_LVIDBH(sb) = bh; 1133 1134 if (UDF_SB_LVID(sb)->nextIntegrityExt.extLength) 1135 udf_load_logicalvolint(sb, leea_to_cpu(UDF_SB_LVID(sb)->nextIntegrityExt)); 1136 1137 if (UDF_SB_LVIDBH(sb) != bh) 1138 udf_release_data(bh); 1139 loc.extLength -= sb->s_blocksize; 1140 loc.extLocation ++; 1141 } 1142 if (UDF_SB_LVIDBH(sb) != bh) 1143 udf_release_data(bh); 1144 } 1145 1146 /* 1147 * udf_process_sequence 1148 * 1149 * PURPOSE 1150 * Process a main/reserve volume descriptor sequence. 1151 * 1152 * PRE-CONDITIONS 1153 * sb Pointer to _locked_ superblock. 1154 * block First block of first extent of the sequence. 1155 * lastblock Lastblock of first extent of the sequence. 1156 * 1157 * HISTORY 1158 * July 1, 1997 - Andrew E. Mileski 1159 * Written, tested, and released. 1160 */ 1161 static int 1162 udf_process_sequence(struct super_block *sb, long block, long lastblock, kernel_lb_addr *fileset) 1163 { 1164 struct buffer_head *bh = NULL; 1165 struct udf_vds_record vds[VDS_POS_LENGTH]; 1166 struct generic_desc *gd; 1167 struct volDescPtr *vdp; 1168 int done=0; 1169 int i,j; 1170 uint32_t vdsn; 1171 uint16_t ident; 1172 long next_s = 0, next_e = 0; 1173 1174 memset(vds, 0, sizeof(struct udf_vds_record) * VDS_POS_LENGTH); 1175 1176 /* Read the main descriptor sequence */ 1177 for (;(!done && block <= lastblock); block++) 1178 { 1179 1180 bh = udf_read_tagged(sb, block, block, &ident); 1181 if (!bh) 1182 break; 1183 1184 /* Process each descriptor (ISO 13346 3/8.3-8.4) */ 1185 gd = (struct generic_desc *)bh->b_data; 1186 vdsn = le32_to_cpu(gd->volDescSeqNum); 1187 switch (ident) 1188 { 1189 case TAG_IDENT_PVD: /* ISO 13346 3/10.1 */ 1190 if (vdsn >= vds[VDS_POS_PRIMARY_VOL_DESC].volDescSeqNum) 1191 { 1192 vds[VDS_POS_PRIMARY_VOL_DESC].volDescSeqNum = vdsn; 1193 vds[VDS_POS_PRIMARY_VOL_DESC].block = block; 1194 } 1195 break; 1196 case TAG_IDENT_VDP: /* ISO 13346 3/10.3 */ 1197 if (vdsn >= vds[VDS_POS_VOL_DESC_PTR].volDescSeqNum) 1198 { 1199 vds[VDS_POS_VOL_DESC_PTR].volDescSeqNum = vdsn; 1200 vds[VDS_POS_VOL_DESC_PTR].block = block; 1201 1202 vdp = (struct volDescPtr *)bh->b_data; 1203 next_s = le32_to_cpu(vdp->nextVolDescSeqExt.extLocation); 1204 next_e = le32_to_cpu(vdp->nextVolDescSeqExt.extLength); 1205 next_e = next_e >> sb->s_blocksize_bits; 1206 next_e += next_s; 1207 } 1208 break; 1209 case TAG_IDENT_IUVD: /* ISO 13346 3/10.4 */ 1210 if (vdsn >= vds[VDS_POS_IMP_USE_VOL_DESC].volDescSeqNum) 1211 { 1212 vds[VDS_POS_IMP_USE_VOL_DESC].volDescSeqNum = vdsn; 1213 vds[VDS_POS_IMP_USE_VOL_DESC].block = block; 1214 } 1215 break; 1216 case TAG_IDENT_PD: /* ISO 13346 3/10.5 */ 1217 if (!vds[VDS_POS_PARTITION_DESC].block) 1218 vds[VDS_POS_PARTITION_DESC].block = block; 1219 break; 1220 case TAG_IDENT_LVD: /* ISO 13346 3/10.6 */ 1221 if (vdsn >= vds[VDS_POS_LOGICAL_VOL_DESC].volDescSeqNum) 1222 { 1223 vds[VDS_POS_LOGICAL_VOL_DESC].volDescSeqNum = vdsn; 1224 vds[VDS_POS_LOGICAL_VOL_DESC].block = block; 1225 } 1226 break; 1227 case TAG_IDENT_USD: /* ISO 13346 3/10.8 */ 1228 if (vdsn >= vds[VDS_POS_UNALLOC_SPACE_DESC].volDescSeqNum) 1229 { 1230 vds[VDS_POS_UNALLOC_SPACE_DESC].volDescSeqNum = vdsn; 1231 vds[VDS_POS_UNALLOC_SPACE_DESC].block = block; 1232 } 1233 break; 1234 case TAG_IDENT_TD: /* ISO 13346 3/10.9 */ 1235 vds[VDS_POS_TERMINATING_DESC].block = block; 1236 if (next_e) 1237 { 1238 block = next_s; 1239 lastblock = next_e; 1240 next_s = next_e = 0; 1241 } 1242 else 1243 done = 1; 1244 break; 1245 } 1246 udf_release_data(bh); 1247 } 1248 for (i=0; i<VDS_POS_LENGTH; i++) 1249 { 1250 if (vds[i].block) 1251 { 1252 bh = udf_read_tagged(sb, vds[i].block, vds[i].block, &ident); 1253 1254 if (i == VDS_POS_PRIMARY_VOL_DESC) 1255 udf_load_pvoldesc(sb, bh); 1256 else if (i == VDS_POS_LOGICAL_VOL_DESC) 1257 udf_load_logicalvol(sb, bh, fileset); 1258 else if (i == VDS_POS_PARTITION_DESC) 1259 { 1260 struct buffer_head *bh2 = NULL; 1261 udf_load_partdesc(sb, bh); 1262 for (j=vds[i].block+1; j<vds[VDS_POS_TERMINATING_DESC].block; j++) 1263 { 1264 bh2 = udf_read_tagged(sb, j, j, &ident); 1265 gd = (struct generic_desc *)bh2->b_data; 1266 if (ident == TAG_IDENT_PD) 1267 udf_load_partdesc(sb, bh2); 1268 udf_release_data(bh2); 1269 } 1270 } 1271 udf_release_data(bh); 1272 } 1273 } 1274 1275 return 0; 1276 } 1277 1278 /* 1279 * udf_check_valid() 1280 */ 1281 static int 1282 udf_check_valid(struct super_block *sb, int novrs, int silent) 1283 { 1284 long block; 1285 1286 if (novrs) 1287 { 1288 udf_debug("Validity check skipped because of novrs option\n"); 1289 return 0; 1290 } 1291 /* Check that it is NSR02 compliant */ 1292 /* Process any "CD-ROM Volume Descriptor Set" (ECMA 167 2/8.3.1) */ 1293 else if ((block = udf_vrs(sb, silent)) == -1) 1294 { 1295 udf_debug("Failed to read byte 32768. Assuming open disc. Skipping validity check\n"); 1296 if (!UDF_SB_LASTBLOCK(sb)) 1297 UDF_SB_LASTBLOCK(sb) = udf_get_last_block(sb); 1298 return 0; 1299 } 1300 else 1301 return !block; 1302 } 1303 1304 static int 1305 udf_load_partition(struct super_block *sb, kernel_lb_addr *fileset) 1306 { 1307 struct anchorVolDescPtr *anchor; 1308 uint16_t ident; 1309 struct buffer_head *bh; 1310 long main_s, main_e, reserve_s, reserve_e; 1311 int i, j; 1312 1313 if (!sb) 1314 return 1; 1315 1316 for (i=0; i<sizeof(UDF_SB_ANCHOR(sb))/sizeof(int); i++) 1317 { 1318 if (UDF_SB_ANCHOR(sb)[i] && (bh = udf_read_tagged(sb, 1319 UDF_SB_ANCHOR(sb)[i], UDF_SB_ANCHOR(sb)[i], &ident))) 1320 { 1321 anchor = (struct anchorVolDescPtr *)bh->b_data; 1322 1323 /* Locate the main sequence */ 1324 main_s = le32_to_cpu( anchor->mainVolDescSeqExt.extLocation ); 1325 main_e = le32_to_cpu( anchor->mainVolDescSeqExt.extLength ); 1326 main_e = main_e >> sb->s_blocksize_bits; 1327 main_e += main_s; 1328 1329 /* Locate the reserve sequence */ 1330 reserve_s = le32_to_cpu(anchor->reserveVolDescSeqExt.extLocation); 1331 reserve_e = le32_to_cpu(anchor->reserveVolDescSeqExt.extLength); 1332 reserve_e = reserve_e >> sb->s_blocksize_bits; 1333 reserve_e += reserve_s; 1334 1335 udf_release_data(bh); 1336 1337 /* Process the main & reserve sequences */ 1338 /* responsible for finding the PartitionDesc(s) */ 1339 if (!(udf_process_sequence(sb, main_s, main_e, fileset) && 1340 udf_process_sequence(sb, reserve_s, reserve_e, fileset))) 1341 { 1342 break; 1343 } 1344 } 1345 } 1346 1347 if (i == sizeof(UDF_SB_ANCHOR(sb))/sizeof(int)) 1348 { 1349 udf_debug("No Anchor block found\n"); 1350 return 1; 1351 } 1352 else 1353 udf_debug("Using anchor in block %d\n", UDF_SB_ANCHOR(sb)[i]); 1354 1355 for (i=0; i<UDF_SB_NUMPARTS(sb); i++) 1356 { 1357 switch UDF_SB_PARTTYPE(sb, i) 1358 { 1359 case UDF_VIRTUAL_MAP15: 1360 case UDF_VIRTUAL_MAP20: 1361 { 1362 kernel_lb_addr ino; 1363 1364 if (!UDF_SB_LASTBLOCK(sb)) 1365 { 1366 UDF_SB_LASTBLOCK(sb) = udf_get_last_block(sb); 1367 udf_find_anchor(sb); 1368 } 1369 1370 if (!UDF_SB_LASTBLOCK(sb)) 1371 { 1372 udf_debug("Unable to determine Lastblock (For Virtual Partition)\n"); 1373 return 1; 1374 } 1375 1376 for (j=0; j<UDF_SB_NUMPARTS(sb); j++) 1377 { 1378 if (j != i && 1379 UDF_SB_PARTVSN(sb,i) == UDF_SB_PARTVSN(sb,j) && 1380 UDF_SB_PARTNUM(sb,i) == UDF_SB_PARTNUM(sb,j)) 1381 { 1382 ino.partitionReferenceNum = j; 1383 ino.logicalBlockNum = UDF_SB_LASTBLOCK(sb) - 1384 UDF_SB_PARTROOT(sb,j); 1385 break; 1386 } 1387 } 1388 1389 if (j == UDF_SB_NUMPARTS(sb)) 1390 return 1; 1391 1392 if (!(UDF_SB_VAT(sb) = udf_iget(sb, ino))) 1393 return 1; 1394 1395 if (UDF_SB_PARTTYPE(sb,i) == UDF_VIRTUAL_MAP15) 1396 { 1397 UDF_SB_TYPEVIRT(sb,i).s_start_offset = udf_ext0_offset(UDF_SB_VAT(sb)); 1398 UDF_SB_TYPEVIRT(sb,i).s_num_entries = (UDF_SB_VAT(sb)->i_size - 36) >> 2; 1399 } 1400 else if (UDF_SB_PARTTYPE(sb,i) == UDF_VIRTUAL_MAP20) 1401 { 1402 struct buffer_head *bh = NULL; 1403 uint32_t pos; 1404 1405 pos = udf_block_map(UDF_SB_VAT(sb), 0); 1406 bh = sb_bread(sb, pos); 1407 UDF_SB_TYPEVIRT(sb,i).s_start_offset = 1408 le16_to_cpu(((struct virtualAllocationTable20 *)bh->b_data + udf_ext0_offset(UDF_SB_VAT(sb)))->lengthHeader) + 1409 udf_ext0_offset(UDF_SB_VAT(sb)); 1410 UDF_SB_TYPEVIRT(sb,i).s_num_entries = (UDF_SB_VAT(sb)->i_size - 1411 UDF_SB_TYPEVIRT(sb,i).s_start_offset) >> 2; 1412 udf_release_data(bh); 1413 } 1414 UDF_SB_PARTROOT(sb,i) = udf_get_pblock(sb, 0, i, 0); 1415 UDF_SB_PARTLEN(sb,i) = UDF_SB_PARTLEN(sb,ino.partitionReferenceNum); 1416 } 1417 } 1418 } 1419 return 0; 1420 } 1421 1422 static void udf_open_lvid(struct super_block *sb) 1423 { 1424 if (UDF_SB_LVIDBH(sb)) 1425 { 1426 int i; 1427 kernel_timestamp cpu_time; 1428 1429 UDF_SB_LVIDIU(sb)->impIdent.identSuffix[0] = UDF_OS_CLASS_UNIX; 1430 UDF_SB_LVIDIU(sb)->impIdent.identSuffix[1] = UDF_OS_ID_LINUX; 1431 if (udf_time_to_stamp(&cpu_time, CURRENT_TIME)) 1432 UDF_SB_LVID(sb)->recordingDateAndTime = cpu_to_lets(cpu_time); 1433 UDF_SB_LVID(sb)->integrityType = LVID_INTEGRITY_TYPE_OPEN; 1434 1435 UDF_SB_LVID(sb)->descTag.descCRC = 1436 cpu_to_le16(udf_crc((char *)UDF_SB_LVID(sb) + sizeof(tag), 1437 le16_to_cpu(UDF_SB_LVID(sb)->descTag.descCRCLength), 0)); 1438 1439 UDF_SB_LVID(sb)->descTag.tagChecksum = 0; 1440 for (i=0; i<16; i++) 1441 if (i != 4) 1442 UDF_SB_LVID(sb)->descTag.tagChecksum += 1443 ((uint8_t *)&(UDF_SB_LVID(sb)->descTag))[i]; 1444 1445 mark_buffer_dirty(UDF_SB_LVIDBH(sb)); 1446 } 1447 } 1448 1449 static void udf_close_lvid(struct super_block *sb) 1450 { 1451 if (UDF_SB_LVIDBH(sb) && 1452 UDF_SB_LVID(sb)->integrityType == LVID_INTEGRITY_TYPE_OPEN) 1453 { 1454 int i; 1455 kernel_timestamp cpu_time; 1456 1457 UDF_SB_LVIDIU(sb)->impIdent.identSuffix[0] = UDF_OS_CLASS_UNIX; 1458 UDF_SB_LVIDIU(sb)->impIdent.identSuffix[1] = UDF_OS_ID_LINUX; 1459 if (udf_time_to_stamp(&cpu_time, CURRENT_TIME)) 1460 UDF_SB_LVID(sb)->recordingDateAndTime = cpu_to_lets(cpu_time); 1461 if (UDF_MAX_WRITE_VERSION > le16_to_cpu(UDF_SB_LVIDIU(sb)->maxUDFWriteRev)) 1462 UDF_SB_LVIDIU(sb)->maxUDFWriteRev = cpu_to_le16(UDF_MAX_WRITE_VERSION); 1463 if (UDF_SB_UDFREV(sb) > le16_to_cpu(UDF_SB_LVIDIU(sb)->minUDFReadRev)) 1464 UDF_SB_LVIDIU(sb)->minUDFReadRev = cpu_to_le16(UDF_SB_UDFREV(sb)); 1465 if (UDF_SB_UDFREV(sb) > le16_to_cpu(UDF_SB_LVIDIU(sb)->minUDFWriteRev)) 1466 UDF_SB_LVIDIU(sb)->minUDFWriteRev = cpu_to_le16(UDF_SB_UDFREV(sb)); 1467 UDF_SB_LVID(sb)->integrityType = cpu_to_le32(LVID_INTEGRITY_TYPE_CLOSE); 1468 1469 UDF_SB_LVID(sb)->descTag.descCRC = 1470 cpu_to_le16(udf_crc((char *)UDF_SB_LVID(sb) + sizeof(tag), 1471 le16_to_cpu(UDF_SB_LVID(sb)->descTag.descCRCLength), 0)); 1472 1473 UDF_SB_LVID(sb)->descTag.tagChecksum = 0; 1474 for (i=0; i<16; i++) 1475 if (i != 4) 1476 UDF_SB_LVID(sb)->descTag.tagChecksum += 1477 ((uint8_t *)&(UDF_SB_LVID(sb)->descTag))[i]; 1478 1479 mark_buffer_dirty(UDF_SB_LVIDBH(sb)); 1480 } 1481 } 1482 1483 /* 1484 * udf_read_super 1485 * 1486 * PURPOSE 1487 * Complete the specified super block. 1488 * 1489 * PRE-CONDITIONS 1490 * sb Pointer to superblock to complete - never NULL. 1491 * sb->s_dev Device to read suberblock from. 1492 * options Pointer to mount options. 1493 * silent Silent flag. 1494 * 1495 * HISTORY 1496 * July 1, 1997 - Andrew E. Mileski 1497 * Written, tested, and released. 1498 */ 1499 static int udf_fill_super(struct super_block *sb, void *options, int silent) 1500 { 1501 int i; 1502 struct inode *inode=NULL; 1503 struct udf_options uopt; 1504 kernel_lb_addr rootdir, fileset; 1505 struct udf_sb_info *sbi; 1506 1507 uopt.flags = (1 << UDF_FLAG_USE_AD_IN_ICB) | (1 << UDF_FLAG_STRICT); 1508 uopt.uid = -1; 1509 uopt.gid = -1; 1510 uopt.umask = 0; 1511 1512 sbi = kmalloc(sizeof(struct udf_sb_info), GFP_KERNEL); 1513 if (!sbi) 1514 return -ENOMEM; 1515 sb->s_fs_info = sbi; 1516 memset(UDF_SB(sb), 0x00, sizeof(struct udf_sb_info)); 1517 1518 init_MUTEX(&sbi->s_alloc_sem); 1519 1520 if (!udf_parse_options((char *)options, &uopt)) 1521 goto error_out; 1522 1523 if (uopt.flags & (1 << UDF_FLAG_UTF8) && 1524 uopt.flags & (1 << UDF_FLAG_NLS_MAP)) 1525 { 1526 udf_error(sb, "udf_read_super", 1527 "utf8 cannot be combined with iocharset\n"); 1528 goto error_out; 1529 } 1530 #ifdef CONFIG_UDF_NLS 1531 if ((uopt.flags & (1 << UDF_FLAG_NLS_MAP)) && !uopt.nls_map) 1532 { 1533 uopt.nls_map = load_nls_default(); 1534 if (!uopt.nls_map) 1535 uopt.flags &= ~(1 << UDF_FLAG_NLS_MAP); 1536 else 1537 udf_debug("Using default NLS map\n"); 1538 } 1539 #endif 1540 if (!(uopt.flags & (1 << UDF_FLAG_NLS_MAP))) 1541 uopt.flags |= (1 << UDF_FLAG_UTF8); 1542 1543 fileset.logicalBlockNum = 0xFFFFFFFF; 1544 fileset.partitionReferenceNum = 0xFFFF; 1545 1546 UDF_SB(sb)->s_flags = uopt.flags; 1547 UDF_SB(sb)->s_uid = uopt.uid; 1548 UDF_SB(sb)->s_gid = uopt.gid; 1549 UDF_SB(sb)->s_umask = uopt.umask; 1550 UDF_SB(sb)->s_nls_map = uopt.nls_map; 1551 1552 /* Set the block size for all transfers */ 1553 if (!udf_set_blocksize(sb, uopt.blocksize)) 1554 goto error_out; 1555 1556 if ( uopt.session == 0xFFFFFFFF ) 1557 UDF_SB_SESSION(sb) = udf_get_last_session(sb); 1558 else 1559 UDF_SB_SESSION(sb) = uopt.session; 1560 1561 udf_debug("Multi-session=%d\n", UDF_SB_SESSION(sb)); 1562 1563 UDF_SB_LASTBLOCK(sb) = uopt.lastblock; 1564 UDF_SB_ANCHOR(sb)[0] = UDF_SB_ANCHOR(sb)[1] = 0; 1565 UDF_SB_ANCHOR(sb)[2] = uopt.anchor; 1566 UDF_SB_ANCHOR(sb)[3] = 256; 1567 1568 if (udf_check_valid(sb, uopt.novrs, silent)) /* read volume recognition sequences */ 1569 { 1570 printk("UDF-fs: No VRS found\n"); 1571 goto error_out; 1572 } 1573 1574 udf_find_anchor(sb); 1575 1576 /* Fill in the rest of the superblock */ 1577 sb->s_op = &udf_sb_ops; 1578 sb->dq_op = NULL; 1579 sb->s_dirt = 0; 1580 sb->s_magic = UDF_SUPER_MAGIC; 1581 sb->s_time_gran = 1000; 1582 1583 if (udf_load_partition(sb, &fileset)) 1584 { 1585 printk("UDF-fs: No partition found (1)\n"); 1586 goto error_out; 1587 } 1588 1589 udf_debug("Lastblock=%d\n", UDF_SB_LASTBLOCK(sb)); 1590 1591 if ( UDF_SB_LVIDBH(sb) ) 1592 { 1593 uint16_t minUDFReadRev = le16_to_cpu(UDF_SB_LVIDIU(sb)->minUDFReadRev); 1594 uint16_t minUDFWriteRev = le16_to_cpu(UDF_SB_LVIDIU(sb)->minUDFWriteRev); 1595 /* uint16_t maxUDFWriteRev = le16_to_cpu(UDF_SB_LVIDIU(sb)->maxUDFWriteRev); */ 1596 1597 if (minUDFReadRev > UDF_MAX_READ_VERSION) 1598 { 1599 printk("UDF-fs: minUDFReadRev=%x (max is %x)\n", 1600 le16_to_cpu(UDF_SB_LVIDIU(sb)->minUDFReadRev), 1601 UDF_MAX_READ_VERSION); 1602 goto error_out; 1603 } 1604 else if (minUDFWriteRev > UDF_MAX_WRITE_VERSION) 1605 { 1606 sb->s_flags |= MS_RDONLY; 1607 } 1608 1609 UDF_SB_UDFREV(sb) = minUDFWriteRev; 1610 1611 if (minUDFReadRev >= UDF_VERS_USE_EXTENDED_FE) 1612 UDF_SET_FLAG(sb, UDF_FLAG_USE_EXTENDED_FE); 1613 if (minUDFReadRev >= UDF_VERS_USE_STREAMS) 1614 UDF_SET_FLAG(sb, UDF_FLAG_USE_STREAMS); 1615 } 1616 1617 if ( !UDF_SB_NUMPARTS(sb) ) 1618 { 1619 printk("UDF-fs: No partition found (2)\n"); 1620 goto error_out; 1621 } 1622 1623 if ( udf_find_fileset(sb, &fileset, &rootdir) ) 1624 { 1625 printk("UDF-fs: No fileset found\n"); 1626 goto error_out; 1627 } 1628 1629 if (!silent) 1630 { 1631 kernel_timestamp ts; 1632 udf_time_to_stamp(&ts, UDF_SB_RECORDTIME(sb)); 1633 udf_info("UDF %s (%s) Mounting volume '%s', timestamp %04u/%02u/%02u %02u:%02u (%x)\n", 1634 UDFFS_VERSION, UDFFS_DATE, 1635 UDF_SB_VOLIDENT(sb), ts.year, ts.month, ts.day, ts.hour, ts.minute, 1636 ts.typeAndTimezone); 1637 } 1638 if (!(sb->s_flags & MS_RDONLY)) 1639 udf_open_lvid(sb); 1640 1641 /* Assign the root inode */ 1642 /* assign inodes by physical block number */ 1643 /* perhaps it's not extensible enough, but for now ... */ 1644 inode = udf_iget(sb, rootdir); 1645 if (!inode) 1646 { 1647 printk("UDF-fs: Error in udf_iget, block=%d, partition=%d\n", 1648 rootdir.logicalBlockNum, rootdir.partitionReferenceNum); 1649 goto error_out; 1650 } 1651 1652 /* Allocate a dentry for the root inode */ 1653 sb->s_root = d_alloc_root(inode); 1654 if (!sb->s_root) 1655 { 1656 printk("UDF-fs: Couldn't allocate root dentry\n"); 1657 iput(inode); 1658 goto error_out; 1659 } 1660 sb->s_maxbytes = MAX_LFS_FILESIZE; 1661 return 0; 1662 1663 error_out: 1664 if (UDF_SB_VAT(sb)) 1665 iput(UDF_SB_VAT(sb)); 1666 if (UDF_SB_NUMPARTS(sb)) 1667 { 1668 if (UDF_SB_PARTFLAGS(sb, UDF_SB_PARTITION(sb)) & UDF_PART_FLAG_UNALLOC_TABLE) 1669 iput(UDF_SB_PARTMAPS(sb)[UDF_SB_PARTITION(sb)].s_uspace.s_table); 1670 if (UDF_SB_PARTFLAGS(sb, UDF_SB_PARTITION(sb)) & UDF_PART_FLAG_FREED_TABLE) 1671 iput(UDF_SB_PARTMAPS(sb)[UDF_SB_PARTITION(sb)].s_fspace.s_table); 1672 if (UDF_SB_PARTFLAGS(sb, UDF_SB_PARTITION(sb)) & UDF_PART_FLAG_UNALLOC_BITMAP) 1673 UDF_SB_FREE_BITMAP(sb,UDF_SB_PARTITION(sb),s_uspace); 1674 if (UDF_SB_PARTFLAGS(sb, UDF_SB_PARTITION(sb)) & UDF_PART_FLAG_FREED_BITMAP) 1675 UDF_SB_FREE_BITMAP(sb,UDF_SB_PARTITION(sb),s_fspace); 1676 if (UDF_SB_PARTTYPE(sb, UDF_SB_PARTITION(sb)) == UDF_SPARABLE_MAP15) 1677 { 1678 for (i=0; i<4; i++) 1679 udf_release_data(UDF_SB_TYPESPAR(sb, UDF_SB_PARTITION(sb)).s_spar_map[i]); 1680 } 1681 } 1682 #ifdef CONFIG_UDF_NLS 1683 if (UDF_QUERY_FLAG(sb, UDF_FLAG_NLS_MAP)) 1684 unload_nls(UDF_SB(sb)->s_nls_map); 1685 #endif 1686 if (!(sb->s_flags & MS_RDONLY)) 1687 udf_close_lvid(sb); 1688 udf_release_data(UDF_SB_LVIDBH(sb)); 1689 UDF_SB_FREE(sb); 1690 kfree(sbi); 1691 sb->s_fs_info = NULL; 1692 return -EINVAL; 1693 } 1694 1695 void udf_error(struct super_block *sb, const char *function, 1696 const char *fmt, ...) 1697 { 1698 va_list args; 1699 1700 if (!(sb->s_flags & MS_RDONLY)) 1701 { 1702 /* mark sb error */ 1703 sb->s_dirt = 1; 1704 } 1705 va_start(args, fmt); 1706 vsprintf(error_buf, fmt, args); 1707 va_end(args); 1708 printk (KERN_CRIT "UDF-fs error (device %s): %s: %s\n", 1709 sb->s_id, function, error_buf); 1710 } 1711 1712 void udf_warning(struct super_block *sb, const char *function, 1713 const char *fmt, ...) 1714 { 1715 va_list args; 1716 1717 va_start (args, fmt); 1718 vsprintf(error_buf, fmt, args); 1719 va_end(args); 1720 printk(KERN_WARNING "UDF-fs warning (device %s): %s: %s\n", 1721 sb->s_id, function, error_buf); 1722 } 1723 1724 /* 1725 * udf_put_super 1726 * 1727 * PURPOSE 1728 * Prepare for destruction of the superblock. 1729 * 1730 * DESCRIPTION 1731 * Called before the filesystem is unmounted. 1732 * 1733 * HISTORY 1734 * July 1, 1997 - Andrew E. Mileski 1735 * Written, tested, and released. 1736 */ 1737 static void 1738 udf_put_super(struct super_block *sb) 1739 { 1740 int i; 1741 1742 if (UDF_SB_VAT(sb)) 1743 iput(UDF_SB_VAT(sb)); 1744 if (UDF_SB_NUMPARTS(sb)) 1745 { 1746 if (UDF_SB_PARTFLAGS(sb, UDF_SB_PARTITION(sb)) & UDF_PART_FLAG_UNALLOC_TABLE) 1747 iput(UDF_SB_PARTMAPS(sb)[UDF_SB_PARTITION(sb)].s_uspace.s_table); 1748 if (UDF_SB_PARTFLAGS(sb, UDF_SB_PARTITION(sb)) & UDF_PART_FLAG_FREED_TABLE) 1749 iput(UDF_SB_PARTMAPS(sb)[UDF_SB_PARTITION(sb)].s_fspace.s_table); 1750 if (UDF_SB_PARTFLAGS(sb, UDF_SB_PARTITION(sb)) & UDF_PART_FLAG_UNALLOC_BITMAP) 1751 UDF_SB_FREE_BITMAP(sb,UDF_SB_PARTITION(sb),s_uspace); 1752 if (UDF_SB_PARTFLAGS(sb, UDF_SB_PARTITION(sb)) & UDF_PART_FLAG_FREED_BITMAP) 1753 UDF_SB_FREE_BITMAP(sb,UDF_SB_PARTITION(sb),s_fspace); 1754 if (UDF_SB_PARTTYPE(sb, UDF_SB_PARTITION(sb)) == UDF_SPARABLE_MAP15) 1755 { 1756 for (i=0; i<4; i++) 1757 udf_release_data(UDF_SB_TYPESPAR(sb, UDF_SB_PARTITION(sb)).s_spar_map[i]); 1758 } 1759 } 1760 #ifdef CONFIG_UDF_NLS 1761 if (UDF_QUERY_FLAG(sb, UDF_FLAG_NLS_MAP)) 1762 unload_nls(UDF_SB(sb)->s_nls_map); 1763 #endif 1764 if (!(sb->s_flags & MS_RDONLY)) 1765 udf_close_lvid(sb); 1766 udf_release_data(UDF_SB_LVIDBH(sb)); 1767 UDF_SB_FREE(sb); 1768 kfree(sb->s_fs_info); 1769 sb->s_fs_info = NULL; 1770 } 1771 1772 /* 1773 * udf_stat_fs 1774 * 1775 * PURPOSE 1776 * Return info about the filesystem. 1777 * 1778 * DESCRIPTION 1779 * Called by sys_statfs() 1780 * 1781 * HISTORY 1782 * July 1, 1997 - Andrew E. Mileski 1783 * Written, tested, and released. 1784 */ 1785 static int 1786 udf_statfs(struct super_block *sb, struct kstatfs *buf) 1787 { 1788 buf->f_type = UDF_SUPER_MAGIC; 1789 buf->f_bsize = sb->s_blocksize; 1790 buf->f_blocks = UDF_SB_PARTLEN(sb, UDF_SB_PARTITION(sb)); 1791 buf->f_bfree = udf_count_free(sb); 1792 buf->f_bavail = buf->f_bfree; 1793 buf->f_files = (UDF_SB_LVIDBH(sb) ? 1794 (le32_to_cpu(UDF_SB_LVIDIU(sb)->numFiles) + 1795 le32_to_cpu(UDF_SB_LVIDIU(sb)->numDirs)) : 0) + buf->f_bfree; 1796 buf->f_ffree = buf->f_bfree; 1797 /* __kernel_fsid_t f_fsid */ 1798 buf->f_namelen = UDF_NAME_LEN-2; 1799 1800 return 0; 1801 } 1802 1803 static unsigned char udf_bitmap_lookup[16] = { 1804 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4 1805 }; 1806 1807 static unsigned int 1808 udf_count_free_bitmap(struct super_block *sb, struct udf_bitmap *bitmap) 1809 { 1810 struct buffer_head *bh = NULL; 1811 unsigned int accum = 0; 1812 int index; 1813 int block = 0, newblock; 1814 kernel_lb_addr loc; 1815 uint32_t bytes; 1816 uint8_t value; 1817 uint8_t *ptr; 1818 uint16_t ident; 1819 struct spaceBitmapDesc *bm; 1820 1821 lock_kernel(); 1822 1823 loc.logicalBlockNum = bitmap->s_extPosition; 1824 loc.partitionReferenceNum = UDF_SB_PARTITION(sb); 1825 bh = udf_read_ptagged(sb, loc, 0, &ident); 1826 1827 if (!bh) 1828 { 1829 printk(KERN_ERR "udf: udf_count_free failed\n"); 1830 goto out; 1831 } 1832 else if (ident != TAG_IDENT_SBD) 1833 { 1834 udf_release_data(bh); 1835 printk(KERN_ERR "udf: udf_count_free failed\n"); 1836 goto out; 1837 } 1838 1839 bm = (struct spaceBitmapDesc *)bh->b_data; 1840 bytes = le32_to_cpu(bm->numOfBytes); 1841 index = sizeof(struct spaceBitmapDesc); /* offset in first block only */ 1842 ptr = (uint8_t *)bh->b_data; 1843 1844 while ( bytes > 0 ) 1845 { 1846 while ((bytes > 0) && (index < sb->s_blocksize)) 1847 { 1848 value = ptr[index]; 1849 accum += udf_bitmap_lookup[ value & 0x0f ]; 1850 accum += udf_bitmap_lookup[ value >> 4 ]; 1851 index++; 1852 bytes--; 1853 } 1854 if ( bytes ) 1855 { 1856 udf_release_data(bh); 1857 newblock = udf_get_lb_pblock(sb, loc, ++block); 1858 bh = udf_tread(sb, newblock); 1859 if (!bh) 1860 { 1861 udf_debug("read failed\n"); 1862 goto out; 1863 } 1864 index = 0; 1865 ptr = (uint8_t *)bh->b_data; 1866 } 1867 } 1868 udf_release_data(bh); 1869 1870 out: 1871 unlock_kernel(); 1872 1873 return accum; 1874 } 1875 1876 static unsigned int 1877 udf_count_free_table(struct super_block *sb, struct inode * table) 1878 { 1879 unsigned int accum = 0; 1880 uint32_t extoffset, elen; 1881 kernel_lb_addr bloc, eloc; 1882 int8_t etype; 1883 struct buffer_head *bh = NULL; 1884 1885 lock_kernel(); 1886 1887 bloc = UDF_I_LOCATION(table); 1888 extoffset = sizeof(struct unallocSpaceEntry); 1889 1890 while ((etype = udf_next_aext(table, &bloc, &extoffset, &eloc, &elen, &bh, 1)) != -1) 1891 { 1892 accum += (elen >> table->i_sb->s_blocksize_bits); 1893 } 1894 udf_release_data(bh); 1895 1896 unlock_kernel(); 1897 1898 return accum; 1899 } 1900 1901 static unsigned int 1902 udf_count_free(struct super_block *sb) 1903 { 1904 unsigned int accum = 0; 1905 1906 if (UDF_SB_LVIDBH(sb)) 1907 { 1908 if (le32_to_cpu(UDF_SB_LVID(sb)->numOfPartitions) > UDF_SB_PARTITION(sb)) 1909 { 1910 accum = le32_to_cpu(UDF_SB_LVID(sb)->freeSpaceTable[UDF_SB_PARTITION(sb)]); 1911 1912 if (accum == 0xFFFFFFFF) 1913 accum = 0; 1914 } 1915 } 1916 1917 if (accum) 1918 return accum; 1919 1920 if (UDF_SB_PARTFLAGS(sb,UDF_SB_PARTITION(sb)) & UDF_PART_FLAG_UNALLOC_BITMAP) 1921 { 1922 accum += udf_count_free_bitmap(sb, 1923 UDF_SB_PARTMAPS(sb)[UDF_SB_PARTITION(sb)].s_uspace.s_bitmap); 1924 } 1925 if (UDF_SB_PARTFLAGS(sb,UDF_SB_PARTITION(sb)) & UDF_PART_FLAG_FREED_BITMAP) 1926 { 1927 accum += udf_count_free_bitmap(sb, 1928 UDF_SB_PARTMAPS(sb)[UDF_SB_PARTITION(sb)].s_fspace.s_bitmap); 1929 } 1930 if (accum) 1931 return accum; 1932 1933 if (UDF_SB_PARTFLAGS(sb,UDF_SB_PARTITION(sb)) & UDF_PART_FLAG_UNALLOC_TABLE) 1934 { 1935 accum += udf_count_free_table(sb, 1936 UDF_SB_PARTMAPS(sb)[UDF_SB_PARTITION(sb)].s_uspace.s_table); 1937 } 1938 if (UDF_SB_PARTFLAGS(sb,UDF_SB_PARTITION(sb)) & UDF_PART_FLAG_FREED_TABLE) 1939 { 1940 accum += udf_count_free_table(sb, 1941 UDF_SB_PARTMAPS(sb)[UDF_SB_PARTITION(sb)].s_fspace.s_table); 1942 } 1943 1944 return accum; 1945 } 1946