Original Publication Date: 2000-Sep-01
Included in the Prior Art Database: 2003-Jun-18
Hierarchical RAID, as the name implies, is a RAID level on top of a RAID level. For example, RAID 10 is RAID 0 on top of RAID 1; RAID 50 is RAID 0 on top of RAID 5; and RAID 00 is RAID 0 on top of RAID 0. The data of the Hierarchical RAID Logical Unit (LUN) is striped across the logical drives below the top RAID level.
Hierarchical RAID's goal is to support large arrays for the existent RAID controllers, increase level of fault tolerance, and performance.
The Hierarchical RAID design deploys a firmware layer which intercepts the system commands and maps these system commands into the external commands seen by the existing RAID Engine in the current Copperhead code.
System command delivery mechanism uses either the emulating Intelligent I/O (I2O) mode or the legacy Anaconda command delivery mechanism. For the emulating I2O mode, the host device driver sets up the Copperhead command in the host's memory; the pointer to such command is written to the inbound queue of Anaconda (PCI - PCI controller chip); and an interrupt is asserted by the Anaconda. The Hierarchical RAID layer pops the command pointer from the Anaconda's queue and sets up the Direct Memory Access (DMA) to fetch the 16 bytes of system command over.
Once the command is fetched over, if it is a logical I/O type of command, i.e. accessing the hard disks which made up the logical drives, the command is parsed to see if it accesses across a stripe unit size (current is fixed at 64K bytes). A Copperhead command bucket (low level command bucket) is allocated per each access across the stripe unit size. For example, a system command accessing 64 K bytes of data starting at logical block address of 3 of the LUN 0 which is made up of 3 RAID 1 logical drives, two low level command buckets are needed. The first command bucket is for the low level logical drive 0 with starting logical block address of 3 and block count of 125; the second command bucket is for the low level logical drive 1 with a starting logical block address of 0 and block count of 3. The newly allocated low level command buckets, after adjusting the starting logical block address and block count, are routed to the existing Copperhead RAID Engine as if they were from the host system.
In addition to parsing the hierarchical command for 64 K byte boundary crossing, the hierarchical command is also parsed for wrap condition. Such condition is used to coalesce multiple low level commands into a single command. For example, the host accesses a 3 logical RAID 1 drive hierarchical LUN for 256 K bytes of data. Four low level commands are needed -- one for each of the 64 K bytes with the first and last commands accessing the same logical drive. Under this scenario, a deadlock condition is present in the firmware, because the first command locks the stripe that includes data for the last command. The hierarchical level collects all the commands for a large transfer (the hos...