[disk] Use WV_S_DEV_T-independent I/O routine
authorShao Miller <Shao.Miller@yrdsb.edu.on.ca>
Sun, 9 Jan 2011 12:54:23 +0000 (07:54 -0500)
committerShao Miller <Shao.Miller@yrdsb.edu.on.ca>
Sun, 9 Jan 2011 12:54:23 +0000 (07:54 -0500)
src/aoe/driver.c
src/include/disk.h
src/include/filedisk.h
src/winvblock/disk/disk.c
src/winvblock/disk/scsi.c
src/winvblock/filedisk/filedisk.c
src/winvblock/filedisk/grub4dos.c
src/winvblock/ramdisk/ramdisk.c

index 5c532a7..bb04051 100644 (file)
@@ -66,7 +66,7 @@ static VOID STDCALL AoeThread_(IN PVOID);
 static VOID AoeProcessAbft_(void);
 static struct AOE_DISK_ * AoeDiskCreatePdo_(void);
 static WV_F_DEV_FREE AoeDiskFree_;
-static WV_F_DISK_IO AoeDiskIo_;
+static WVL_F_DISK_IO AoeDiskIo_;
 static WV_F_DISK_MAX_XFER_LEN AoeDiskMaxXferLen_;
 static BOOLEAN STDCALL AoeDiskInit_(struct AOE_DISK_ *);
 static WV_F_DISK_CLOSE AoeDiskClose_;
@@ -780,29 +780,7 @@ static BOOLEAN STDCALL AoeDiskInit_(IN AOE_SP_DISK_ aoe_disk) {
       } /* while TRUE */
   }
 
-WVL_F_DISK_IO AoeDiskIo2_;
-
 static NTSTATUS STDCALL AoeDiskIo_(
-    IN WV_SP_DEV_T dev_ptr,
-    IN WVL_E_DISK_IO_MODE mode,
-    IN LONGLONG start_sector,
-    IN UINT32 sector_count,
-    IN PUCHAR buffer,
-    IN PIRP irp
-  ) {
-    AOE_SP_DISK_ aoe_disk = AoeDiskFromDev_(dev_ptr);
-
-    return AoeDiskIo2_(
-        aoe_disk->disk,
-        mode,
-        start_sector,
-        sector_count,
-        buffer,
-        irp
-      );
-  }
-
-static NTSTATUS STDCALL AoeDiskIo2_(
     IN WV_SP_DISK_T disk_ptr,
     IN WVL_E_DISK_IO_MODE mode,
     IN LONGLONG start_sector,
index c55eb18..8c5a45b 100644 (file)
@@ -69,26 +69,6 @@ typedef NTSTATUS STDCALL WVL_F_DISK_IO(
   );
 typedef WVL_F_DISK_IO * WVL_FP_DISK_IO;
 
-/**
- * I/O Request.
- *
- * @v dev_ptr           Points to the disk's device structure.
- * @v mode              Read / write mode.
- * @v start_sector      First sector for request.
- * @v sector_count      Number of sectors to work with.
- * @v buffer            Buffer to read / write sectors to / from.
- * @v irp               Interrupt request packet for this request.
- */
-typedef NTSTATUS STDCALL WV_F_DISK_IO(
-    IN WV_SP_DEV_T,
-    IN WVL_E_DISK_IO_MODE,
-    IN LONGLONG,
-    IN UINT32,
-    IN PUCHAR,
-    IN PIRP
-  );
-typedef WV_F_DISK_IO * WV_FP_DISK_IO;
-
 /**
  * Maximum transfer length response routine.
  *
@@ -126,7 +106,7 @@ typedef WVL_F_DISK_UNIT_NUM * WVL_FP_DISK_UNIT_NUM;
 extern WVL_M_LIB WVL_F_DISK_UNIT_NUM WvlDiskUnitNum;
 
 typedef struct WV_DISK_OPS {
-    WV_FP_DISK_IO Io;
+    WVL_FP_DISK_IO Io;
     WV_FP_DISK_MAX_XFER_LEN MaxXferLen;
     WV_FP_DISK_INIT Init;
     WV_FP_DISK_CLOSE Close;
@@ -185,7 +165,7 @@ typedef struct WVL_DISK_MBR WVL_S_DISK_MBR, * WVL_SP_DISK_MBR;
 #  pragma pack()
 #endif
 
-extern WV_F_DISK_IO disk__io;
+extern WVL_M_LIB WVL_F_DISK_IO WvlDiskIo;
 extern WV_F_DISK_MAX_XFER_LEN disk__max_xfer_len;
 
 /**
index 28c7018..0ec1ec7 100644 (file)
@@ -37,7 +37,7 @@ typedef struct WV_FILEDISK_T {
     LIST_ENTRY req_list;
     KSPIN_LOCK req_list_lock;
     KEVENT signal;
-    WV_FP_DISK_IO sync_io;
+    WVL_FP_DISK_IO sync_io;
     PCHAR filepath;
     UNICODE_STRING filepath_unicode;
   } WV_S_FILEDISK_T, * WV_SP_FILEDISK_T;
index 7b905e1..986251e 100644 (file)
@@ -420,19 +420,17 @@ static VOID STDCALL WvDiskDevFree_(IN WV_SP_DEV_T dev) {
   }
 
 /* See header for details. */
-NTSTATUS STDCALL disk__io(
-    IN WV_SP_DEV_T dev,
+WVL_M_LIB NTSTATUS STDCALL WvlDiskIo(
+    IN WV_SP_DISK_T disk,
     IN WVL_E_DISK_IO_MODE mode,
     IN LONGLONG start_sector,
     IN UINT32 sector_count,
     IN PUCHAR buffer,
     IN PIRP irp
   ) {
-    WV_SP_DISK_T disk = disk__get_ptr(dev);
-
     if (disk->disk_ops.Io) {
         return disk->disk_ops.Io(
-            dev,
+            disk,
             mode,
             start_sector,
             sector_count,
index 8b66831..65a95b5 100644 (file)
@@ -50,7 +50,7 @@
  *                      been completed or not.
  * @ret NTSTATUS        The status of the SCSI operation.
  */
-typedef NTSTATUS STDCALL disk_scsi__func(
+typedef NTSTATUS STDCALL WV_F_DISK_SCSI(
     IN WV_SP_DEV_T,
     IN PIRP,
     IN WV_SP_DISK_T,
@@ -58,14 +58,15 @@ typedef NTSTATUS STDCALL disk_scsi__func(
     IN PCDB,
     OUT PBOOLEAN
   );
+typedef WV_F_DISK_SCSI * WV_FP_DISK_SCSI;
 
 /* Forward declarations. */
-disk_scsi__func disk_scsi__read_write_;
-disk_scsi__func disk_scsi__verify_;
-disk_scsi__func disk_scsi__read_capacity_;
-disk_scsi__func disk_scsi__read_capacity_16_;
-disk_scsi__func disk_scsi__mode_sense_;
-disk_scsi__func disk_scsi__read_toc_;
+WV_F_DISK_SCSI disk_scsi__read_write_;
+WV_F_DISK_SCSI disk_scsi__verify_;
+WV_F_DISK_SCSI disk_scsi__read_capacity_;
+WV_F_DISK_SCSI disk_scsi__read_capacity_16_;
+WV_F_DISK_SCSI disk_scsi__mode_sense_;
+WV_F_DISK_SCSI disk_scsi__read_toc_;
 WV_F_DEV_SCSI disk_scsi__dispatch;
 
 #if _WIN32_WINNT <= 0x0600
@@ -73,21 +74,20 @@ WV_F_DEV_SCSI disk_scsi__dispatch;
 #    ifdef _MSC_VER
 #      pragma pack(1)
 #    endif
-typedef union _EIGHT_BYTE
-{
-  struct
-  {
-    UCHAR Byte0;
-    UCHAR Byte1;
-    UCHAR Byte2;
-    UCHAR Byte3;
-    UCHAR Byte4;
-    UCHAR Byte5;
-    UCHAR Byte6;
-    UCHAR Byte7;
-  };
-  ULONGLONG AsULongLong;
-} __attribute__ ( ( __packed__ ) ) EIGHT_BYTE, *PEIGHT_BYTE;
+union _EIGHT_BYTE {
+    struct {
+        UCHAR Byte0;
+        UCHAR Byte1;
+        UCHAR Byte2;
+        UCHAR Byte3;
+        UCHAR Byte4;
+        UCHAR Byte5;
+        UCHAR Byte6;
+        UCHAR Byte7;
+      };
+    ULONGLONG AsULongLong;
+  } __attribute__((__packed__));
+typedef union _EIGHT_BYTE EIGHT_BYTE, * PEIGHT_BYTE;
 #    ifdef _MSC_VER
 #      pragma pack()
 #    endif
@@ -98,12 +98,12 @@ typedef union _EIGHT_BYTE
 #      ifdef _MSC_VER
 #        pragma pack(1)
 #      endif
+struct _READ_CAPACITY_DATA_EX {
+    LARGE_INTEGER LogicalBlockAddress;
+    ULONG BytesPerBlock;
+  } __attribute__((__packed__));
 typedef struct _READ_CAPACITY_DATA_EX
-{
-  LARGE_INTEGER LogicalBlockAddress;
-  ULONG BytesPerBlock;
-} __attribute__ ( ( __packed__ ) ) READ_CAPACITY_DATA_EX,
-  *PREAD_CAPACITY_DATA_EX;
+  READ_CAPACITY_DATA_EX, * PREAD_CAPACITY_DATA_EX;
 #      ifdef _MSC_VER
 #        pragma pack()
 #      endif
@@ -113,18 +113,18 @@ typedef struct _READ_CAPACITY_DATA_EX
 #  ifdef _MSC_VER
 #    pragma pack(1)
 #  endif
-typedef struct _DISK_CDB16
-{
-  UCHAR OperationCode;
-  UCHAR Reserved1:3;
-  UCHAR ForceUnitAccess:1;
-  UCHAR DisablePageOut:1;
-  UCHAR Protection:3;
-  UCHAR LogicalBlock[8];
-  UCHAR TransferLength[4];
-  UCHAR Reserved2;
-  UCHAR Control;
-} __attribute__ ( ( __packed__ ) ) DISK_CDB16, *PDISK_CDB16;
+struct _DISK_CDB16 {
+    UCHAR OperationCode;
+    UCHAR Reserved1:3;
+    UCHAR ForceUnitAccess:1;
+    UCHAR DisablePageOut:1;
+    UCHAR Protection:3;
+    UCHAR LogicalBlock[8];
+    UCHAR TransferLength[4];
+    UCHAR Reserved2;
+    UCHAR Control;
+  } __attribute__((__packed__));
+typedef struct _DISK_CDB16 DISK_CDB16, * PDISK_CDB16;
 #  ifdef _MSC_VER
 #    pragma pack()
 #  endif
@@ -141,7 +141,7 @@ typedef struct _DISK_CDB16
   d->Byte1 = s->Byte6;                            \
   d->Byte0 = s->Byte7;                            \
 }
-#endif        /* if _WIN32_WINNT <= 0x0600 */
+#endif          /* if _WIN32_WINNT <= 0x0600 */
 
 static NTSTATUS STDCALL disk_scsi__read_write_(
     IN WV_SP_DEV_T dev,
@@ -213,8 +213,8 @@ static NTSTATUS STDCALL disk_scsi__read_write_(
       }
 
     if (cdb->AsByte[0] == SCSIOP_READ || cdb->AsByte[0] == SCSIOP_READ16) {
-        status = disk__io(
-            dev,
+        status = WvlDiskIo(
+            disk,
             WvlDiskIoModeRead,
             start_sector,
             sector_count,
@@ -227,8 +227,8 @@ static NTSTATUS STDCALL disk_scsi__read_write_(
             irp
           );
       } else {
-        status = disk__io(
-            dev,
+        status = WvlDiskIo(
+            disk,
             WvlDiskIoModeWrite,
             start_sector,
             sector_count,
index c65f797..9f074fc 100644 (file)
 
 /** Private. */
 static WV_F_DEV_FREE WvFilediskFree_;
-static WV_F_DISK_IO io;
-static WV_F_DISK_IO threaded_io;
+static WVL_F_DISK_IO WvFilediskIo_;
+static WVL_F_DISK_IO WvFilediskThreadedIo_;
 static WV_F_DEV_CLOSE WvFilediskClose_;
 
-static NTSTATUS STDCALL io(
-    IN WV_SP_DEV_T dev_ptr,
+static NTSTATUS STDCALL WvFilediskIo_(
+    IN WV_SP_DISK_T disk_ptr,
     IN WVL_E_DISK_IO_MODE mode,
     IN LONGLONG start_sector,
     IN UINT32 sector_count,
     IN PUCHAR buffer,
     IN PIRP irp
   ) {
-    WV_SP_DISK_T disk_ptr;
     WV_SP_FILEDISK_T filedisk_ptr;
     LARGE_INTEGER offset;
     NTSTATUS status;
     IO_STATUS_BLOCK io_status;
 
-    /* Establish pointers to the disk and filedisk. */
-    disk_ptr = disk__get_ptr(dev_ptr);
-    filedisk_ptr = filedisk__get_ptr(dev_ptr);
+    /* Establish pointer to the filedisk. */
+    filedisk_ptr = CONTAINING_RECORD(disk_ptr, WV_S_FILEDISK_T, disk);
 
     if (sector_count < 1) {
         /* A silly request. */
@@ -341,7 +339,7 @@ WV_SP_FILEDISK_T STDCALL WvFilediskCreatePdo(
     filedisk->disk->Dev->Ops.Close = WvFilediskClose_;
     filedisk->disk->Dev->ext = filedisk->disk;
     filedisk->disk->Dev->IrpMj = &irp_mj;
-    filedisk->disk->disk_ops.Io = io;
+    filedisk->disk->disk_ops.Io = WvFilediskIo_;
     filedisk->disk->disk_ops.UnitNum = WvFilediskUnitNum_;
     filedisk->disk->ext = filedisk;
     filedisk->disk->DriverObj = WvDriverObj;
@@ -376,7 +374,7 @@ static VOID STDCALL WvFilediskFree_(IN WV_SP_DEV_T dev) {
 /* Threaded read/write request. */
 typedef struct WV_FILEDISK_THREAD_REQ {
     LIST_ENTRY list_entry;
-    WV_SP_DEV_T dev_ptr;
+    WV_SP_FILEDISK_T filedisk;
     WVL_E_DISK_IO_MODE mode;
     LONGLONG start_sector;
     UINT32 sector_count;
@@ -423,7 +421,7 @@ static VOID STDCALL thread(IN PVOID StartContext) {
                 list_entry
               );
             filedisk_ptr->sync_io(
-                req->dev_ptr,
+                req->filedisk->disk,
                 req->mode,
                 req->start_sector,
                 req->sector_count,
@@ -437,8 +435,8 @@ static VOID STDCALL thread(IN PVOID StartContext) {
     WvFilediskFree_(filedisk_ptr->disk->Dev);
   }
 
-static NTSTATUS STDCALL threaded_io(
-    IN WV_SP_DEV_T dev_ptr,
+static NTSTATUS STDCALL WvFilediskThreadedIo_(
+    IN WV_SP_DISK_T disk,
     IN WVL_E_DISK_IO_MODE mode,
     IN LONGLONG start_sector,
     IN UINT32 sector_count,
@@ -448,7 +446,7 @@ static NTSTATUS STDCALL threaded_io(
     WV_SP_FILEDISK_T filedisk_ptr;
     WV_SP_FILEDISK_THREAD_REQ req;
 
-    filedisk_ptr = filedisk__get_ptr(dev_ptr);
+    filedisk_ptr = CONTAINING_RECORD(disk, WV_S_FILEDISK_T, disk);
     /* Allocate the request. */
     req = wv_malloc(sizeof *req);
     if (req == NULL) {
@@ -458,7 +456,7 @@ static NTSTATUS STDCALL threaded_io(
         return STATUS_INSUFFICIENT_RESOURCES;
       }
     /* Remember the request. */
-    req->dev_ptr = dev_ptr;
+    req->filedisk = filedisk_ptr;
     req->mode = mode;
     req->start_sector = start_sector;
     req->sector_count = sector_count;
@@ -507,8 +505,8 @@ WV_SP_FILEDISK_T WvFilediskCreatePdoThreaded(
     if (filedisk_ptr == NULL)
       goto err_nofiledisk;
     /* Use threaded routines. */
-    filedisk_ptr->sync_io = io;
-    filedisk_ptr->disk->disk_ops.Io = threaded_io;
+    filedisk_ptr->sync_io = WvFilediskIo_;
+    filedisk_ptr->disk->disk_ops.Io = WvFilediskThreadedIo_;
     filedisk_ptr->disk->Dev->Ops.Free = free_threaded_filedisk;
     /* Initialize threading parameters and start the filedisk's thread. */
     InitializeListHead(&filedisk_ptr->req_list);
index 2255b4b..11d8ea0 100644 (file)
 #include "byte.h"
 #include "msvhd.h"
 
-/* Globals. */
-static WV_FP_DISK_IO sync_io;
-
-/* Forward declarations. */
-static WV_F_DISK_IO io;
+/** Private. */
+static WVL_FP_DISK_IO WvFilediskG4dSyncIo_;
+static WVL_F_DISK_IO WvFilediskG4dIo_;
 
 /**
  * Check if a disk might be the matching backing disk for
@@ -125,8 +123,8 @@ static NTSTATUS STDCALL check_disk_match(
  * Temporarily used by established disks in order to access the
  * backing disk late(r) during the boot process.
  */
-static NTSTATUS STDCALL io(
-    IN WV_SP_DEV_T dev_ptr,
+static NTSTATUS STDCALL WvFilediskG4dIo_(
+    IN WV_SP_DISK_T disk,
     IN WVL_E_DISK_IO_MODE mode,
     IN LONGLONG start_sector,
     IN UINT32 sector_count,
@@ -140,7 +138,8 @@ static NTSTATUS STDCALL io(
     PWCHAR pos;
     HANDLE file;
 
-    filedisk_ptr = filedisk__get_ptr(dev_ptr);
+    /* Establish pointer to the filedisk. */
+    filedisk_ptr = CONTAINING_RECORD(disk, WV_S_FILEDISK_T, disk);
     /*
      * Find the backing disk and use it.  We walk a list
      * of unicode disk device names and check each one.
@@ -198,9 +197,16 @@ static NTSTATUS STDCALL io(
       goto dud;
     /* Use the backing disk and restore the original read/write routine. */
     filedisk_ptr->file = file;
-    filedisk_ptr->sync_io = sync_io;
+    filedisk_ptr->sync_io = WvFilediskG4dSyncIo_;
     /* Call the original read/write routine. */
-    return sync_io(dev_ptr, mode, start_sector, sector_count, buffer, irp);
+    return WvFilediskG4dSyncIo_(
+        filedisk_ptr->disk,
+        mode,
+        start_sector,
+        sector_count,
+        buffer,
+        irp
+      );
 
     dud:
     irp->IoStatus.Information = 0;
@@ -420,8 +426,8 @@ VOID filedisk_grub4dos__find(void) {
               DBG("Could not create GRUB4DOS disk!\n");
               return;
             }
-          sync_io = filedisk_ptr->sync_io;
-          filedisk_ptr->sync_io = io;
+          WvFilediskG4dSyncIo_ = filedisk_ptr->sync_io;
+          filedisk_ptr->sync_io = WvFilediskG4dIo_;
           filedisk_ptr->disk->Media = media_type;
           filedisk_ptr->disk->SectorSize = sector_size;
           /* Find an associated filename, if one exists. */
index 327256a..3e2407b 100644 (file)
@@ -43,7 +43,7 @@
 
 /** Private. */
 static WV_F_DEV_FREE WvRamdiskFree_;
-static WV_F_DISK_IO WvRamdiskIo_;
+static WVL_F_DISK_IO WvRamdiskIo_;
 
 /* With thanks to karyonix, who makes FiraDisk. */
 static __inline VOID STDCALL WvRamdiskFastCopy_(
@@ -56,7 +56,7 @@ static __inline VOID STDCALL WvRamdiskFastCopy_(
 
 /* RAM disk I/O routine. */
 static NTSTATUS STDCALL WvRamdiskIo_(
-    IN WV_SP_DEV_T dev,
+    IN WV_SP_DISK_T disk,
     IN WVL_E_DISK_IO_MODE mode,
     IN LONGLONG start_sector,
     IN UINT32 sector_count,
@@ -65,12 +65,10 @@ static NTSTATUS STDCALL WvRamdiskIo_(
   ) {
     PHYSICAL_ADDRESS phys_addr;
     PUCHAR phys_mem;
-    WV_SP_DISK_T disk;
     WV_SP_RAMDISK_T ramdisk;
 
-    /* Establish pointers to the disk and RAM disk. */
-    disk = disk__get_ptr(dev);
-    ramdisk = WvRamdiskFromDev_(dev);
+    /* Establish pointer to the RAM disk. */
+    ramdisk = CONTAINING_RECORD(disk, WV_S_RAMDISK_T, disk);
 
     if (sector_count < 1) {
         /* A silly request. */