[blockdev] Move block device operations to structure block_device_operations

Signed-off-by: Laurent Vivier <Laurent.Vivier@bull.net>
This commit is contained in:
Laurent Vivier
2008-11-19 17:31:07 +01:00
committed by Michael Brown
parent b48f37e69a
commit a2686a55c4
5 changed files with 44 additions and 20 deletions

View File

@@ -144,7 +144,7 @@ static int int13_rw_sectors ( struct int13_drive *drive,
static int int13_read_sectors ( struct int13_drive *drive, static int int13_read_sectors ( struct int13_drive *drive,
struct i386_all_regs *ix86 ) { struct i386_all_regs *ix86 ) {
DBG ( "Read: " ); DBG ( "Read: " );
return int13_rw_sectors ( drive, ix86, drive->blockdev->read ); return int13_rw_sectors ( drive, ix86, drive->blockdev->op->read );
} }
/** /**
@@ -163,7 +163,7 @@ static int int13_read_sectors ( struct int13_drive *drive,
static int int13_write_sectors ( struct int13_drive *drive, static int int13_write_sectors ( struct int13_drive *drive,
struct i386_all_regs *ix86 ) { struct i386_all_regs *ix86 ) {
DBG ( "Write: " ); DBG ( "Write: " );
return int13_rw_sectors ( drive, ix86, drive->blockdev->write ); return int13_rw_sectors ( drive, ix86, drive->blockdev->op->write );
} }
/** /**
@@ -275,7 +275,7 @@ static int int13_extended_rw ( struct int13_drive *drive,
static int int13_extended_read ( struct int13_drive *drive, static int int13_extended_read ( struct int13_drive *drive,
struct i386_all_regs *ix86 ) { struct i386_all_regs *ix86 ) {
DBG ( "Extended read: " ); DBG ( "Extended read: " );
return int13_extended_rw ( drive, ix86, drive->blockdev->read ); return int13_extended_rw ( drive, ix86, drive->blockdev->op->read );
} }
/** /**
@@ -288,7 +288,7 @@ static int int13_extended_read ( struct int13_drive *drive,
static int int13_extended_write ( struct int13_drive *drive, static int int13_extended_write ( struct int13_drive *drive,
struct i386_all_regs *ix86 ) { struct i386_all_regs *ix86 ) {
DBG ( "Extended write: " ); DBG ( "Extended write: " );
return int13_extended_rw ( drive, ix86, drive->blockdev->write ); return int13_extended_rw ( drive, ix86, drive->blockdev->op->write );
} }
/** /**
@@ -488,8 +488,8 @@ static void guess_int13_geometry ( struct int13_drive *drive ) {
/* Scan through partition table and modify guesses for heads /* Scan through partition table and modify guesses for heads
* and sectors_per_track if we find any used partitions. * and sectors_per_track if we find any used partitions.
*/ */
if ( drive->blockdev->read ( drive->blockdev, 0, 1, if ( drive->blockdev->op->read ( drive->blockdev, 0, 1,
virt_to_user ( &mbr ) ) == 0 ) { virt_to_user ( &mbr ) ) == 0 ) {
for ( i = 0 ; i < 4 ; i++ ) { for ( i = 0 ; i < 4 ; i++ ) {
partition = &mbr.partitions[i]; partition = &mbr.partitions[i];
if ( ! partition->type ) if ( ! partition->type )

View File

@@ -139,6 +139,11 @@ static int ata_identify ( struct block_device *blockdev ) {
return 0; return 0;
} }
static struct block_device_operations ata_operations = {
.read = ata_read,
.write = ata_write
};
/** /**
* Initialise ATA device * Initialise ATA device
* *
@@ -153,7 +158,6 @@ static int ata_identify ( struct block_device *blockdev ) {
*/ */
int init_atadev ( struct ata_device *ata ) { int init_atadev ( struct ata_device *ata ) {
/** Fill in read and write methods, and get device capacity */ /** Fill in read and write methods, and get device capacity */
ata->blockdev.read = ata_read; ata->blockdev.op = &ata_operations;
ata->blockdev.write = ata_write;
return ata_identify ( &ata->blockdev ); return ata_identify ( &ata->blockdev );
} }

View File

@@ -75,6 +75,11 @@ static int ramdisk_write ( struct block_device *blockdev, uint64_t block,
return 0; return 0;
} }
static struct block_device_operations ramdisk_operations = {
.read = ramdisk_read,
.write = ramdisk_write
};
int init_ramdisk ( struct ramdisk *ramdisk, userptr_t data, size_t len, int init_ramdisk ( struct ramdisk *ramdisk, userptr_t data, size_t len,
unsigned int blksize ) { unsigned int blksize ) {
@@ -82,8 +87,7 @@ int init_ramdisk ( struct ramdisk *ramdisk, userptr_t data, size_t len,
blksize = 512; blksize = 512;
ramdisk->data = data; ramdisk->data = data;
ramdisk->blockdev.read = ramdisk_read; ramdisk->blockdev.op = &ramdisk_operations;
ramdisk->blockdev.write = ramdisk_write;
ramdisk->blockdev.blksize = blksize; ramdisk->blockdev.blksize = blksize;
ramdisk->blockdev.blocks = ( len / blksize ); ramdisk->blockdev.blocks = ( len / blksize );

View File

@@ -228,6 +228,16 @@ static int scsi_read_capacity_16 ( struct block_device *blockdev ) {
return 0; return 0;
} }
static struct block_device_operations scsi_operations_16 = {
.read = scsi_read_16,
.write = scsi_write_16,
};
static struct block_device_operations scsi_operations_10 = {
.read = scsi_read_10,
.write = scsi_write_10,
};
/** /**
* Initialise SCSI device * Initialise SCSI device
* *
@@ -250,8 +260,7 @@ int init_scsidev ( struct scsi_device *scsi ) {
scsi_read_capacity_10 ( &scsi->blockdev ); scsi_read_capacity_10 ( &scsi->blockdev );
/* Try READ CAPACITY (10), which is a mandatory command, first. */ /* Try READ CAPACITY (10), which is a mandatory command, first. */
scsi->blockdev.read = scsi_read_10; scsi->blockdev.op = &scsi_operations_10;
scsi->blockdev.write = scsi_write_10;
if ( ( rc = scsi_read_capacity_10 ( &scsi->blockdev ) ) != 0 ) if ( ( rc = scsi_read_capacity_10 ( &scsi->blockdev ) ) != 0 )
return rc; return rc;
@@ -261,8 +270,7 @@ int init_scsidev ( struct scsi_device *scsi ) {
* mandatory, so we can't just use it straight off. * mandatory, so we can't just use it straight off.
*/ */
if ( scsi->blockdev.blocks == 0 ) { if ( scsi->blockdev.blocks == 0 ) {
scsi->blockdev.read = scsi_read_16; scsi->blockdev.op = &scsi_operations_16;
scsi->blockdev.write = scsi_write_16;
if ( ( rc = scsi_read_capacity_16 ( &scsi->blockdev ) ) != 0 ) if ( ( rc = scsi_read_capacity_16 ( &scsi->blockdev ) ) != 0 )
return rc; return rc;
} }

View File

@@ -10,12 +10,10 @@
#include <gpxe/uaccess.h> #include <gpxe/uaccess.h>
/** A block device */ struct block_device;
struct block_device {
/** Block size */ /** Block device operations */
size_t blksize; struct block_device_operations {
/** Total number of blocks */
uint64_t blocks;
/** /**
* Read block * Read block
* *
@@ -40,4 +38,14 @@ struct block_device {
unsigned long count, userptr_t buffer ); unsigned long count, userptr_t buffer );
}; };
/** A block device */
struct block_device {
/** Block device operations */
struct block_device_operations *op;
/** Block size */
size_t blksize;
/** Total number of blocks */
uint64_t blocks;
};
#endif /* _GPXE_BLOCKDEV_H */ #endif /* _GPXE_BLOCKDEV_H */