lowlevel.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:2k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * lowlevel.c
  3.  *
  4.  * PURPOSE
  5.  *  Low Level Device Routines for the UDF filesystem
  6.  *
  7.  * CONTACTS
  8.  * E-mail regarding any portion of the Linux UDF file system should be
  9.  * directed to the development team mailing list (run by majordomo):
  10.  * linux_udf@hpesjro.fc.hp.com
  11.  *
  12.  * COPYRIGHT
  13.  * This file is distributed under the terms of the GNU General Public
  14.  * License (GPL). Copies of the GPL can be obtained from:
  15.  * ftp://prep.ai.mit.edu/pub/gnu/GPL
  16.  * Each contributing author retains all rights to their own work.
  17.  *
  18.  *  (C) 1999-2001 Ben Fennema
  19.  *
  20.  * HISTORY
  21.  *
  22.  *  03/26/99 blf  Created.
  23.  */
  24. #include "udfdecl.h"
  25. #include <linux/blkdev.h>
  26. #include <linux/cdrom.h>
  27. #include <asm/uaccess.h>
  28. #include <scsi/scsi.h>
  29. typedef struct scsi_device Scsi_Device;
  30. typedef struct scsi_cmnd   Scsi_Cmnd;
  31. #include <scsi/scsi_ioctl.h>
  32. #include <linux/udf_fs.h>
  33. #include "udf_sb.h"
  34. unsigned int 
  35. udf_get_last_session(struct super_block *sb)
  36. {
  37. struct cdrom_multisession ms_info;
  38. unsigned int vol_desc_start;
  39. struct block_device *bdev = sb->s_bdev;
  40. int i;
  41. vol_desc_start=0;
  42. ms_info.addr_format=CDROM_LBA;
  43. i = ioctl_by_bdev(bdev, CDROMMULTISESSION, (unsigned long) &ms_info);
  44. #define WE_OBEY_THE_WRITTEN_STANDARDS 1
  45. if (i == 0)
  46. {
  47. udf_debug("XA disk: %s, vol_desc_start=%dn",
  48. (ms_info.xa_flag ? "yes" : "no"), ms_info.addr.lba);
  49. #if WE_OBEY_THE_WRITTEN_STANDARDS
  50. if (ms_info.xa_flag) /* necessary for a valid ms_info.addr */
  51. #endif
  52. vol_desc_start = ms_info.addr.lba;
  53. }
  54. else
  55. {
  56. udf_debug("CDROMMULTISESSION not supported: rc=%dn", i);
  57. }
  58. return vol_desc_start;
  59. }
  60. unsigned long
  61. udf_get_last_block(struct super_block *sb)
  62. {
  63. struct block_device *bdev = sb->s_bdev;
  64. int ret;
  65. unsigned long lblock = 0;
  66. ret = ioctl_by_bdev(bdev, CDROM_LAST_WRITTEN, (unsigned long) &lblock);
  67. if (ret) /* Hard Disk */
  68. {
  69. ret = ioctl_by_bdev(bdev, BLKGETSIZE, (unsigned long) &lblock);
  70. if (!ret && lblock != 0x7FFFFFFF)
  71. lblock = ((512 * lblock) / sb->s_blocksize);
  72. }
  73. if (!ret && lblock)
  74. return lblock - 1;
  75. else
  76. return 0;
  77. }