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