2005-04-17 02:20:36 +04:00
/*
* lowlevel . c
*
* PURPOSE
* Low Level Device Routines for the UDF filesystem
*
* COPYRIGHT
* This file is distributed under the terms of the GNU General Public
* License ( GPL ) . Copies of the GPL can be obtained from :
* ftp : //prep.ai.mit.edu/pub/gnu/GPL
* Each contributing author retains all rights to their own work .
*
* ( C ) 1999 - 2001 Ben Fennema
*
* HISTORY
*
* 03 / 26 / 99 blf Created .
*/
# include "udfdecl.h"
# include <linux/blkdev.h>
# include <linux/cdrom.h>
# include <asm/uaccess.h>
# include "udf_sb.h"
2007-07-19 12:47:43 +04:00
unsigned int udf_get_last_session ( struct super_block * sb )
2005-04-17 02:20:36 +04:00
{
struct cdrom_multisession ms_info ;
unsigned int vol_desc_start ;
struct block_device * bdev = sb - > s_bdev ;
int i ;
2007-07-19 12:47:43 +04:00
vol_desc_start = 0 ;
ms_info . addr_format = CDROM_LBA ;
i = ioctl_by_bdev ( bdev , CDROMMULTISESSION , ( unsigned long ) & ms_info ) ;
2005-04-17 02:20:36 +04:00
2007-07-19 12:47:43 +04:00
if ( i = = 0 ) {
2005-04-17 02:20:36 +04:00
udf_debug ( " XA disk: %s, vol_desc_start=%d \n " ,
2011-10-10 12:08:07 +04:00
ms_info . xa_flag ? " yes " : " no " , ms_info . addr . lba ) ;
2007-07-21 15:37:18 +04:00
if ( ms_info . xa_flag ) /* necessary for a valid ms_info.addr */
2005-04-17 02:20:36 +04:00
vol_desc_start = ms_info . addr . lba ;
2007-07-19 12:47:43 +04:00
} else {
2005-04-17 02:20:36 +04:00
udf_debug ( " CDROMMULTISESSION not supported: rc=%d \n " , i ) ;
}
return vol_desc_start ;
}
2007-07-19 12:47:43 +04:00
unsigned long udf_get_last_block ( struct super_block * sb )
2005-04-17 02:20:36 +04:00
{
struct block_device * bdev = sb - > s_bdev ;
unsigned long lblock = 0 ;
2009-06-18 14:33:16 +04:00
/*
* ioctl failed or returned obviously bogus value ?
* Try using the device size . . .
*/
if ( ioctl_by_bdev ( bdev , CDROM_LAST_WRITTEN , ( unsigned long ) & lblock ) | |
lblock = = 0 )
2005-04-17 02:20:36 +04:00
lblock = bdev - > bd_inode - > i_size > > sb - > s_blocksize_bits ;
if ( lblock )
return lblock - 1 ;
else
return 0 ;
}