Linux kernel & device driver programming

Cross-Referenced Linux and Device Driver Code

[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ]
Version: [ 2.6.11.8 ] [ 2.6.25 ] [ 2.6.25.8 ] [ 2.6.31.13 ] Architecture: [ i386 ]
  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 "udf_sb.h"
 27 
 28 unsigned int udf_get_last_session(struct super_block *sb)
 29 {
 30         struct cdrom_multisession ms_info;
 31         unsigned int vol_desc_start;
 32         struct block_device *bdev = sb->s_bdev;
 33         int i;
 34 
 35         vol_desc_start = 0;
 36         ms_info.addr_format = CDROM_LBA;
 37         i = ioctl_by_bdev(bdev, CDROMMULTISESSION, (unsigned long)&ms_info);
 38 
 39 #define WE_OBEY_THE_WRITTEN_STANDARDS 1
 40 
 41         if (i == 0) {
 42                 udf_debug("XA disk: %s, vol_desc_start=%d\n",
 43                           (ms_info.xa_flag ? "yes" : "no"), ms_info.addr.lba);
 44 #if WE_OBEY_THE_WRITTEN_STANDARDS
 45                 if (ms_info.xa_flag) /* necessary for a valid ms_info.addr */
 46 #endif
 47                         vol_desc_start = ms_info.addr.lba;
 48         } else {
 49                 udf_debug("CDROMMULTISESSION not supported: rc=%d\n", i);
 50         }
 51         return vol_desc_start;
 52 }
 53 
 54 unsigned long udf_get_last_block(struct super_block *sb)
 55 {
 56         struct block_device *bdev = sb->s_bdev;
 57         unsigned long lblock = 0;
 58 
 59         /*
 60          * ioctl failed or returned obviously bogus value?
 61          * Try using the device size...
 62          */
 63         if (ioctl_by_bdev(bdev, CDROM_LAST_WRITTEN, (unsigned long) &lblock) ||
 64             lblock == 0)
 65                 lblock = bdev->bd_inode->i_size >> sb->s_blocksize_bits;
 66 
 67         if (lblock)
 68                 return lblock - 1;
 69         else
 70                 return 0;
 71 }
 72 
  This page was automatically generated by the LXR engine.