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