2023-05-22 03:54:34 +03:00
// SPDX-License-Identifier: GPL-2.0-only
2005-04-17 02:20:36 +04:00
/*
* lowlevel . c
*
* PURPOSE
* Low Level Device Routines for the UDF filesystem
*
* COPYRIGHT
* ( C ) 1999 - 2001 Ben Fennema
*
* HISTORY
*
* 03 / 26 / 99 blf Created .
*/
# include "udfdecl.h"
# include <linux/blkdev.h>
# include <linux/cdrom.h>
2014-06-18 21:38:24 +04:00
# include <linux/uaccess.h>
2005-04-17 02:20:36 +04:00
# 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
{
2020-04-25 10:57:06 +03:00
struct cdrom_device_info * cdi = disk_to_cdi ( sb - > s_bdev - > bd_disk ) ;
2005-04-17 02:20:36 +04:00
struct cdrom_multisession ms_info ;
2020-04-25 10:57:06 +03:00
if ( ! cdi ) {
udf_debug ( " CDROMMULTISESSION not supported. \n " ) ;
return 0 ;
}
2005-04-17 02:20:36 +04:00
2020-04-25 10:57:06 +03:00
ms_info . addr_format = CDROM_LBA ;
if ( cdrom_multisession ( cdi , & ms_info ) = = 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 */
2020-04-25 10:57:06 +03:00
return ms_info . addr . lba ;
2005-04-17 02:20:36 +04:00
}
2020-04-25 10:57:06 +03:00
return 0 ;
2005-04-17 02:20:36 +04:00
}
2023-01-18 15:55:31 +03:00
udf_pblk_t udf_get_last_block ( struct super_block * sb )
2005-04-17 02:20:36 +04:00
{
2021-10-18 13:11:30 +03:00
struct cdrom_device_info * cdi = disk_to_cdi ( sb - > s_bdev - > bd_disk ) ;
2005-04-17 02:20:36 +04:00
unsigned long lblock = 0 ;
2009-06-18 14:33:16 +04:00
/*
2020-04-25 10:57:06 +03:00
* The cdrom layer call failed or returned obviously bogus value ?
2009-06-18 14:33:16 +04:00
* Try using the device size . . .
*/
2023-01-18 15:55:31 +03:00
if ( ! cdi | | cdrom_get_last_written ( cdi , & lblock ) | | lblock = = 0 ) {
if ( sb_bdev_nr_blocks ( sb ) > ~ ( udf_pblk_t ) 0 )
return 0 ;
2021-10-18 13:11:30 +03:00
lblock = sb_bdev_nr_blocks ( sb ) ;
2023-01-18 15:55:31 +03:00
}
2005-04-17 02:20:36 +04:00
if ( lblock )
return lblock - 1 ;
2020-04-25 10:57:06 +03:00
return 0 ;
2005-04-17 02:20:36 +04:00
}