Suggested fix for atapi.  The atapi driver wants whole sectors, but the 
ext2 driver sometimes attempts an incomplete write.  Here we fill the 
remaineder of the sector with zeros.  This isn't the most elegant way to
do it but illustrates the problem.  I'm committing this here because it's
a branch.
Modified: branches/ext2/reactos/drivers/storage/atapi/atapi.c

Modified: branches/ext2/reactos/drivers/storage/atapi/atapi.c
--- branches/ext2/reactos/drivers/storage/atapi/atapi.c	2005-01-27 04:15:14 UTC (rev 13335)
+++ branches/ext2/reactos/drivers/storage/atapi/atapi.c	2005-01-27 08:16:42 UTC (rev 13336)
@@ -2000,12 +2000,12 @@
   UCHAR CylinderLow;
   UCHAR DrvHead;
   UCHAR SectorNumber;
-  UCHAR Command;
+  UCHAR Command = 0;
   ULONG Retries;
   UCHAR Status;
   BOOLEAN FASTCALL (*Handler)(PATAPI_MINIPORT_EXTENSION DevExt);
 
-  DPRINT("AtapiReadWrite() called!\n");
+  DPRINT("AtaiReadWrite() called!\n");
   DPRINT("SCSIOP_WRITE: TargetId: %lu\n",
 	 Srb->TargetId);
 
@@ -2144,13 +2144,16 @@
       if (DeviceExtension->DeviceFlags[Srb->TargetId] & DEVICE_MULTI_SECTOR_CMD)
         {
           Command = Srb->SrbFlags & SRB_FLAGS_DATA_IN ? IDE_CMD_READ_MULTIPLE : IDE_CMD_WRITE_MULTIPLE;
+          DPRINT("Command = %x\n", Command);
 	}
       else
         {
           Command = Srb->SrbFlags & SRB_FLAGS_DATA_IN ? IDE_CMD_READ : IDE_CMD_WRITE;
+          DPRINT("Command = %x\n", Command);
 	}
     }
 
+  DPRINT("Executing Command = %x\n", Command);
   AtapiExecuteCommand(DeviceExtension, Command, Handler);
 
 #ifdef ENABLE_DMA
@@ -2182,7 +2185,7 @@
 	    }
           if (Retries >= IDE_MAX_WRITE_RETRIES)
 	    {
-	      DPRINT1("Drive is BUSY for too long after sending write command\n");
+	      DPRINT("Drive is BUSY for too long after sending write command\n");
 	      return(SRB_STATUS_BUSY);
 	    }
 
@@ -2200,12 +2203,47 @@
           /* Write data block */
           if (DeviceExtension->DeviceFlags[Srb->TargetId] & DEVICE_DWORD_IO)
 	    {
-	      IDEWriteBlock32(DeviceExtension->CommandPortBase,
-			      TargetAddress,
-			      TransferSize);
+                UINT Temp = 0;
+                UINT ExtraWord = TransferSize & (sizeof(UINT)-1);
+                UINT EndOfBlock;
+
+                DPRINT("IDEWriteBlock32(%x, %d)\n", 
+                        DeviceExtension->CommandPortBase,
+                        TransferSize);
+                IDEWriteBlock32(DeviceExtension->CommandPortBase,
+                                TargetAddress,
+                                TransferSize);
+                if( ExtraWord ) {
+                    RtlCopyMemory( &Temp, 
+                                   TargetAddress + 
+                                   (TransferSize & (sizeof(UINT)-1)),
+                                   ExtraWord );
+                    IDEWriteBlock32(DeviceExtension->CommandPortBase,
+                                     &Temp,
+                                     sizeof(Temp));
+                    TransferSize = (TransferSize + sizeof(UINT)) &
+                        ~(sizeof(UINT) - 1);
+                }
+
+                Temp = 0;
+
+                DPRINT("TransferSize = %d (BPS %d)\n", 
+                        TransferSize, DeviceParams->BytesPerSector);
+
+                EndOfBlock = DeviceParams->BytesPerSector - 
+                    (TransferSize & (DeviceParams->BytesPerSector - 1));
+
+                while( EndOfBlock ) {
+                    DPRINT("Zeros Remaining %d\n", EndOfBlock);
+                    IDEWriteBlock32(DeviceExtension->CommandPortBase,
+                                    &Temp,
+                                    sizeof(Temp));
+                    EndOfBlock -= sizeof(Temp);
+                }
 	    }
           else
 	    {
+                DPRINT1("IDEWriteBlock(%x)\n", DeviceExtension->CommandPortBase);
 	      IDEWriteBlock(DeviceExtension->CommandPortBase,
 			    TargetAddress,
 			    TransferSize);