Linux-2.6.12-rc2
[linux-flexiantxendom0-natty.git] / fs / udf / lowlevel.c
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
25 #include "udfdecl.h"
26
27 #include <linux/blkdev.h>
28 #include <linux/cdrom.h>
29 #include <asm/uaccess.h>
30
31 #include <linux/udf_fs.h>
32 #include "udf_sb.h"
33
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
42         vol_desc_start=0;
43         ms_info.addr_format=CDROM_LBA;
44         i = ioctl_by_bdev(bdev, CDROMMULTISESSION, (unsigned long) &ms_info);
45
46 #define WE_OBEY_THE_WRITTEN_STANDARDS 1
47
48         if (i == 0)
49         {
50                 udf_debug("XA disk: %s, vol_desc_start=%d\n",
51                         (ms_info.xa_flag ? "yes" : "no"), ms_info.addr.lba);
52 #if WE_OBEY_THE_WRITTEN_STANDARDS
53                 if (ms_info.xa_flag) /* necessary for a valid ms_info.addr */
54 #endif
55                         vol_desc_start = ms_info.addr.lba;
56         }
57         else
58         {
59                 udf_debug("CDROMMULTISESSION not supported: rc=%d\n", i);
60         }
61         return vol_desc_start;
62 }
63
64 unsigned long
65 udf_get_last_block(struct super_block *sb)
66 {
67         struct block_device *bdev = sb->s_bdev;
68         unsigned long lblock = 0;
69
70         if (ioctl_by_bdev(bdev, CDROM_LAST_WRITTEN, (unsigned long) &lblock))
71                 lblock = bdev->bd_inode->i_size >> sb->s_blocksize_bits;
72
73         if (lblock)
74                 return lblock - 1;
75         else
76                 return 0;
77 }