summaryrefslogtreecommitdiffstats
path: root/fs/udf/lowlevel.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/udf/lowlevel.c')
-rw-r--r--fs/udf/lowlevel.c104
1 files changed, 28 insertions, 76 deletions
diff --git a/fs/udf/lowlevel.c b/fs/udf/lowlevel.c
index 0f763b5d1..dee98ad71 100644
--- a/fs/udf/lowlevel.c
+++ b/fs/udf/lowlevel.c
@@ -38,60 +38,36 @@ typedef struct scsi_cmnd Scsi_Cmnd;
#include "udf_sb.h"
unsigned int
-udf_get_last_session(kdev_t dev)
+udf_get_last_session(struct super_block *sb)
{
struct cdrom_multisession ms_info;
unsigned int vol_desc_start;
- struct inode inode_fake;
- extern struct file_operations * get_blkfops(unsigned int);
+ struct block_device *bdev = sb->s_bdev;
int i;
vol_desc_start=0;
- if (get_blkfops(MAJOR(dev))->ioctl!=NULL)
- {
- /* Whoops. We must save the old FS, since otherwise
- * we would destroy the kernels idea about FS on root
- * mount in read_super... [chexum]
- */
- mm_segment_t old_fs=get_fs();
- inode_fake.i_rdev=dev;
- ms_info.addr_format=CDROM_LBA;
- set_fs(KERNEL_DS);
- i=get_blkfops(MAJOR(dev))->ioctl(&inode_fake,
- NULL,
- CDROMMULTISESSION,
- (unsigned long) &ms_info);
- set_fs(old_fs);
-
+ ms_info.addr_format=CDROM_LBA;
+ i=ioctl_by_bdev(bdev, CDROMMULTISESSION, (unsigned long) &ms_info);
#define WE_OBEY_THE_WRITTEN_STANDARDS 1
-
- if (i == 0)
- {
- udf_debug("XA disk: %s, vol_desc_start=%d\n",
- (ms_info.xa_flag ? "yes" : "no"), ms_info.addr.lba);
+ if (i == 0) {
+ udf_debug("XA disk: %s, vol_desc_start=%d\n",
+ (ms_info.xa_flag ? "yes" : "no"), ms_info.addr.lba);
#if WE_OBEY_THE_WRITTEN_STANDARDS
- if (ms_info.xa_flag) /* necessary for a valid ms_info.addr */
+ if (ms_info.xa_flag) /* necessary for a valid ms_info.addr */
#endif
- vol_desc_start = ms_info.addr.lba;
- }
- else
- {
- udf_debug("CDROMMULTISESSION not supported: rc=%d\n", i);
- }
- }
- else
- {
- udf_debug("Device doesn't know how to ioctl?\n");
+ vol_desc_start = ms_info.addr.lba;
+ } else {
+ udf_debug("CDROMMULTISESSION not supported: rc=%d\n", i);
}
return vol_desc_start;
}
unsigned int
-udf_get_last_block(kdev_t dev, int *flags)
+udf_get_last_block(struct super_block *sb, int *flags)
{
extern int *blksize_size[];
- struct inode inode_fake;
- extern struct file_operations * get_blkfops(unsigned int);
+ kdev_t dev = sb->s_dev;
+ struct block_device *bdev = sb->s_bdev;
int ret;
unsigned long lblock;
unsigned int hbsize = get_hardblocksize(dev);
@@ -107,44 +83,20 @@ udf_get_last_block(kdev_t dev, int *flags)
else if (hbsize > secsize)
div = hbsize / secsize;
- if (get_blkfops(MAJOR(dev))->ioctl!=NULL)
- {
- /* Whoops. We must save the old FS, since otherwise
- * we would destroy the kernels idea about FS on root
- * mount in read_super... [chexum]
- */
- mm_segment_t old_fs=get_fs();
- inode_fake.i_rdev=dev;
- set_fs(KERNEL_DS);
-
- lblock = 0;
- ret = get_blkfops(MAJOR(dev))->ioctl(&inode_fake,
- NULL,
- BLKGETSIZE,
- (unsigned long) &lblock);
-
- if (!ret && lblock != 0x7FFFFFFF) /* Hard Disk */
- {
- if (mult)
- lblock *= mult;
- else if (div)
- lblock /= div;
- }
- else /* CDROM */
- {
- ret = get_blkfops(MAJOR(dev))->ioctl(&inode_fake,
- NULL,
- CDROM_LAST_WRITTEN,
- (unsigned long) &lblock);
- }
-
- set_fs(old_fs);
- if (!ret && lblock)
- return lblock - 1;
- }
- else
- {
- udf_debug("Device doesn't know how to ioctl?\n");
+ lblock = 0;
+ ret = ioctl_by_bdev(bdev, BLKGETSIZE, (unsigned long) &lblock);
+
+ if (!ret && lblock != 0x7FFFFFFF) {
+ /* Hard Disk */
+ if (mult)
+ lblock *= mult;
+ else if (div)
+ lblock /= div;
+ } else {
+ /* CDROM */
+ ret = ioctl_by_bdev(bdev, CDROM_LAST_WRITTEN, (unsigned long) &lblock);
}
+ if (!ret && lblock)
+ return lblock - 1;
return 0;
}