super.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:48k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  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.  * CONTACTS
  18.  *  E-mail regarding any portion of the Linux UDF file system should be
  19.  *  directed to the development team mailing list (run by majordomo):
  20.  *   linux_udf@hpesjro.fc.hp.com
  21.  *
  22.  * COPYRIGHT
  23.  *  This file is distributed under the terms of the GNU General Public
  24.  *  License (GPL). Copies of the GPL can be obtained from:
  25.  *    ftp://prep.ai.mit.edu/pub/gnu/GPL
  26.  *  Each contributing author retains all rights to their own work.
  27.  *
  28.  *  (C) 1998 Dave Boynton
  29.  *  (C) 1998-2000 Ben Fennema
  30.  *  (C) 2000 Stelias Computing Inc
  31.  *
  32.  * HISTORY
  33.  *
  34.  *  09/24/98 dgb  changed to allow compiling outside of kernel, and
  35.  *                added some debugging.
  36.  *  10/01/98 dgb  updated to allow (some) possibility of compiling w/2.0.34
  37.  *  10/16/98      attempting some multi-session support
  38.  *  10/17/98      added freespace count for "df"
  39.  *  11/11/98 gr   added novrs option
  40.  *  11/26/98 dgb  added fileset,anchor mount options
  41.  *  12/06/98 blf  really hosed things royally. vat/sparing support. sequenced vol descs
  42.  *                rewrote option handling based on isofs
  43.  *  12/20/98      find the free space bitmap (if it exists)
  44.  */
  45. #include "udfdecl.h"    
  46. #include <linux/config.h>
  47. #include <linux/version.h>
  48. #include <linux/blkdev.h>
  49. #include <linux/slab.h>
  50. #include <linux/kernel.h>
  51. #include <linux/locks.h>
  52. #include <linux/module.h>
  53. #include <linux/stat.h>
  54. #include <linux/cdrom.h>
  55. #include <linux/nls.h>
  56. #include <asm/byteorder.h>
  57. #include <linux/udf_fs.h>
  58. #include "udf_sb.h"
  59. #include "udf_i.h"
  60. #include <linux/init.h>
  61. #include <asm/uaccess.h>
  62. #define VDS_POS_PRIMARY_VOL_DESC 0
  63. #define VDS_POS_UNALLOC_SPACE_DESC 1
  64. #define VDS_POS_LOGICAL_VOL_DESC 2
  65. #define VDS_POS_PARTITION_DESC 3
  66. #define VDS_POS_IMP_USE_VOL_DESC 4
  67. #define VDS_POS_VOL_DESC_PTR 5
  68. #define VDS_POS_TERMINATING_DESC 6
  69. #define VDS_POS_LENGTH 7
  70. static char error_buf[1024];
  71. /* These are the "meat" - everything else is stuffing */
  72. static struct super_block *udf_read_super(struct super_block *, void *, int);
  73. static void udf_put_super(struct super_block *);
  74. static void udf_write_super(struct super_block *);
  75. static int udf_remount_fs(struct super_block *, int *, char *);
  76. static int udf_check_valid(struct super_block *, int, int);
  77. static int udf_vrs(struct super_block *sb, int silent);
  78. static int udf_load_partition(struct super_block *, lb_addr *);
  79. static int udf_load_logicalvol(struct super_block *, struct buffer_head *, lb_addr *);
  80. static void udf_load_logicalvolint(struct super_block *, extent_ad);
  81. static void udf_find_anchor(struct super_block *);
  82. static int udf_find_fileset(struct super_block *, lb_addr *, lb_addr *);
  83. static void udf_load_pvoldesc(struct super_block *, struct buffer_head *);
  84. static void udf_load_fileset(struct super_block *, struct buffer_head *, lb_addr *);
  85. static void udf_load_partdesc(struct super_block *, struct buffer_head *);
  86. static void udf_open_lvid(struct super_block *);
  87. static void udf_close_lvid(struct super_block *);
  88. static unsigned int udf_count_free(struct super_block *);
  89. static int udf_statfs(struct super_block *, struct statfs *);
  90. /* UDF filesystem type */
  91. static DECLARE_FSTYPE_DEV(udf_fstype, "udf", udf_read_super);
  92. /* Superblock operations */
  93. static struct super_operations udf_sb_ops = {
  94. read_inode: udf_read_inode,
  95. write_inode: udf_write_inode,
  96. put_inode: udf_put_inode,
  97. delete_inode: udf_delete_inode,
  98. put_super: udf_put_super,
  99. write_super: udf_write_super,
  100. statfs: udf_statfs,
  101. remount_fs: udf_remount_fs,
  102. };
  103. struct udf_options
  104. {
  105. unsigned char novrs;
  106. unsigned int blocksize;
  107. unsigned int session;
  108. unsigned int lastblock;
  109. unsigned int anchor;
  110. unsigned int volume;
  111. unsigned short partition;
  112. unsigned int fileset;
  113. unsigned int rootdir;
  114. unsigned int flags;
  115. mode_t umask;
  116. gid_t gid;
  117. uid_t uid;
  118. struct nls_table *nls_map;
  119. };
  120. static int __init init_udf_fs(void)
  121. {
  122. printk(KERN_NOTICE "udf: registering filesystemn");
  123. return register_filesystem(&udf_fstype);
  124. }
  125. static void __exit exit_udf_fs(void)
  126. {
  127. printk(KERN_NOTICE "udf: unregistering filesystemn");
  128. unregister_filesystem(&udf_fstype);
  129. }
  130. EXPORT_NO_SYMBOLS;
  131. module_init(init_udf_fs)
  132. module_exit(exit_udf_fs)
  133. /*
  134.  * udf_parse_options
  135.  *
  136.  * PURPOSE
  137.  * Parse mount options.
  138.  *
  139.  * DESCRIPTION
  140.  * The following mount options are supported:
  141.  *
  142.  * gid= Set the default group.
  143.  * umask= Set the default umask.
  144.  * uid= Set the default user.
  145.  * bs= Set the block size.
  146.  * unhide Show otherwise hidden files.
  147.  * undelete Show deleted files in lists.
  148.  * adinicb Embed data in the inode (default)
  149.  * noadinicb Don't embed data in the inode
  150.  * shortad Use short ad's
  151.  * longad Use long ad's (default)
  152.  * nostrict Unset strict conformance
  153.  * iocharset= Set the NLS character set
  154.  *
  155.  * The remaining are for debugging and disaster recovery:
  156.  *
  157.  * novrs Skip volume sequence recognition 
  158.  *
  159.  * The following expect a offset from 0.
  160.  *
  161.  * session= Set the CDROM session (default= last session)
  162.  * anchor= Override standard anchor location. (default= 256)
  163.  * volume= Override the VolumeDesc location. (unused)
  164.  * partition= Override the PartitionDesc location. (unused)
  165.  * lastblock= Set the last block of the filesystem/
  166.  *
  167.  * The following expect a offset from the partition root.
  168.  *
  169.  * fileset= Override the fileset block location. (unused)
  170.  * rootdir= Override the root directory location. (unused)
  171.  * WARNING: overriding the rootdir to a non-directory may
  172.  * yield highly unpredictable results.
  173.  *
  174.  * PRE-CONDITIONS
  175.  * options Pointer to mount options string.
  176.  * uopts Pointer to mount options variable.
  177.  *
  178.  * POST-CONDITIONS
  179.  * <return> 0 Mount options parsed okay.
  180.  * <return> -1 Error parsing mount options.
  181.  *
  182.  * HISTORY
  183.  * July 1, 1997 - Andrew E. Mileski
  184.  * Written, tested, and released.
  185.  */
  186. static int
  187. udf_parse_options(char *options, struct udf_options *uopt)
  188. {
  189. char *opt, *val;
  190. uopt->novrs = 0;
  191. uopt->blocksize = 2048;
  192. uopt->partition = 0xFFFF;
  193. uopt->session = 0xFFFFFFFF;
  194. uopt->lastblock = 0;
  195. uopt->anchor = 0;
  196. uopt->volume = 0xFFFFFFFF;
  197. uopt->rootdir = 0xFFFFFFFF;
  198. uopt->fileset = 0xFFFFFFFF;
  199. uopt->nls_map = NULL;
  200. if (!options)
  201. return 1;
  202. for (opt = strtok(options, ","); opt; opt = strtok(NULL, ","))
  203. {
  204. /* Make "opt=val" into two strings */
  205. val = strchr(opt, '=');
  206. if (val)
  207. *(val++) = 0;
  208. if (!strcmp(opt, "novrs") && !val)
  209. uopt->novrs = 1;
  210. else if (!strcmp(opt, "bs") && val)
  211. uopt->blocksize = simple_strtoul(val, NULL, 0);
  212. else if (!strcmp(opt, "unhide") && !val)
  213. uopt->flags |= (1 << UDF_FLAG_UNHIDE);
  214. else if (!strcmp(opt, "undelete") && !val)
  215. uopt->flags |= (1 << UDF_FLAG_UNDELETE);
  216. else if (!strcmp(opt, "noadinicb") && !val)
  217. uopt->flags &= ~(1 << UDF_FLAG_USE_AD_IN_ICB);
  218. else if (!strcmp(opt, "adinicb") && !val)
  219. uopt->flags |= (1 << UDF_FLAG_USE_AD_IN_ICB);
  220. else if (!strcmp(opt, "shortad") && !val)
  221. uopt->flags |= (1 << UDF_FLAG_USE_SHORT_AD);
  222. else if (!strcmp(opt, "longad") && !val)
  223. uopt->flags &= ~(1 << UDF_FLAG_USE_SHORT_AD);
  224. else if (!strcmp(opt, "gid") && val)
  225. uopt->gid = simple_strtoul(val, NULL, 0);
  226. else if (!strcmp(opt, "umask") && val)
  227. uopt->umask = simple_strtoul(val, NULL, 0);
  228. else if (!strcmp(opt, "nostrict") && !val)
  229. uopt->flags &= ~(1 << UDF_FLAG_STRICT);
  230. else if (!strcmp(opt, "uid") && val)
  231. uopt->uid = simple_strtoul(val, NULL, 0);
  232. else if (!strcmp(opt, "session") && val)
  233. uopt->session = simple_strtoul(val, NULL, 0);
  234. else if (!strcmp(opt, "lastblock") && val)
  235. uopt->lastblock = simple_strtoul(val, NULL, 0);
  236. else if (!strcmp(opt, "anchor") && val)
  237. uopt->anchor = simple_strtoul(val, NULL, 0);
  238. else if (!strcmp(opt, "volume") && val)
  239. uopt->volume = simple_strtoul(val, NULL, 0);
  240. else if (!strcmp(opt, "partition") && val)
  241. uopt->partition = simple_strtoul(val, NULL, 0);
  242. else if (!strcmp(opt, "fileset") && val)
  243. uopt->fileset = simple_strtoul(val, NULL, 0);
  244. else if (!strcmp(opt, "rootdir") && val)
  245. uopt->rootdir = simple_strtoul(val, NULL, 0);
  246. #ifdef CONFIG_NLS
  247. else if (!strcmp(opt, "iocharset") && val)
  248. {
  249. uopt->nls_map = load_nls(val);
  250. uopt->flags |= (1 << UDF_FLAG_NLS_MAP);
  251. }
  252. #endif
  253. else if (!strcmp(opt, "utf8") && !val)
  254. uopt->flags |= (1 << UDF_FLAG_UTF8);
  255. else if (val)
  256. {
  257. printk(KERN_ERR "udf: bad mount option "%s=%s"n",
  258. opt, val);
  259. return 0;
  260. }
  261. else
  262. {
  263. printk(KERN_ERR "udf: bad mount option "%s"n",
  264. opt);
  265. return 0;
  266. }
  267. }
  268. return 1;
  269. }
  270. void
  271. udf_write_super(struct super_block *sb)
  272. {
  273. if (!(sb->s_flags & MS_RDONLY))
  274. udf_open_lvid(sb);
  275. sb->s_dirt = 0;
  276. }
  277. static int
  278. udf_remount_fs(struct super_block *sb, int *flags, char *options)
  279. {
  280. struct udf_options uopt;
  281. uopt.flags = UDF_SB(sb)->s_flags ;
  282. uopt.uid   = UDF_SB(sb)->s_uid ;
  283. uopt.gid   = UDF_SB(sb)->s_gid ;
  284. uopt.umask = UDF_SB(sb)->s_umask ;
  285. if ( !udf_parse_options(options, &uopt) )
  286. return -EINVAL;
  287. UDF_SB(sb)->s_flags = uopt.flags;
  288. UDF_SB(sb)->s_uid   = uopt.uid;
  289. UDF_SB(sb)->s_gid   = uopt.gid;
  290. UDF_SB(sb)->s_umask = uopt.umask;
  291. #if UDFFS_RW != 1
  292. *flags |= MS_RDONLY;
  293. #endif
  294. if ((*flags & MS_RDONLY) == (sb->s_flags & MS_RDONLY))
  295. return 0;
  296. if (*flags & MS_RDONLY)
  297. udf_close_lvid(sb);
  298. else
  299. udf_open_lvid(sb);
  300. return 0;
  301. }
  302. /*
  303.  * udf_set_blocksize
  304.  *
  305.  * PURPOSE
  306.  * Set the block size to be used in all transfers.
  307.  *
  308.  * DESCRIPTION
  309.  * To allow room for a DMA transfer, it is best to guess big when unsure.
  310.  * This routine picks 2048 bytes as the blocksize when guessing. This
  311.  * should be adequate until devices with larger block sizes become common.
  312.  *
  313.  * Note that the Linux kernel can currently only deal with blocksizes of
  314.  * 512, 1024, 2048, 4096, and 8192 bytes.
  315.  *
  316.  * PRE-CONDITIONS
  317.  * sb Pointer to _locked_ superblock.
  318.  *
  319.  * POST-CONDITIONS
  320.  * sb->s_blocksize Blocksize.
  321.  * sb->s_blocksize_bits log2 of blocksize.
  322.  * <return> 0 Blocksize is valid.
  323.  * <return> 1 Blocksize is invalid.
  324.  *
  325.  * HISTORY
  326.  * July 1, 1997 - Andrew E. Mileski
  327.  * Written, tested, and released.
  328.  */
  329. static  int
  330. udf_set_blocksize(struct super_block *sb, int bsize)
  331. {
  332. /* Use specified block size if specified */
  333. if (bsize)
  334. sb->s_blocksize = bsize;
  335. if (get_hardsect_size(sb->s_dev) > sb->s_blocksize)
  336. sb->s_blocksize = get_hardsect_size(sb->s_dev); 
  337. /* Block size must be an even multiple of 512 */
  338. switch (sb->s_blocksize)
  339. {
  340. case 512: sb->s_blocksize_bits = 9; break;
  341. case 1024: sb->s_blocksize_bits = 10; break;
  342. case 2048: sb->s_blocksize_bits = 11; break;
  343. case 4096: sb->s_blocksize_bits = 12; break;
  344. case 8192: sb->s_blocksize_bits = 13; break;
  345. default:
  346. {
  347. udf_debug("Bad block size (%ld)n", sb->s_blocksize);
  348. printk(KERN_ERR "udf: bad block size (%ld)n", sb->s_blocksize);
  349. return 0;
  350. }
  351. }
  352. /* Set the block size */
  353. set_blocksize(sb->s_dev, sb->s_blocksize);
  354. return sb->s_blocksize;
  355. }
  356. static int
  357. udf_vrs(struct super_block *sb, int silent)
  358. {
  359. struct VolStructDesc *vsd = NULL;
  360. int sector = 32768;
  361. int sectorsize;
  362. struct buffer_head *bh = NULL;
  363. int iso9660=0;
  364. int nsr02=0;
  365. int nsr03=0;
  366. /* Block size must be a multiple of 512 */
  367. if (sb->s_blocksize & 511)
  368. return 0;
  369. if (sb->s_blocksize < sizeof(struct VolStructDesc))
  370. sectorsize = sizeof(struct VolStructDesc);
  371. else
  372. sectorsize = sb->s_blocksize;
  373. sector += (UDF_SB_SESSION(sb) << sb->s_blocksize_bits);
  374. udf_debug("Starting at sector %u (%ld byte sectors)n",
  375. (sector >> sb->s_blocksize_bits), sb->s_blocksize);
  376. /* Process the sequence (if applicable) */
  377. for (;!nsr02 && !nsr03; sector += sectorsize)
  378. {
  379. /* Read a block */
  380. bh = udf_tread(sb, sector >> sb->s_blocksize_bits);
  381. if (!bh)
  382. break;
  383. /* Look for ISO  descriptors */
  384. vsd = (struct VolStructDesc *)(bh->b_data +
  385. (sector & (sb->s_blocksize - 1)));
  386. if (vsd->stdIdent[0] == 0)
  387. {
  388. udf_release_data(bh);
  389. break;
  390. }
  391. else if (!strncmp(vsd->stdIdent, STD_ID_CD001, STD_ID_LEN))
  392. {
  393. iso9660 = sector;
  394. switch (vsd->structType)
  395. {
  396. case 0: 
  397. udf_debug("ISO9660 Boot Record foundn");
  398. break;
  399. case 1: 
  400. udf_debug("ISO9660 Primary Volume Descriptor foundn");
  401. break;
  402. case 2: 
  403. udf_debug("ISO9660 Supplementary Volume Descriptor foundn");
  404. break;
  405. case 3: 
  406. udf_debug("ISO9660 Volume Partition Descriptor foundn");
  407. break;
  408. case 255: 
  409. udf_debug("ISO9660 Volume Descriptor Set Terminator foundn");
  410. break;
  411. default: 
  412. udf_debug("ISO9660 VRS (%u) foundn", vsd->structType);
  413. break;
  414. }
  415. }
  416. else if (!strncmp(vsd->stdIdent, STD_ID_BEA01, STD_ID_LEN))
  417. {
  418. }
  419. else if (!strncmp(vsd->stdIdent, STD_ID_TEA01, STD_ID_LEN))
  420. {
  421. udf_release_data(bh);
  422. break;
  423. }
  424. else if (!strncmp(vsd->stdIdent, STD_ID_NSR02, STD_ID_LEN))
  425. {
  426. nsr02 = sector;
  427. }
  428. else if (!strncmp(vsd->stdIdent, STD_ID_NSR03, STD_ID_LEN))
  429. {
  430. nsr03 = sector;
  431. }
  432. udf_release_data(bh);
  433. }
  434. if (nsr03)
  435. return nsr03;
  436. else if (nsr02)
  437. return nsr02;
  438. else if (sector - (UDF_SB_SESSION(sb) << sb->s_blocksize_bits) == 32768)
  439. return -1;
  440. else
  441. return 0;
  442. }
  443. /*
  444.  * udf_find_anchor
  445.  *
  446.  * PURPOSE
  447.  * Find an anchor volume descriptor.
  448.  *
  449.  * PRE-CONDITIONS
  450.  * sb Pointer to _locked_ superblock.
  451.  * lastblock Last block on media.
  452.  *
  453.  * POST-CONDITIONS
  454.  * <return> 1 if not found, 0 if ok
  455.  *
  456.  * HISTORY
  457.  * July 1, 1997 - Andrew E. Mileski
  458.  * Written, tested, and released.
  459.  */
  460. static void
  461. udf_find_anchor(struct super_block *sb)
  462. {
  463. int lastblock = UDF_SB_LASTBLOCK(sb);
  464. struct buffer_head *bh = NULL;
  465. Uint16 ident;
  466. Uint32 location;
  467. int i;
  468. if (lastblock)
  469. {
  470. int varlastblock = udf_variable_to_fixed(lastblock);
  471. int last[] =  { lastblock, lastblock - 2,
  472. lastblock - 150, lastblock - 152,
  473. varlastblock, varlastblock - 2,
  474. varlastblock - 150, varlastblock - 152 };
  475. lastblock = 0;
  476. /* Search for an anchor volume descriptor pointer */
  477. /*  according to spec, anchor is in either:
  478.  *     block 256
  479.  *     lastblock-256
  480.  *     lastblock
  481.  *  however, if the disc isn't closed, it could be 512 */
  482. for (i=0; (!lastblock && i<sizeof(last)/sizeof(int)); i++)
  483. {
  484. if (last[i] < 0 || !(bh = sb_bread(sb, last[i])))
  485. {
  486. ident = location = 0;
  487. }
  488. else
  489. {
  490. ident = le16_to_cpu(((tag *)bh->b_data)->tagIdent);
  491. location = le32_to_cpu(((tag *)bh->b_data)->tagLocation);
  492. udf_release_data(bh);
  493. }
  494. if (ident == TID_ANCHOR_VOL_DESC_PTR)
  495. {
  496. if (location == last[i] - UDF_SB_SESSION(sb))
  497. {
  498. lastblock = UDF_SB_ANCHOR(sb)[0] = last[i];
  499. UDF_SB_ANCHOR(sb)[1] = last[i] - 256;
  500. }
  501. else if (location == udf_variable_to_fixed(last[i]) - UDF_SB_SESSION(sb))
  502. {
  503. UDF_SET_FLAG(sb, UDF_FLAG_VARCONV);
  504. lastblock = UDF_SB_ANCHOR(sb)[0] = udf_variable_to_fixed(last[i]);
  505. UDF_SB_ANCHOR(sb)[1] = lastblock - 256;
  506. }
  507. else
  508. udf_debug("Anchor found at block %d, location mismatch %d.n",
  509. last[i], location);
  510. }
  511. else if (ident == TID_FILE_ENTRY || ident == TID_EXTENDED_FILE_ENTRY)
  512. {
  513. lastblock = last[i];
  514. UDF_SB_ANCHOR(sb)[3] = 512 + UDF_SB_SESSION(sb);
  515. }
  516. else
  517. {
  518. if (last[i] < 256 || !(bh = sb_bread(sb, last[i] - 256)))
  519. {
  520. ident = location = 0;
  521. }
  522. else
  523. {
  524. ident = le16_to_cpu(((tag *)bh->b_data)->tagIdent);
  525. location = le32_to_cpu(((tag *)bh->b_data)->tagLocation);
  526. udf_release_data(bh);
  527. }
  528. if (ident == TID_ANCHOR_VOL_DESC_PTR &&
  529. location == last[i] - 256 - UDF_SB_SESSION(sb))
  530. {
  531. lastblock = last[i];
  532. UDF_SB_ANCHOR(sb)[1] = last[i] - 256;
  533. }
  534. else
  535. {
  536. if (last[i] < 312 + UDF_SB_SESSION(sb) || !(bh = sb_bread(sb, last[i] - 312 - UDF_SB_SESSION(sb))))
  537. {
  538. ident = location = 0;
  539. }
  540. else
  541. {
  542. ident = le16_to_cpu(((tag *)bh->b_data)->tagIdent);
  543. location = le32_to_cpu(((tag *)bh->b_data)->tagLocation);
  544. udf_release_data(bh);
  545. }
  546. if (ident == TID_ANCHOR_VOL_DESC_PTR &&
  547. location == udf_variable_to_fixed(last[i]) - 256)
  548. {
  549. UDF_SET_FLAG(sb, UDF_FLAG_VARCONV);
  550. lastblock = udf_variable_to_fixed(last[i]);
  551. UDF_SB_ANCHOR(sb)[1] = lastblock - 256;
  552. }
  553. }
  554. }
  555. }
  556. }
  557. if (!lastblock)
  558. {
  559. /* We havn't found the lastblock. check 312 */
  560. if ((bh = sb_bread(sb, 312 + UDF_SB_SESSION(sb))))
  561. {
  562. ident = le16_to_cpu(((tag *)bh->b_data)->tagIdent);
  563. location = le32_to_cpu(((tag *)bh->b_data)->tagLocation);
  564. udf_release_data(bh);
  565. if (ident == TID_ANCHOR_VOL_DESC_PTR && location == 256)
  566. UDF_SET_FLAG(sb, UDF_FLAG_VARCONV);
  567. }
  568. }
  569. for (i=0; i<sizeof(UDF_SB_ANCHOR(sb))/sizeof(int); i++)
  570. {
  571. if (UDF_SB_ANCHOR(sb)[i])
  572. {
  573. if (!(bh = udf_read_tagged(sb,
  574. UDF_SB_ANCHOR(sb)[i], UDF_SB_ANCHOR(sb)[i], &ident)))
  575. {
  576. UDF_SB_ANCHOR(sb)[i] = 0;
  577. }
  578. else
  579. {
  580. udf_release_data(bh);
  581. if ((ident != TID_ANCHOR_VOL_DESC_PTR) && (i ||
  582. (ident != TID_FILE_ENTRY && ident != TID_EXTENDED_FILE_ENTRY)))
  583. {
  584. UDF_SB_ANCHOR(sb)[i] = 0;
  585. }
  586. }
  587. }
  588. }
  589. UDF_SB_LASTBLOCK(sb) = lastblock;
  590. }
  591. static int 
  592. udf_find_fileset(struct super_block *sb, lb_addr *fileset, lb_addr *root)
  593. {
  594. struct buffer_head *bh = NULL;
  595. long lastblock;
  596. Uint16 ident;
  597. if (fileset->logicalBlockNum != 0xFFFFFFFF ||
  598. fileset->partitionReferenceNum != 0xFFFF)
  599. {
  600. bh = udf_read_ptagged(sb, *fileset, 0, &ident);
  601. if (!bh)
  602. return 1;
  603. else if (ident != TID_FILE_SET_DESC)
  604. {
  605. udf_release_data(bh);
  606. return 1;
  607. }
  608. }
  609. if (!bh) /* Search backwards through the partitions */
  610. {
  611. lb_addr newfileset;
  612. return 1;
  613. for (newfileset.partitionReferenceNum=UDF_SB_NUMPARTS(sb)-1;
  614. (newfileset.partitionReferenceNum != 0xFFFF &&
  615. fileset->logicalBlockNum == 0xFFFFFFFF &&
  616. fileset->partitionReferenceNum == 0xFFFF);
  617. newfileset.partitionReferenceNum--)
  618. {
  619. lastblock = UDF_SB_PARTLEN(sb, newfileset.partitionReferenceNum);
  620. newfileset.logicalBlockNum = 0;
  621. do
  622. {
  623. bh = udf_read_ptagged(sb, newfileset, 0, &ident);
  624. if (!bh)
  625. {
  626. newfileset.logicalBlockNum ++;
  627. continue;
  628. }
  629. switch (ident)
  630. {
  631. case TID_SPACE_BITMAP_DESC:
  632. {
  633. struct SpaceBitmapDesc *sp;
  634. sp = (struct SpaceBitmapDesc *)bh->b_data;
  635. newfileset.logicalBlockNum += 1 +
  636. ((le32_to_cpu(sp->numOfBytes) + sizeof(struct SpaceBitmapDesc) - 1)
  637. >> sb->s_blocksize_bits);
  638. udf_release_data(bh);
  639. break;
  640. }
  641. case TID_FILE_SET_DESC:
  642. {
  643. *fileset = newfileset;
  644. break;
  645. }
  646. default:
  647. {
  648. newfileset.logicalBlockNum ++;
  649. udf_release_data(bh);
  650. bh = NULL;
  651. break;
  652. }
  653. }
  654. }
  655. while (newfileset.logicalBlockNum < lastblock &&
  656. fileset->logicalBlockNum == 0xFFFFFFFF &&
  657. fileset->partitionReferenceNum == 0xFFFF);
  658. }
  659. }
  660. if ((fileset->logicalBlockNum != 0xFFFFFFFF ||
  661. fileset->partitionReferenceNum != 0xFFFF) && bh)
  662. {
  663. udf_debug("Fileset at block=%d, partition=%dn",
  664. fileset->logicalBlockNum, fileset->partitionReferenceNum);
  665. UDF_SB_PARTITION(sb) = fileset->partitionReferenceNum;
  666. udf_load_fileset(sb, bh, root);
  667. udf_release_data(bh);
  668. return 0;
  669. }
  670. return 1;
  671. }
  672. static void 
  673. udf_load_pvoldesc(struct super_block *sb, struct buffer_head *bh)
  674. {
  675. struct PrimaryVolDesc *pvoldesc;
  676. time_t recording;
  677. long recording_usec;
  678. struct ustr instr;
  679. struct ustr outstr;
  680. pvoldesc = (struct PrimaryVolDesc *)bh->b_data;
  681. if ( udf_stamp_to_time(&recording, &recording_usec,
  682. lets_to_cpu(pvoldesc->recordingDateAndTime)) )
  683. {
  684. timestamp ts;
  685. ts = lets_to_cpu(pvoldesc->recordingDateAndTime);
  686. udf_debug("recording time %ld/%ld, %04u/%02u/%02u %02u:%02u (%x)n",
  687. recording, recording_usec,
  688. ts.year, ts.month, ts.day, ts.hour, ts.minute, ts.typeAndTimezone);
  689. UDF_SB_RECORDTIME(sb) = recording;
  690. }
  691. if ( !udf_build_ustr(&instr, pvoldesc->volIdent, 32) )
  692. {
  693. if (udf_CS0toUTF8(&outstr, &instr))
  694. {
  695. strncpy( UDF_SB_VOLIDENT(sb), outstr.u_name,
  696. outstr.u_len > 31 ? 31 : outstr.u_len);
  697. udf_debug("volIdent[] = '%s'n", UDF_SB_VOLIDENT(sb));
  698. }
  699. }
  700. if ( !udf_build_ustr(&instr, pvoldesc->volSetIdent, 128) )
  701. {
  702. if (udf_CS0toUTF8(&outstr, &instr))
  703. udf_debug("volSetIdent[] = '%s'n", outstr.u_name);
  704. }
  705. }
  706. static void 
  707. udf_load_fileset(struct super_block *sb, struct buffer_head *bh, lb_addr *root)
  708. {
  709. struct FileSetDesc *fset;
  710. fset = (struct FileSetDesc *)bh->b_data;
  711. *root = lelb_to_cpu(fset->rootDirectoryICB.extLocation);
  712. UDF_SB_SERIALNUM(sb) = le16_to_cpu(fset->descTag.tagSerialNum);
  713. udf_debug("Rootdir at block=%d, partition=%dn", 
  714. root->logicalBlockNum, root->partitionReferenceNum);
  715. }
  716. static void 
  717. udf_load_partdesc(struct super_block *sb, struct buffer_head *bh)
  718. {
  719. struct PartitionDesc *p;
  720. int i;
  721. p = (struct PartitionDesc *)bh->b_data;
  722. for (i=0; i<UDF_SB_NUMPARTS(sb); i++)
  723. {
  724. udf_debug("Searching map: (%d == %d)n", 
  725. UDF_SB_PARTMAPS(sb)[i].s_partition_num, le16_to_cpu(p->partitionNumber));
  726. if (UDF_SB_PARTMAPS(sb)[i].s_partition_num == le16_to_cpu(p->partitionNumber))
  727. {
  728. UDF_SB_PARTLEN(sb,i) = le32_to_cpu(p->partitionLength); /* blocks */
  729. UDF_SB_PARTROOT(sb,i) = le32_to_cpu(p->partitionStartingLocation) + UDF_SB_SESSION(sb);
  730. if (!strcmp(p->partitionContents.ident, PARTITION_CONTENTS_NSR02) ||
  731. !strcmp(p->partitionContents.ident, PARTITION_CONTENTS_NSR03))
  732. {
  733. struct PartitionHeaderDesc *phd;
  734. phd = (struct PartitionHeaderDesc *)(p->partitionContentsUse);
  735. if (phd->unallocatedSpaceTable.extLength)
  736. {
  737. lb_addr loc = { le32_to_cpu(phd->unallocatedSpaceTable.extPosition), i };
  738. UDF_SB_PARTMAPS(sb)[i].s_uspace.s_table =
  739. udf_iget(sb, loc);
  740. UDF_SB_PARTFLAGS(sb,i) |= UDF_PART_FLAG_UNALLOC_TABLE;
  741. udf_debug("unallocatedSpaceTable (part %d) @ %ldn",
  742. i, UDF_SB_PARTMAPS(sb)[i].s_uspace.s_table->i_ino);
  743. }
  744. if (phd->unallocatedSpaceBitmap.extLength)
  745. {
  746. UDF_SB_ALLOC_BITMAP(sb, i, s_uspace);
  747. if (UDF_SB_PARTMAPS(sb)[i].s_uspace.s_bitmap != NULL)
  748. {
  749. UDF_SB_PARTMAPS(sb)[i].s_uspace.s_bitmap->s_extLength =
  750. le32_to_cpu(phd->unallocatedSpaceBitmap.extLength);
  751. UDF_SB_PARTMAPS(sb)[i].s_uspace.s_bitmap->s_extPosition =
  752. le32_to_cpu(phd->unallocatedSpaceBitmap.extPosition);
  753. UDF_SB_PARTFLAGS(sb,i) |= UDF_PART_FLAG_UNALLOC_BITMAP;
  754. udf_debug("unallocatedSpaceBitmap (part %d) @ %dn",
  755. i, UDF_SB_PARTMAPS(sb)[i].s_uspace.s_bitmap->s_extPosition);
  756. }
  757. }
  758. if (phd->partitionIntegrityTable.extLength)
  759. udf_debug("partitionIntegrityTable (part %d)n", i);
  760. if (phd->freedSpaceTable.extLength)
  761. {
  762. lb_addr loc = { le32_to_cpu(phd->freedSpaceTable.extPosition), i };
  763. UDF_SB_PARTMAPS(sb)[i].s_fspace.s_table =
  764. udf_iget(sb, loc);
  765. UDF_SB_PARTFLAGS(sb,i) |= UDF_PART_FLAG_FREED_TABLE;
  766. udf_debug("freedSpaceTable (part %d) @ %ldn",
  767. i, UDF_SB_PARTMAPS(sb)[i].s_fspace.s_table->i_ino);
  768. }
  769. if (phd->freedSpaceBitmap.extLength)
  770. {
  771. UDF_SB_ALLOC_BITMAP(sb, i, s_fspace);
  772. if (UDF_SB_PARTMAPS(sb)[i].s_fspace.s_bitmap != NULL)
  773. {
  774. UDF_SB_PARTMAPS(sb)[i].s_fspace.s_bitmap->s_extLength =
  775. le32_to_cpu(phd->freedSpaceBitmap.extLength);
  776. UDF_SB_PARTMAPS(sb)[i].s_fspace.s_bitmap->s_extPosition =
  777. le32_to_cpu(phd->freedSpaceBitmap.extPosition);
  778. UDF_SB_PARTFLAGS(sb,i) |= UDF_PART_FLAG_FREED_BITMAP;
  779. udf_debug("freedSpaceBitmap (part %d) @ %dn",
  780. i, UDF_SB_PARTMAPS(sb)[i].s_fspace.s_bitmap->s_extPosition);
  781. }
  782. }
  783. }
  784. break;
  785. }
  786. }
  787. if (i == UDF_SB_NUMPARTS(sb))
  788. {
  789. udf_debug("Partition (%d) not found in partition mapn", le16_to_cpu(p->partitionNumber));
  790. }
  791. else
  792. {
  793. udf_debug("Partition (%d:%d type %x) starts at physical %d, block length %dn",
  794. le16_to_cpu(p->partitionNumber), i, UDF_SB_PARTTYPE(sb,i),
  795. UDF_SB_PARTROOT(sb,i), UDF_SB_PARTLEN(sb,i));
  796. }
  797. }
  798. static int 
  799. udf_load_logicalvol(struct super_block *sb, struct buffer_head * bh, lb_addr *fileset)
  800. {
  801. struct LogicalVolDesc *lvd;
  802. int i, j, offset;
  803. Uint8 type;
  804. lvd = (struct LogicalVolDesc *)bh->b_data;
  805. UDF_SB_ALLOC_PARTMAPS(sb, le32_to_cpu(lvd->numPartitionMaps));
  806. for (i=0,offset=0;
  807.  i<UDF_SB_NUMPARTS(sb) && offset<le32_to_cpu(lvd->mapTableLength);
  808.  i++,offset+=((struct GenericPartitionMap *)&(lvd->partitionMaps[offset]))->partitionMapLength)
  809. {
  810. type = ((struct GenericPartitionMap *)&(lvd->partitionMaps[offset]))->partitionMapType;
  811. if (type == 1)
  812. {
  813. struct GenericPartitionMap1 *gpm1 = (struct GenericPartitionMap1 *)&(lvd->partitionMaps[offset]);
  814. UDF_SB_PARTTYPE(sb,i) = UDF_TYPE1_MAP15;
  815. UDF_SB_PARTVSN(sb,i) = le16_to_cpu(gpm1->volSeqNum);
  816. UDF_SB_PARTNUM(sb,i) = le16_to_cpu(gpm1->partitionNum);
  817. UDF_SB_PARTFUNC(sb,i) = NULL;
  818. }
  819. else if (type == 2)
  820. {
  821. struct UdfPartitionMap2 *upm2 = (struct UdfPartitionMap2 *)&(lvd->partitionMaps[offset]);
  822. if (!strncmp(upm2->partIdent.ident, UDF_ID_VIRTUAL, strlen(UDF_ID_VIRTUAL)))
  823. {
  824. if (le16_to_cpu(((Uint16 *)upm2->partIdent.identSuffix)[0]) == 0x0150)
  825. {
  826. UDF_SB_PARTTYPE(sb,i) = UDF_VIRTUAL_MAP15;
  827. UDF_SB_PARTFUNC(sb,i) = udf_get_pblock_virt15;
  828. }
  829. else if (le16_to_cpu(((Uint16 *)upm2->partIdent.identSuffix)[0]) == 0x0200)
  830. {
  831. UDF_SB_PARTTYPE(sb,i) = UDF_VIRTUAL_MAP20;
  832. UDF_SB_PARTFUNC(sb,i) = udf_get_pblock_virt20;
  833. }
  834. }
  835. else if (!strncmp(upm2->partIdent.ident, UDF_ID_SPARABLE, strlen(UDF_ID_SPARABLE)))
  836. {
  837. Uint32 loc;
  838. Uint16 ident;
  839. struct SparingTable *st;
  840. struct SparablePartitionMap *spm = (struct SparablePartitionMap *)&(lvd->partitionMaps[offset]);
  841. UDF_SB_PARTTYPE(sb,i) = UDF_SPARABLE_MAP15;
  842. UDF_SB_TYPESPAR(sb,i).s_packet_len = le16_to_cpu(spm->packetLength);
  843. for (j=0; j<spm->numSparingTables; j++)
  844. {
  845. loc = le32_to_cpu(spm->locSparingTable[j]);
  846. UDF_SB_TYPESPAR(sb,i).s_spar_map[j] =
  847. udf_read_tagged(sb, loc, loc, &ident);
  848. if (UDF_SB_TYPESPAR(sb,i).s_spar_map[j] != NULL)
  849. {
  850. st = (struct SparingTable *)UDF_SB_TYPESPAR(sb,i).s_spar_map[j]->b_data;
  851. if (ident != 0 ||
  852. strncmp(st->sparingIdent.ident, UDF_ID_SPARING, strlen(UDF_ID_SPARING)))
  853. {
  854. udf_release_data(UDF_SB_TYPESPAR(sb,i).s_spar_map[j]);
  855. UDF_SB_TYPESPAR(sb,i).s_spar_map[j] = NULL;
  856. }
  857. }
  858. }
  859. UDF_SB_PARTFUNC(sb,i) = udf_get_pblock_spar15;
  860. }
  861. else
  862. {
  863. udf_debug("Unknown ident: %sn", upm2->partIdent.ident);
  864. continue;
  865. }
  866. UDF_SB_PARTVSN(sb,i) = le16_to_cpu(upm2->volSeqNum);
  867. UDF_SB_PARTNUM(sb,i) = le16_to_cpu(upm2->partitionNum);
  868. }
  869. udf_debug("Partition (%d:%d) type %d on volume %dn",
  870. i, UDF_SB_PARTNUM(sb,i), type, UDF_SB_PARTVSN(sb,i));
  871. }
  872. if (fileset)
  873. {
  874. long_ad *la = (long_ad *)&(lvd->logicalVolContentsUse[0]);
  875. *fileset = lelb_to_cpu(la->extLocation);
  876. udf_debug("FileSet found in LogicalVolDesc at block=%d, partition=%dn",
  877. fileset->logicalBlockNum,
  878. fileset->partitionReferenceNum);
  879. }
  880. if (lvd->integritySeqExt.extLength)
  881. udf_load_logicalvolint(sb, leea_to_cpu(lvd->integritySeqExt));
  882. return 0;
  883. }
  884. /*
  885.  * udf_load_logicalvolint
  886.  *
  887.  */
  888. static void
  889. udf_load_logicalvolint(struct super_block *sb, extent_ad loc)
  890. {
  891. struct buffer_head *bh = NULL;
  892. Uint16 ident;
  893. while (loc.extLength > 0 &&
  894. (bh = udf_read_tagged(sb, loc.extLocation,
  895. loc.extLocation, &ident)) &&
  896. ident == TID_LOGICAL_VOL_INTEGRITY_DESC)
  897. {
  898. UDF_SB_LVIDBH(sb) = bh;
  899. if (UDF_SB_LVID(sb)->nextIntegrityExt.extLength)
  900. udf_load_logicalvolint(sb, leea_to_cpu(UDF_SB_LVID(sb)->nextIntegrityExt));
  901. if (UDF_SB_LVIDBH(sb) != bh)
  902. udf_release_data(bh);
  903. loc.extLength -= sb->s_blocksize;
  904. loc.extLocation ++;
  905. }
  906. if (UDF_SB_LVIDBH(sb) != bh)
  907. udf_release_data(bh);
  908. }
  909. /*
  910.  * udf_process_sequence
  911.  *
  912.  * PURPOSE
  913.  * Process a main/reserve volume descriptor sequence.
  914.  *
  915.  * PRE-CONDITIONS
  916.  * sb Pointer to _locked_ superblock.
  917.  * block First block of first extent of the sequence.
  918.  * lastblock Lastblock of first extent of the sequence.
  919.  *
  920.  * HISTORY
  921.  * July 1, 1997 - Andrew E. Mileski
  922.  * Written, tested, and released.
  923.  */
  924. static  int
  925. udf_process_sequence(struct super_block *sb, long block, long lastblock, lb_addr *fileset)
  926. {
  927. struct buffer_head *bh = NULL;
  928. struct udf_vds_record vds[VDS_POS_LENGTH];
  929. struct GenericDesc *gd;
  930. struct VolDescPtr *vdp;
  931. int done=0;
  932. int i,j;
  933. Uint32 vdsn;
  934. Uint16 ident;
  935. long next_s = 0, next_e = 0;
  936. memset(vds, 0, sizeof(struct udf_vds_record) * VDS_POS_LENGTH);
  937. /* Read the main descriptor sequence */
  938. for (;(!done && block <= lastblock); block++)
  939. {
  940. bh = udf_read_tagged(sb, block, block, &ident);
  941. if (!bh) 
  942. break;
  943. /* Process each descriptor (ISO 13346 3/8.3-8.4) */
  944. gd = (struct GenericDesc *)bh->b_data;
  945. vdsn = le32_to_cpu(gd->volDescSeqNum);
  946. switch (ident)
  947. {
  948. case TID_PRIMARY_VOL_DESC: /* ISO 13346 3/10.1 */
  949. if (vdsn >= vds[VDS_POS_PRIMARY_VOL_DESC].volDescSeqNum)
  950. {
  951. vds[VDS_POS_PRIMARY_VOL_DESC].volDescSeqNum = vdsn;
  952. vds[VDS_POS_PRIMARY_VOL_DESC].block = block;
  953. }
  954. break;
  955. case TID_VOL_DESC_PTR: /* ISO 13346 3/10.3 */
  956. if (vdsn >= vds[VDS_POS_VOL_DESC_PTR].volDescSeqNum)
  957. {
  958. vds[VDS_POS_VOL_DESC_PTR].volDescSeqNum = vdsn;
  959. vds[VDS_POS_VOL_DESC_PTR].block = block;
  960. vdp = (struct VolDescPtr *)bh->b_data;
  961. next_s = le32_to_cpu(vdp->nextVolDescSeqExt.extLocation);
  962. next_e = le32_to_cpu(vdp->nextVolDescSeqExt.extLength);
  963. next_e = next_e >> sb->s_blocksize_bits;
  964. next_e += next_s;
  965. }
  966. break;
  967. case TID_IMP_USE_VOL_DESC: /* ISO 13346 3/10.4 */
  968. if (vdsn >= vds[VDS_POS_IMP_USE_VOL_DESC].volDescSeqNum)
  969. {
  970. vds[VDS_POS_IMP_USE_VOL_DESC].volDescSeqNum = vdsn;
  971. vds[VDS_POS_IMP_USE_VOL_DESC].block = block;
  972. }
  973. break;
  974. case TID_PARTITION_DESC: /* ISO 13346 3/10.5 */
  975. if (!vds[VDS_POS_PARTITION_DESC].block)
  976. vds[VDS_POS_PARTITION_DESC].block = block;
  977. break;
  978. case TID_LOGICAL_VOL_DESC: /* ISO 13346 3/10.6 */
  979. if (vdsn >= vds[VDS_POS_LOGICAL_VOL_DESC].volDescSeqNum)
  980. {
  981. vds[VDS_POS_LOGICAL_VOL_DESC].volDescSeqNum = vdsn;
  982. vds[VDS_POS_LOGICAL_VOL_DESC].block = block;
  983. }
  984. break;
  985. case TID_UNALLOC_SPACE_DESC: /* ISO 13346 3/10.8 */
  986. if (vdsn >= vds[VDS_POS_UNALLOC_SPACE_DESC].volDescSeqNum)
  987. {
  988. vds[VDS_POS_UNALLOC_SPACE_DESC].volDescSeqNum = vdsn;
  989. vds[VDS_POS_UNALLOC_SPACE_DESC].block = block;
  990. }
  991. break;
  992. case TID_TERMINATING_DESC: /* ISO 13346 3/10.9 */
  993. vds[VDS_POS_TERMINATING_DESC].block = block;
  994. if (next_e)
  995. {
  996. block = next_s;
  997. lastblock = next_e;
  998. next_s = next_e = 0;
  999. }
  1000. else
  1001. done = 1;
  1002. break;
  1003. }
  1004. udf_release_data(bh);
  1005. }
  1006. for (i=0; i<VDS_POS_LENGTH; i++)
  1007. {
  1008. if (vds[i].block)
  1009. {
  1010. bh = udf_read_tagged(sb, vds[i].block, vds[i].block, &ident);
  1011. if (i == VDS_POS_PRIMARY_VOL_DESC)
  1012. udf_load_pvoldesc(sb, bh);
  1013. else if (i == VDS_POS_LOGICAL_VOL_DESC)
  1014. udf_load_logicalvol(sb, bh, fileset);
  1015. else if (i == VDS_POS_PARTITION_DESC)
  1016. {
  1017. struct buffer_head *bh2 = NULL;
  1018. udf_load_partdesc(sb, bh);
  1019. for (j=vds[i].block+1; j<vds[VDS_POS_TERMINATING_DESC].block; j++)
  1020. {
  1021. bh2 = udf_read_tagged(sb, j, j, &ident);
  1022. gd = (struct GenericDesc *)bh2->b_data;
  1023. if (ident == TID_PARTITION_DESC)
  1024. udf_load_partdesc(sb, bh2);
  1025. udf_release_data(bh2);
  1026. }
  1027. }
  1028. udf_release_data(bh);
  1029. }
  1030. }
  1031. return 0;
  1032. }
  1033. /*
  1034.  * udf_check_valid()
  1035.  */
  1036. static int
  1037. udf_check_valid(struct super_block *sb, int novrs, int silent)
  1038. {
  1039. long block;
  1040. if (novrs)
  1041. {
  1042. udf_debug("Validity check skipped because of novrs optionn");
  1043. return 0;
  1044. }
  1045. /* Check that it is NSR02 compliant */
  1046. /* Process any "CD-ROM Volume Descriptor Set" (ECMA 167 2/8.3.1) */
  1047. else if ((block = udf_vrs(sb, silent)) == -1)
  1048. {
  1049. udf_debug("Failed to read byte 32768. Assuming open disc. Skipping validity checkn");
  1050. if (!UDF_SB_LASTBLOCK(sb))
  1051. UDF_SB_LASTBLOCK(sb) = udf_get_last_block(sb);
  1052. return 0;
  1053. }
  1054. else 
  1055. return !block;
  1056. }
  1057. static int
  1058. udf_load_partition(struct super_block *sb, lb_addr *fileset)
  1059. {
  1060. struct AnchorVolDescPtr *anchor;
  1061. Uint16 ident;
  1062. struct buffer_head *bh;
  1063. long main_s, main_e, reserve_s, reserve_e;
  1064. int i, j;
  1065. if (!sb)
  1066. return 1;
  1067. for (i=0; i<sizeof(UDF_SB_ANCHOR(sb))/sizeof(int); i++)
  1068. {
  1069. if (UDF_SB_ANCHOR(sb)[i] && (bh = udf_read_tagged(sb,
  1070. UDF_SB_ANCHOR(sb)[i], UDF_SB_ANCHOR(sb)[i], &ident)))
  1071. {
  1072. anchor = (struct AnchorVolDescPtr *)bh->b_data;
  1073. /* Locate the main sequence */
  1074. main_s = le32_to_cpu( anchor->mainVolDescSeqExt.extLocation );
  1075. main_e = le32_to_cpu( anchor->mainVolDescSeqExt.extLength );
  1076. main_e = main_e >> sb->s_blocksize_bits;
  1077. main_e += main_s;
  1078. /* Locate the reserve sequence */
  1079. reserve_s = le32_to_cpu(anchor->reserveVolDescSeqExt.extLocation);
  1080. reserve_e = le32_to_cpu(anchor->reserveVolDescSeqExt.extLength);
  1081. reserve_e = reserve_e >> sb->s_blocksize_bits;
  1082. reserve_e += reserve_s;
  1083. udf_release_data(bh);
  1084. /* Process the main & reserve sequences */
  1085. /* responsible for finding the PartitionDesc(s) */
  1086. if (!(udf_process_sequence(sb, main_s, main_e, fileset) &&
  1087. udf_process_sequence(sb, reserve_s, reserve_e, fileset)))
  1088. {
  1089. break;
  1090. }
  1091. }
  1092. }
  1093. if (i == sizeof(UDF_SB_ANCHOR(sb))/sizeof(int))
  1094. {
  1095. udf_debug("No Anchor block foundn");
  1096. return 1;
  1097. }
  1098. else
  1099. udf_debug("Using anchor in block %dn", UDF_SB_ANCHOR(sb)[i]);
  1100. for (i=0; i<UDF_SB_NUMPARTS(sb); i++)
  1101. {
  1102. switch UDF_SB_PARTTYPE(sb, i)
  1103. {
  1104. case UDF_VIRTUAL_MAP15:
  1105. case UDF_VIRTUAL_MAP20:
  1106. {
  1107. lb_addr ino;
  1108. if (!UDF_SB_LASTBLOCK(sb))
  1109. {
  1110. UDF_SB_LASTBLOCK(sb) = udf_get_last_block(sb);
  1111. udf_find_anchor(sb);
  1112. }
  1113. if (!UDF_SB_LASTBLOCK(sb))
  1114. {
  1115. udf_debug("Unable to determine Lastblock (For Virtual Partition)n");
  1116. return 1;
  1117. }
  1118. for (j=0; j<UDF_SB_NUMPARTS(sb); j++)
  1119. {
  1120. if (j != i &&
  1121. UDF_SB_PARTVSN(sb,i) == UDF_SB_PARTVSN(sb,j) &&
  1122. UDF_SB_PARTNUM(sb,i) == UDF_SB_PARTNUM(sb,j))
  1123. {
  1124. ino.partitionReferenceNum = j;
  1125. ino.logicalBlockNum = UDF_SB_LASTBLOCK(sb) -
  1126. UDF_SB_PARTROOT(sb,j);
  1127. break;
  1128. }
  1129. }
  1130. if (j == UDF_SB_NUMPARTS(sb))
  1131. return 1;
  1132. if (!(UDF_SB_VAT(sb) = udf_iget(sb, ino)))
  1133. return 1;
  1134. if (UDF_SB_PARTTYPE(sb,i) == UDF_VIRTUAL_MAP15)
  1135. {
  1136. UDF_SB_TYPEVIRT(sb,i).s_start_offset = udf_ext0_offset(UDF_SB_VAT(sb));
  1137. UDF_SB_TYPEVIRT(sb,i).s_num_entries = (UDF_SB_VAT(sb)->i_size - 36) >> 2;
  1138. }
  1139. else if (UDF_SB_PARTTYPE(sb,i) == UDF_VIRTUAL_MAP20)
  1140. {
  1141. struct buffer_head *bh = NULL;
  1142. Uint32 pos;
  1143. pos = udf_block_map(UDF_SB_VAT(sb), 0);
  1144. bh = sb_bread(sb, pos);
  1145. UDF_SB_TYPEVIRT(sb,i).s_start_offset =
  1146. le16_to_cpu(((struct VirtualAllocationTable20 *)bh->b_data + udf_ext0_offset(UDF_SB_VAT(sb)))->lengthHeader) +
  1147. udf_ext0_offset(UDF_SB_VAT(sb));
  1148. UDF_SB_TYPEVIRT(sb,i).s_num_entries = (UDF_SB_VAT(sb)->i_size -
  1149. UDF_SB_TYPEVIRT(sb,i).s_start_offset) >> 2;
  1150. udf_release_data(bh);
  1151. }
  1152. UDF_SB_PARTROOT(sb,i) = udf_get_pblock(sb, 0, i, 0);
  1153. UDF_SB_PARTLEN(sb,i) = UDF_SB_PARTLEN(sb,ino.partitionReferenceNum);
  1154. }
  1155. }
  1156. }
  1157. return 0;
  1158. }
  1159. static void udf_open_lvid(struct super_block *sb)
  1160. {
  1161. if (UDF_SB_LVIDBH(sb))
  1162. {
  1163. int i;
  1164. timestamp cpu_time;
  1165. UDF_SB_LVIDIU(sb)->impIdent.identSuffix[0] = UDF_OS_CLASS_UNIX;
  1166. UDF_SB_LVIDIU(sb)->impIdent.identSuffix[1] = UDF_OS_ID_LINUX;
  1167. if (udf_time_to_stamp(&cpu_time, CURRENT_TIME, CURRENT_UTIME))
  1168. UDF_SB_LVID(sb)->recordingDateAndTime = cpu_to_lets(cpu_time);
  1169. UDF_SB_LVID(sb)->integrityType = INTEGRITY_TYPE_OPEN;
  1170. UDF_SB_LVID(sb)->descTag.descCRC =
  1171. cpu_to_le16(udf_crc((char *)UDF_SB_LVID(sb) + sizeof(tag),
  1172. le16_to_cpu(UDF_SB_LVID(sb)->descTag.descCRCLength), 0));
  1173. UDF_SB_LVID(sb)->descTag.tagChecksum = 0;
  1174. for (i=0; i<16; i++)
  1175. if (i != 4)
  1176. UDF_SB_LVID(sb)->descTag.tagChecksum +=
  1177. ((Uint8 *)&(UDF_SB_LVID(sb)->descTag))[i];
  1178. mark_buffer_dirty(UDF_SB_LVIDBH(sb));
  1179. }
  1180. }
  1181. static void udf_close_lvid(struct super_block *sb)
  1182. {
  1183. if (UDF_SB_LVIDBH(sb) &&
  1184. UDF_SB_LVID(sb)->integrityType == INTEGRITY_TYPE_OPEN)
  1185. {
  1186. int i;
  1187. timestamp cpu_time;
  1188. UDF_SB_LVIDIU(sb)->impIdent.identSuffix[0] = UDF_OS_CLASS_UNIX;
  1189. UDF_SB_LVIDIU(sb)->impIdent.identSuffix[1] = UDF_OS_ID_LINUX;
  1190. if (udf_time_to_stamp(&cpu_time, CURRENT_TIME, CURRENT_UTIME))
  1191. UDF_SB_LVID(sb)->recordingDateAndTime = cpu_to_lets(cpu_time);
  1192. if (UDF_MAX_WRITE_VERSION > le16_to_cpu(UDF_SB_LVIDIU(sb)->maxUDFWriteRev))
  1193. UDF_SB_LVIDIU(sb)->maxUDFWriteRev = cpu_to_le16(UDF_MAX_WRITE_VERSION);
  1194. if (UDF_SB_UDFREV(sb) > le16_to_cpu(UDF_SB_LVIDIU(sb)->minUDFReadRev))
  1195. UDF_SB_LVIDIU(sb)->minUDFReadRev = cpu_to_le16(UDF_SB_UDFREV(sb));
  1196. if (UDF_SB_UDFREV(sb) > le16_to_cpu(UDF_SB_LVIDIU(sb)->minUDFWriteRev))
  1197. UDF_SB_LVIDIU(sb)->minUDFWriteRev = cpu_to_le16(UDF_SB_UDFREV(sb));
  1198. UDF_SB_LVID(sb)->integrityType = INTEGRITY_TYPE_CLOSE;
  1199. UDF_SB_LVID(sb)->descTag.descCRC =
  1200. cpu_to_le16(udf_crc((char *)UDF_SB_LVID(sb) + sizeof(tag),
  1201. le16_to_cpu(UDF_SB_LVID(sb)->descTag.descCRCLength), 0));
  1202. UDF_SB_LVID(sb)->descTag.tagChecksum = 0;
  1203. for (i=0; i<16; i++)
  1204. if (i != 4)
  1205. UDF_SB_LVID(sb)->descTag.tagChecksum +=
  1206. ((Uint8 *)&(UDF_SB_LVID(sb)->descTag))[i];
  1207. mark_buffer_dirty(UDF_SB_LVIDBH(sb));
  1208. }
  1209. }
  1210. /*
  1211.  * udf_read_super
  1212.  *
  1213.  * PURPOSE
  1214.  * Complete the specified super block.
  1215.  *
  1216.  * PRE-CONDITIONS
  1217.  * sb Pointer to superblock to complete - never NULL.
  1218.  * sb->s_dev Device to read suberblock from.
  1219.  * options Pointer to mount options.
  1220.  * silent Silent flag.
  1221.  *
  1222.  * HISTORY
  1223.  * July 1, 1997 - Andrew E. Mileski
  1224.  * Written, tested, and released.
  1225.  */
  1226. static struct super_block *
  1227. udf_read_super(struct super_block *sb, void *options, int silent)
  1228. {
  1229. int i;
  1230. struct inode *inode=NULL;
  1231. struct udf_options uopt;
  1232. lb_addr rootdir, fileset;
  1233. uopt.flags = (1 << UDF_FLAG_USE_AD_IN_ICB) | (1 << UDF_FLAG_STRICT);
  1234. uopt.uid = -1;
  1235. uopt.gid = -1;
  1236. uopt.umask = 0;
  1237. memset(UDF_SB(sb), 0x00, sizeof(struct udf_sb_info));
  1238. #if UDFFS_RW != 1
  1239. sb->s_flags |= MS_RDONLY;
  1240. #endif
  1241. if (!udf_parse_options((char *)options, &uopt))
  1242. goto error_out;
  1243. if (uopt.flags & (1 << UDF_FLAG_UTF8) &&
  1244.     uopt.flags & (1 << UDF_FLAG_NLS_MAP))
  1245. {
  1246. udf_error(sb, "udf_read_super",
  1247. "utf8 cannot be combined with iocharsetn");
  1248. goto error_out;
  1249. }
  1250. #ifdef CONFIG_NLS
  1251. if ((uopt.flags & (1 << UDF_FLAG_NLS_MAP)) && !uopt.nls_map)
  1252. {
  1253. uopt.nls_map = load_nls_default();
  1254. if (!uopt.nls_map)
  1255. uopt.flags &= ~(1 << UDF_FLAG_NLS_MAP);
  1256. else
  1257. udf_debug("Using default NLS mapn");
  1258. }
  1259. #endif
  1260. if (!(uopt.flags & (1 << UDF_FLAG_NLS_MAP)))
  1261. uopt.flags |= (1 << UDF_FLAG_UTF8);
  1262. fileset.logicalBlockNum = 0xFFFFFFFF;
  1263. fileset.partitionReferenceNum = 0xFFFF;
  1264. UDF_SB(sb)->s_flags = uopt.flags;
  1265. UDF_SB(sb)->s_uid = uopt.uid;
  1266. UDF_SB(sb)->s_gid = uopt.gid;
  1267. UDF_SB(sb)->s_umask = uopt.umask;
  1268. UDF_SB(sb)->s_nls_map = uopt.nls_map;
  1269. /* Set the block size for all transfers */
  1270. if (!udf_set_blocksize(sb, uopt.blocksize))
  1271. goto error_out;
  1272. if ( uopt.session == 0xFFFFFFFF )
  1273. UDF_SB_SESSION(sb) = udf_get_last_session(sb);
  1274. else
  1275. UDF_SB_SESSION(sb) = uopt.session;
  1276. udf_debug("Multi-session=%dn", UDF_SB_SESSION(sb));
  1277. UDF_SB_LASTBLOCK(sb) = uopt.lastblock;
  1278. UDF_SB_ANCHOR(sb)[0] = UDF_SB_ANCHOR(sb)[1] = 0;
  1279. UDF_SB_ANCHOR(sb)[2] = uopt.anchor;
  1280. UDF_SB_ANCHOR(sb)[3] = UDF_SB_SESSION(sb) + 256;
  1281. if (udf_check_valid(sb, uopt.novrs, silent)) /* read volume recognition sequences */
  1282. {
  1283. printk("UDF-fs: No VRS foundn");
  1284.   goto error_out;
  1285. }
  1286. udf_find_anchor(sb);
  1287. /* Fill in the rest of the superblock */
  1288. sb->s_op = &udf_sb_ops;
  1289. sb->dq_op = NULL;
  1290. sb->s_dirt = 0;
  1291. sb->s_magic = UDF_SUPER_MAGIC;
  1292. if (udf_load_partition(sb, &fileset))
  1293. {
  1294. printk("UDF-fs: No partition found (1)n");
  1295. goto error_out;
  1296. }
  1297. udf_debug("Lastblock=%dn", UDF_SB_LASTBLOCK(sb));
  1298. if ( UDF_SB_LVIDBH(sb) )
  1299. {
  1300. Uint16 minUDFReadRev = le16_to_cpu(UDF_SB_LVIDIU(sb)->minUDFReadRev);
  1301. Uint16 minUDFWriteRev = le16_to_cpu(UDF_SB_LVIDIU(sb)->minUDFWriteRev);
  1302. /* Uint16 maxUDFWriteRev = le16_to_cpu(UDF_SB_LVIDIU(sb)->maxUDFWriteRev); */
  1303. if (minUDFReadRev > UDF_MAX_READ_VERSION)
  1304. {
  1305. printk("UDF-fs: minUDFReadRev=%x (max is %x)n",
  1306. UDF_SB_LVIDIU(sb)->minUDFReadRev, UDF_MAX_READ_VERSION);
  1307. goto error_out;
  1308. }
  1309. else if (minUDFWriteRev > UDF_MAX_WRITE_VERSION)
  1310. {
  1311. sb->s_flags |= MS_RDONLY;
  1312. }
  1313. UDF_SB_UDFREV(sb) = minUDFWriteRev;
  1314. if (minUDFReadRev >= UDF_VERS_USE_EXTENDED_FE)
  1315. UDF_SET_FLAG(sb, UDF_FLAG_USE_EXTENDED_FE);
  1316. if (minUDFReadRev >= UDF_VERS_USE_STREAMS)
  1317. UDF_SET_FLAG(sb, UDF_FLAG_USE_STREAMS);
  1318. }
  1319. if ( !UDF_SB_NUMPARTS(sb) )
  1320. {
  1321. printk("UDF-fs: No partition found (2)n");
  1322. goto error_out;
  1323. }
  1324. if ( udf_find_fileset(sb, &fileset, &rootdir) )
  1325. {
  1326. printk("UDF-fs: No fileset foundn");
  1327. goto error_out;
  1328. }
  1329. if (!silent)
  1330. {
  1331. timestamp ts;
  1332. udf_time_to_stamp(&ts, UDF_SB_RECORDTIME(sb), 0);
  1333. udf_info("UDF %s-%s (%s) Mounting volume '%s', timestamp %04u/%02u/%02u %02u:%02u (%x)n",
  1334. UDFFS_VERSION, UDFFS_RW ? "rw" : "ro", UDFFS_DATE,
  1335. UDF_SB_VOLIDENT(sb), ts.year, ts.month, ts.day, ts.hour, ts.minute,
  1336. ts.typeAndTimezone);
  1337. }
  1338. if (!(sb->s_flags & MS_RDONLY))
  1339. udf_open_lvid(sb);
  1340. /* Assign the root inode */
  1341. /* assign inodes by physical block number */
  1342. /* perhaps it's not extensible enough, but for now ... */
  1343. inode = udf_iget(sb, rootdir); 
  1344. if (!inode)
  1345. {
  1346. printk("UDF-fs: Error in udf_iget, block=%d, partition=%dn",
  1347. rootdir.logicalBlockNum, rootdir.partitionReferenceNum);
  1348. goto error_out;
  1349. }
  1350. /* Allocate a dentry for the root inode */
  1351. sb->s_root = d_alloc_root(inode);
  1352. if (!sb->s_root)
  1353. {
  1354. printk("UDF-fs: Couldn't allocate root dentryn");
  1355. iput(inode);
  1356. goto error_out;
  1357. }
  1358. sb->s_maxbytes = ~0ULL;
  1359. return sb;
  1360. error_out:
  1361. if (UDF_SB_VAT(sb))
  1362. iput(UDF_SB_VAT(sb));
  1363. if (UDF_SB_NUMPARTS(sb))
  1364. {
  1365. if (UDF_SB_PARTFLAGS(sb, UDF_SB_PARTITION(sb)) & UDF_PART_FLAG_UNALLOC_TABLE)
  1366. iput(UDF_SB_PARTMAPS(sb)[UDF_SB_PARTITION(sb)].s_uspace.s_table);
  1367. if (UDF_SB_PARTFLAGS(sb, UDF_SB_PARTITION(sb)) & UDF_PART_FLAG_FREED_TABLE)
  1368. iput(UDF_SB_PARTMAPS(sb)[UDF_SB_PARTITION(sb)].s_fspace.s_table);
  1369. if (UDF_SB_PARTFLAGS(sb, UDF_SB_PARTITION(sb)) & UDF_PART_FLAG_UNALLOC_BITMAP)
  1370. {
  1371. for (i=0; i<UDF_SB_BITMAP_NR_GROUPS(sb,UDF_SB_PARTITION(sb),s_uspace); i++)
  1372. {
  1373. if (UDF_SB_BITMAP(sb,UDF_SB_PARTITION(sb),s_uspace,i))
  1374. udf_release_data(UDF_SB_BITMAP(sb,UDF_SB_PARTITION(sb),s_uspace,i));
  1375. }
  1376. kfree(UDF_SB_PARTMAPS(sb)[UDF_SB_PARTITION(sb)].s_uspace.s_bitmap);
  1377. }
  1378. if (UDF_SB_PARTFLAGS(sb, UDF_SB_PARTITION(sb)) & UDF_PART_FLAG_FREED_BITMAP)
  1379. {
  1380. for (i=0; i<UDF_SB_BITMAP_NR_GROUPS(sb,UDF_SB_PARTITION(sb),s_fspace); i++)
  1381. {
  1382. if (UDF_SB_BITMAP(sb,UDF_SB_PARTITION(sb),s_fspace,i))
  1383. udf_release_data(UDF_SB_BITMAP(sb,UDF_SB_PARTITION(sb),s_fspace,i));
  1384. }
  1385. kfree(UDF_SB_PARTMAPS(sb)[UDF_SB_PARTITION(sb)].s_fspace.s_bitmap);
  1386. }
  1387. if (UDF_SB_PARTTYPE(sb, UDF_SB_PARTITION(sb)) == UDF_SPARABLE_MAP15)
  1388. {
  1389. for (i=0; i<4; i++)
  1390. udf_release_data(UDF_SB_TYPESPAR(sb, UDF_SB_PARTITION(sb)).s_spar_map[i]);
  1391. }
  1392. }
  1393. #ifdef CONFIG_NLS
  1394. if (UDF_QUERY_FLAG(sb, UDF_FLAG_NLS_MAP))
  1395. unload_nls(UDF_SB(sb)->s_nls_map);
  1396. #endif
  1397. if (!(sb->s_flags & MS_RDONLY))
  1398. udf_close_lvid(sb);
  1399. udf_release_data(UDF_SB_LVIDBH(sb));
  1400. UDF_SB_FREE(sb);
  1401. return NULL;
  1402. }
  1403. void udf_error(struct super_block *sb, const char *function,
  1404. const char *fmt, ...)
  1405. {
  1406. va_list args;
  1407. if (!(sb->s_flags & MS_RDONLY))
  1408. {
  1409. /* mark sb error */
  1410. sb->s_dirt = 1;
  1411. }
  1412. va_start(args, fmt);
  1413. vsprintf(error_buf, fmt, args);
  1414. va_end(args);
  1415. printk (KERN_CRIT "UDF-fs error (device %s): %s: %sn",
  1416. bdevname(sb->s_dev), function, error_buf);
  1417. }
  1418. void udf_warning(struct super_block *sb, const char *function,
  1419. const char *fmt, ...)
  1420. {
  1421. va_list args;
  1422. va_start (args, fmt);
  1423. vsprintf(error_buf, fmt, args);
  1424. va_end(args);
  1425. printk(KERN_WARNING "UDF-fs warning (device %s): %s: %sn",
  1426. bdevname(sb->s_dev), function, error_buf);
  1427. }
  1428. /*
  1429.  * udf_put_super
  1430.  *
  1431.  * PURPOSE
  1432.  * Prepare for destruction of the superblock.
  1433.  *
  1434.  * DESCRIPTION
  1435.  * Called before the filesystem is unmounted.
  1436.  *
  1437.  * HISTORY
  1438.  * July 1, 1997 - Andrew E. Mileski
  1439.  * Written, tested, and released.
  1440.  */
  1441. static void
  1442. udf_put_super(struct super_block *sb)
  1443. {
  1444. int i;
  1445. if (UDF_SB_VAT(sb))
  1446. iput(UDF_SB_VAT(sb));
  1447. if (UDF_SB_NUMPARTS(sb))
  1448. {
  1449. if (UDF_SB_PARTFLAGS(sb, UDF_SB_PARTITION(sb)) & UDF_PART_FLAG_UNALLOC_TABLE)
  1450. iput(UDF_SB_PARTMAPS(sb)[UDF_SB_PARTITION(sb)].s_uspace.s_table);
  1451. if (UDF_SB_PARTFLAGS(sb, UDF_SB_PARTITION(sb)) & UDF_PART_FLAG_FREED_TABLE)
  1452. iput(UDF_SB_PARTMAPS(sb)[UDF_SB_PARTITION(sb)].s_fspace.s_table);
  1453. if (UDF_SB_PARTFLAGS(sb, UDF_SB_PARTITION(sb)) & UDF_PART_FLAG_UNALLOC_BITMAP)
  1454. {
  1455. for (i=0; i<UDF_SB_BITMAP_NR_GROUPS(sb,UDF_SB_PARTITION(sb),s_uspace); i++)
  1456. {
  1457. if (UDF_SB_BITMAP(sb,UDF_SB_PARTITION(sb),s_uspace,i))
  1458. udf_release_data(UDF_SB_BITMAP(sb,UDF_SB_PARTITION(sb),s_uspace,i));
  1459. }
  1460. kfree(UDF_SB_PARTMAPS(sb)[UDF_SB_PARTITION(sb)].s_uspace.s_bitmap);
  1461. }
  1462. if (UDF_SB_PARTFLAGS(sb, UDF_SB_PARTITION(sb)) & UDF_PART_FLAG_FREED_BITMAP)
  1463. {
  1464. for (i=0; i<UDF_SB_BITMAP_NR_GROUPS(sb,UDF_SB_PARTITION(sb),s_fspace); i++)
  1465. {
  1466. if (UDF_SB_BITMAP(sb,UDF_SB_PARTITION(sb),s_fspace,i))
  1467. udf_release_data(UDF_SB_BITMAP(sb,UDF_SB_PARTITION(sb),s_fspace,i));
  1468. }
  1469. kfree(UDF_SB_PARTMAPS(sb)[UDF_SB_PARTITION(sb)].s_fspace.s_bitmap);
  1470. }
  1471. if (UDF_SB_PARTTYPE(sb, UDF_SB_PARTITION(sb)) == UDF_SPARABLE_MAP15)
  1472. {
  1473. for (i=0; i<4; i++)
  1474. udf_release_data(UDF_SB_TYPESPAR(sb, UDF_SB_PARTITION(sb)).s_spar_map[i]);
  1475. }
  1476. }
  1477. #ifdef CONFIG_NLS
  1478. if (UDF_QUERY_FLAG(sb, UDF_FLAG_NLS_MAP))
  1479. unload_nls(UDF_SB(sb)->s_nls_map);
  1480. #endif
  1481. if (!(sb->s_flags & MS_RDONLY))
  1482. udf_close_lvid(sb);
  1483. udf_release_data(UDF_SB_LVIDBH(sb));
  1484. UDF_SB_FREE(sb);
  1485. }
  1486. /*
  1487.  * udf_stat_fs
  1488.  *
  1489.  * PURPOSE
  1490.  * Return info about the filesystem.
  1491.  *
  1492.  * DESCRIPTION
  1493.  * Called by sys_statfs()
  1494.  *
  1495.  * HISTORY
  1496.  * July 1, 1997 - Andrew E. Mileski
  1497.  * Written, tested, and released.
  1498.  */
  1499. static int
  1500. udf_statfs(struct super_block *sb, struct statfs *buf)
  1501. {
  1502. buf->f_type = UDF_SUPER_MAGIC;
  1503. buf->f_bsize = sb->s_blocksize;
  1504. buf->f_blocks = UDF_SB_PARTLEN(sb, UDF_SB_PARTITION(sb));
  1505. buf->f_bfree = udf_count_free(sb);
  1506. buf->f_bavail = buf->f_bfree;
  1507. buf->f_files = (UDF_SB_LVIDBH(sb) ?
  1508. (le32_to_cpu(UDF_SB_LVIDIU(sb)->numFiles) +
  1509. le32_to_cpu(UDF_SB_LVIDIU(sb)->numDirs)) : 0) + buf->f_bfree;
  1510. buf->f_ffree = buf->f_bfree;
  1511. /* __kernel_fsid_t f_fsid */
  1512. buf->f_namelen = UDF_NAME_LEN;
  1513. return 0;
  1514. }
  1515. static unsigned char udf_bitmap_lookup[16] = {
  1516. 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4
  1517. };
  1518. static unsigned int
  1519. udf_count_free_bitmap(struct super_block *sb, struct udf_bitmap *bitmap)
  1520. {
  1521. struct buffer_head *bh = NULL;
  1522. unsigned int accum = 0;
  1523. int index;
  1524. int block = 0, newblock;
  1525. lb_addr loc;
  1526. Uint32 bytes;
  1527. Uint8 value;
  1528. Uint8 *ptr;
  1529. Uint16 ident;
  1530. struct SpaceBitmapDesc *bm;
  1531. loc.logicalBlockNum = bitmap->s_extPosition;
  1532. loc.partitionReferenceNum = UDF_SB_PARTITION(sb);
  1533. bh = udf_read_ptagged(sb, loc, 0, &ident);
  1534. if (!bh)
  1535. {
  1536. printk(KERN_ERR "udf: udf_count_free failedn");
  1537. return 0;
  1538. }
  1539. else if (ident != TID_SPACE_BITMAP_DESC)
  1540. {
  1541. udf_release_data(bh);
  1542. printk(KERN_ERR "udf: udf_count_free failedn");
  1543. return 0;
  1544. }
  1545. bm = (struct SpaceBitmapDesc *)bh->b_data;
  1546. bytes = bm->numOfBytes;
  1547. index = sizeof(struct SpaceBitmapDesc); /* offset in first block only */
  1548. ptr = (Uint8 *)bh->b_data;
  1549. while ( bytes > 0 )
  1550. {
  1551. while ((bytes > 0) && (index < sb->s_blocksize))
  1552. {
  1553. value = ptr[index];
  1554. accum += udf_bitmap_lookup[ value & 0x0f ];
  1555. accum += udf_bitmap_lookup[ value >> 4 ];
  1556. index++;
  1557. bytes--;
  1558. }
  1559. if ( bytes )
  1560. {
  1561. udf_release_data(bh);
  1562. newblock = udf_get_lb_pblock(sb, loc, ++block);
  1563. bh = udf_tread(sb, newblock);
  1564. if (!bh)
  1565. {
  1566. udf_debug("read failedn");
  1567. return accum;
  1568. }
  1569. index = 0;
  1570. ptr = (Uint8 *)bh->b_data;
  1571. }
  1572. }
  1573. udf_release_data(bh);
  1574. return accum;
  1575. }
  1576. static unsigned int
  1577. udf_count_free_table(struct super_block *sb, struct inode * table)
  1578. {
  1579. unsigned int accum = 0;
  1580. Uint32 extoffset, elen;
  1581. lb_addr bloc, eloc;
  1582. Sint8 etype;
  1583. struct buffer_head *bh = NULL;
  1584. bloc = UDF_I_LOCATION(table);
  1585. extoffset = sizeof(struct UnallocatedSpaceEntry);
  1586. while ((etype = udf_next_aext(table, &bloc, &extoffset, &eloc, &elen, &bh, 1)) != -1)
  1587. {
  1588. accum += (elen >> table->i_sb->s_blocksize_bits);
  1589. }
  1590. udf_release_data(bh);
  1591. return accum;
  1592. }
  1593. static unsigned int
  1594. udf_count_free(struct super_block *sb)
  1595. {
  1596. unsigned int accum = 0;
  1597. if (UDF_SB_LVIDBH(sb))
  1598. {
  1599. if (le32_to_cpu(UDF_SB_LVID(sb)->numOfPartitions) > UDF_SB_PARTITION(sb))
  1600. {
  1601. accum = le32_to_cpu(UDF_SB_LVID(sb)->freeSpaceTable[UDF_SB_PARTITION(sb)]);
  1602. if (accum == 0xFFFFFFFF)
  1603. accum = 0;
  1604. }
  1605. }
  1606. if (accum)
  1607. return accum;
  1608. if (UDF_SB_PARTFLAGS(sb,UDF_SB_PARTITION(sb)) & UDF_PART_FLAG_UNALLOC_BITMAP)
  1609. {
  1610. accum += udf_count_free_bitmap(sb,
  1611. UDF_SB_PARTMAPS(sb)[UDF_SB_PARTITION(sb)].s_uspace.s_bitmap);
  1612. }
  1613. if (UDF_SB_PARTFLAGS(sb,UDF_SB_PARTITION(sb)) & UDF_PART_FLAG_FREED_BITMAP)
  1614. {
  1615. accum += udf_count_free_bitmap(sb,
  1616. UDF_SB_PARTMAPS(sb)[UDF_SB_PARTITION(sb)].s_fspace.s_bitmap);
  1617. }
  1618. if (accum)
  1619. return accum;
  1620. if (UDF_SB_PARTFLAGS(sb,UDF_SB_PARTITION(sb)) & UDF_PART_FLAG_UNALLOC_TABLE)
  1621. {
  1622. accum += udf_count_free_table(sb,
  1623. UDF_SB_PARTMAPS(sb)[UDF_SB_PARTITION(sb)].s_uspace.s_table);
  1624. }
  1625. if (UDF_SB_PARTFLAGS(sb,UDF_SB_PARTITION(sb)) & UDF_PART_FLAG_FREED_TABLE)
  1626. {
  1627. accum += udf_count_free_table(sb,
  1628. UDF_SB_PARTMAPS(sb)[UDF_SB_PARTITION(sb)].s_fspace.s_table);
  1629. }
  1630. return accum;
  1631. }