CROSS-REFERENCE TO RELATED APPLICATIONThis application is a Continuation application claiming priority from the Application having Ser. No. 10/995,873 filed Nov. 23, 2004.
FIELD OF THE INVENTIONThe invention relates to an apparatus and method to check data integrity when handling data. More specifically, the invention relates to an apparatus and method to check data states and parity states when handling data. In certain embodiments, the invention relates to an apparatus and method to check data states and parity states when writing data. In certain embodiments, the invention relates to an apparatus and method to check data states and parity states when reading data.
BACKGROUND OF THE INVENTIONInformation storage and retrieval systems are used to store information provided by one or more host computer systems. Such information storage and retrieval systems receive requests to write information to one or more information storage devices, and requests to read information from those one or more information storage devices. The system is continuously moving information to and from storage devices.
Data storage devices, such as hard disk drives, can “drop write,” i.e. fail to write data to a designated sector of the storage medium, and/or perform off-track writes to that designated sector. A subsequent read of this sector would receive old, i.e. “stale,” data instead of the data last written. In a RAID-5 encoded array, if a subsequent write to the parity stripe that causes the invalidly written sector to be read in calculating the new parity, the parity will become corrupt with the previous data because the read used to update the parity will get stale data instead of the data that was used when creating the parity.
In order to identify such dropped writes/off-track writes, the prior art teaches reading back data after every write. Such a read back verifies that the data is written correctly. Such read backs necessarily require, however, an additional read operation for every write operation. The prior art also teaches regularly checking the parity of the entire storage array. This approach is cumbersome and requires an inordinate amount of time. Moreover, while such a parity check is in progress, parity corruption can occur at a different part of the storage medium.
What is needed is a method to identify dropped writes and/or off-track writes without reading back every write, and without checking the parity of the entire storage array. Applicants' method identifies dropped writes and off-track writes by checking the data state and the parity state of a sector when handling data.
SUMMARY OF THE INVENTIONApplicants' invention includes an apparatus and method to check data states and parity states when handling data. The method provides an information storage array which includes an information storage array comprising a plurality of sectors. The method defines (N) data state identifiers and (N) parity state identifiers. The method receives a command to handle data, where that command designates a target sector.
The method determines the data state identifier assigned to the target sector, determines the parity state identifier assigned to the target sector, and compares the data state identifier and the parity state identifier.
If the method determines that the data state identifier and the parity state identifier are the same, the method performs the command to handle data. Alternatively, if the method determines that the data state identifier and the parity state identifier differ, the method generates an error message.
BRIEF DESCRIPTION OF THE DRAWINGSThe invention will be better understood from a reading of the following detailed description taken in conjunction with the drawings in which like reference designators are used to designate like elements, and in which:
FIG. 1 is a block diagram of one embodiment of Applicants' information storage and retrieval system;
FIG. 2 is a block diagram showing four data states/parity states;
FIG. 3A is a block diagram showing a data sector comprising a data portion and a metadata portion;
FIG. 3B is a block diagram of the metadata portion ofFIG. 3A comprising a plurality of data state addresses;
FIG. 4A is a block diagram showing a Data State Identifier maintained at a first State Address for information written to a first storage medium;
FIG. 4B is a block diagram showing a Data State Identifier maintained at a second State Address for information written to a second storage medium;
FIG. 4C is a block diagram showing a Data State Identifier maintained at a third State Address for information written to a third storage medium;
FIG. 4D is a block diagram showing a Data State Identifier maintained at a first State Address on the (m)th sector written to a first storage medium and a corresponding Parity State Identifier maintained at a first State Address on the (m)th sector written to a third storage medium;
FIG. 4E is a block diagram showing a Data State Identifier maintained at a second State Address on the (m)th sector written to a second storage medium and a corresponding Parity State Identifier maintained at a second State Address on the (m)th sector written to a third storage medium;
FIG. 4F is a block diagram showing a Data State Identifier maintained at a third State Address on the (m)th sector written to a third storage medium and a corresponding Parity State Identifier maintained at a third State Address on the (m)th sector written to a first storage medium;
FIG. 5 is a flow chart summarizing the steps of Applicants' method to write data;
FIG. 6 recites an algorithm encoding the method ofFIG. 5; and
FIG. 7 is a flow chart summarizing the steps of Applicants' method to read data.
DETAILED DESCRIPTION OF THE PREFERRED EMBODIMENTSReferring to the illustrations, like numerals correspond to like parts depicted in the Figures. The invention will be described as embodied in a data storage and retrieval system comprising two or more clusters, where each of those clusters includes one or more processors, one or more data caches, and one or more non-volatile storage devices. The following description of Applicants' method to assign data states and parity states when writing data is not meant, however, to limit Applicants' invention to data processing systems in general, or to data processing system which include a plurality of clusters, as the invention herein can be applied to writing data to a plurality of storage media in general.
In the illustrated embodiment ofFIG. 1, Applicants' information storage andretrieval system100 includes afirst cluster101A and asecond cluster101B. Each cluster includes aprocessor portion130/140 and an input/output portion160/170, respectively. Internal PCI buses in each cluster are connected via a Remote I/O bridge155/165 between theprocessor portions130/140 and device I/O portions160/170, respectively.
In the illustrated embodiment ofFIG. 1,system100 is capable of communicating withhost computer125 viacommunication link127. In certain embodiments,communication link127 is selected from a serial interconnection, such as RS-232 or RS-422, an ethernet interconnection, a SCSI interconnection, a Fibre Channel interconnection, an ESCON interconnection, a FICON interconnection, a Local Area Network (LAN), a private Wide Area Network (WAN), a public wide area network, Storage Area Network (SAN), Transmission Control Protocol/Internet Protocol (TCP/IP), the Internet, and combinations thereof.
Information storage andretrieval system100 further includes a plurality of host adapters102-105,107-110,112-115, and117-120, disposed in fourhost bays101,106,111, and116. Each host adapter may comprise one or more Fibre Channel ports, one or more FICON ports, one or more ESCON ports, or one or more SCSI ports. Each host adapter is connected to both clusters through one or more CommonPlatform Interconnect bus121 such that each cluster can handle I/O from any host adapter.
Processor portion130 includesprocessor132 andcache134. In certain embodiments,processor portion130 further includememory133. In certain embodiments,memory device133 comprises random access memory. In certain embodiments,memory device133 comprises non-volatile memory.
Processor portion140 includesprocessor142 andcache144. In certain embodiments,processor portion140 further includememory143. In certain embodiments,memory device143 comprises random access memory. In certain embodiments,memory device143 comprises non-volatile memory.
I/O portion160 includes non-volatile storage (“NVS”)162 andNVS batteries164. I/O portion170 includesNVS172 andNVS batteries174.
I/O portion160 further comprises a plurality of device adapters, such asdevice adapters165,166,167, and168, and information storage media organized into two arrays, namely array “A” and array “B”. The illustrated embodiment ofFIG. 1 shows two information storage arrays. In other embodiments, Applicants' information storage and retrieval system includes more than two information storage arrays. Each such information storage array appears to a host computer as one or more logical devices.
In certain embodiments, Applicants' information storage media comprise magnetic media, such as for example hard disks disposed in individual hard disk drive units. In certain embodiments, Applicants' information storage media comprise optical media, such as for example CDs, DVDs, and the like. In certain embodiments, Applicants' information storage media comprise electronic storage media, such as PROMs, EPROMS, EEPROMs, Flash PROMs, compactflash, smartmedia, and the like.
In certain embodiments, arrays “A” and “B” utilize a RAID protocol. In certain embodiments, arrays “A” and “B” comprise what is sometimes called a JBOD array, i.e. “Just a Bunch Of Disks” where the array is not configured according to RAID. As those skilled in the art will appreciate, a RAID (Redundant Array of Independent Disks) rank comprises independent information storage media configured in an array to obtain performance, capacity and reliability that exceeds that of a single large storage medium.
In the certain embodiments, array “A” includes hard disk drives181,182,183,191,192,193, and194, and array “B” includes hard disk drives185,186,187,188,196,197, and198.
Applicants' information storage and retrieval system, such as system100 (FIG. 1), receives new data from one or more host computers, such as forexample host computer125 and writes that new data to one or more information storage arrays, such as for example information storage array180 (FIG. 1). The illustrated embodiment ofFIG. 1 showssystem100 interconnected with one host computer. In other embodiments, Applicants' information storage and retrieval system is capable of communicating with a plurality of host computers.
Applicants' information storage and retrieval system receives new data, and writes that new data to one or more designated sectors on one or more information storage media. A number of failure modes exist wherein that new data may not be encoded to the storage media. For example, data storage devices sometimes fail to properly write data to the information storage medium. In addition, data storage devices sometimes perform offtrack writes to a sector. Regardless of the failure mode, a subsequent attempt to read the new data instead returns old data. Using a RAID 5 protocol, if a single sector write is unsuccessful a subsequent write to the parity stripe that causes the invalidly written sector to be read in calculating the new parity, the parity will become corrupt with the previous data because the read used to update the parity will get stale data instead of the data that was used when creating the parity.
In certain embodiments, Applicants' method writes information to a designated sector using a RAID 5 protocol. A RAID (Redundant Array of Independent Disks) combines two protocols: parallelism and redundancy. A RAID uses multiple information storage media in parallel to provide much higher bandwidth than a single storage medium. A RAID can also perform multiple operations in parallel. Redundancy in the form of parity is used to maintain reliability. By storing parity, data can be fully recovered after a single storage device failure.
Using a RAID 5 protocol, data is striped across multiple storage media as blocks. With (R) storage media, a group of (R−1) data blocks is striped across (R−1) media. A parity block is computed by exclusive-oring (“XORing”) these (R−1) blocks, and the parity block is stored on the remaining storage medium. Parity is distributed meaning that successive parity blocks are stored on different storage media to avoid the bottleneck of a dedicated parity medium. Each individual block is called a stripe unit, and a collection of (R−1) data blocks and a parity block is called a parity stripe.
For peak efficiency, a full parity stripe should be written at once. In this case, the data and the parity can be written out in parallel. If only part of the parity stripe is modified, parity must be recomputed from the data already on disk. The old data and parity must be read, and then the new data and the recomputed parity are written.
Each information storage medium in Applicants' one or more storage arrays comprises a plurality of sectors, such as for example sector300 (FIG. 3A), where each of those sectors includes aninformation portion340 comprising about 512 bytes and ametadata portion350 comprising about 12 bytes.
In a storage system comprising (R) storage media, Applicants' method maintains (R) State Addresses for data written tosector300, where (R) is greater than or equal to 2. A Data State Identifier is maintained in one of those (R) State Addresses.
As a general matter, Applicants' method writes both the data and the corresponding Data State Identifier to the same sector. In theevent sector300 is written to (i)th storage medium, then Applicants' method utilizes the (i)th State Address to store the Data State Identifier for the data written tosector300.
As an example and referring toFIG. 4A, in this illustrated embodiment Applicants' storage system includes 3 storage media, namelystorage media410,420, and430. In the illustrated embodiment ofFIG. 4A,sector300 is written tofirst storage medium410, and therefore, Applicants' method maintains a Data State Identifier for the data ofsector300 using the first State Address, namelyState Address310. In this illustrated embodiment, that Data State Identifier is “01.”
In the illustrated embodiment ofFIG. 4B,sector300 is written tosecond storage medium420, and therefore, Applicants' method maintains a Data State Identifier for the data ofsector300 using the second State Address, namelyState Address320. In this illustrated embodiment, that Data State Identifier is “00.”
In the illustrated embodiment ofFIG. 4C,sector300 is written tothird storage medium430, and therefore, Applicants' method maintains a Data State Identifier for the data ofsector300 using the third State Address, namelyState Address330. In this illustrated embodiment, that Data State Identifier is “02.”
As those skilled in the art will appreciate, an information storage medium may comprise many thousands, or more, of sectors. Using Applicants' method, the data state for any one of those sectors can be determined by examining the Data State Identifier written one of the State Addresses disposed in the metadata portion of that sector.
Referring toFIG. 2, in certain embodiments Applicants' method defines 4 different data states, namely State0, State1, State2, and State3. In the illustrated embodiment ofFIG. 2, State0 is assigned identifier “00,” State1 is assigned identifier “01”, State2 is assigned identifier “10,” and State3 is assigned identifier “11”.
Applicants' method maintains a corresponding parity sector for each information sector. As a general matter, if Applicants' method writes information to the (m)th sector on the (i)th storage medium, then Applicants' method maintains a Data State Identifier for that information at the (i)th State Address portion of the (m)th sector on (i)th storage medium, and maintains a Parity State Identifier for the information at the (i)th State Address portion of the (m)th sector on the (j)th storage medium, where (i) and (j) differ. As a further general matter, where a parity sector is written to the (m)th sector on the (j)th storage medium, then the (j)th State Address portion of that (m)th sector on the (j)th storage medium will not be used.
For example in the illustrated embodiment ofFIG. 4D, information has been written tosector300, i.e. the “m(th)” sector, on the (i)th storage medium410, where (i) is 1. This being the case, Applicants' method maintains a Data State Identifier at the (i)thState Address portion310 of that (m)th sector of the (i)th storage medium. In the illustrated embodiment ofFIG. 4D, that Data State Identifier is “01.” Applicants' method maintains a corresponding (m)th parity sector on the (j)th storage medium. In the illustrated embodiment ofFIG. 4D, (j) is 3, i.e.parity sector300 is written to thethird storage medium430. Applicants' method further maintains a Parity State Identifier in the (i)th State Address portion, i.e.State Address310 portion ofparity sector300 on the third storage medium. In the illustrated embodiment ofFIG. 4D, that Parity State Identifier is “01.” Thus in the illustrated embodiment ofFIG. 4D, the Data State Identifier and the Parity State Identifier are the same for the information written tosector300 onstorage medium410.
In the illustrated embodiment ofFIG. 4E, information has been written tosector300, i.e. the “m(th)” sector, on the (i)th storage medium420, where (i) is 2. This being the case, Applicants' method maintains a Data State Identifier at the (i)thState Address portion320 of that (m)th sector of the (i)th storage medium. In the illustrated embodiment ofFIG. 4E, that Data State Identifier is “00.” Applicants' method maintains a corresponding (m)th parity sector on the (j)th storage medium. In the illustrated embodiment ofFIG. 4E, (j) is 3, i.e.parity sector300 is written to thethird storage medium430. Applicants' method further maintains a Parity State Identifier in the (i)th State Address portion, i.e.State Address320 portion, ofsector300 on the third storage medium. In the illustrated embodiment ofFIG. 4E, that Parity State Identifier is “00.” Thus in the illustrated embodiment ofFIG. 4E, the Data State Identifier and the Parity State Identifier are the same for the information written tosector300 onstorage medium410.
In the illustrated embodiment ofFIG. 4F, information has been written tosector300, i.e. the “m(th)” sector, on the (i)th storage medium430, where (i) is 3. This being the case, Applicants' method maintains a Data State Identifier at the (i)thState Address portion330 of that (m)th sector of the (i)th storage medium. In the illustrated embodiment ofFIG. 4F, that Data State Identifier is “02.” Applicants' method maintains a corresponding (m)th parity sector on the (j)th storage medium. In the illustrated embodiment ofFIG. 4F, (j) is 1 i.e.parity sector300 is written to thefirst storage medium410. Applicants' method further maintains a Parity State Identifier in the (i)th State Address portion, i.e.State Address330 portion ofsector300 on the first storage medium. In the illustrated embodiment ofFIG. 4F, that Parity State Identifier is “00.” Thus in the illustrated embodiment ofFIG. 4F, the Data State Identifier and the Parity State Identifier differ indicating that a dropped write has occurred.
Referring again toFIG. 2, in certain embodiments Applicants' method defines 4 different parity states, namely State0, State1, State2, and State3. In the illustrated embodiment ofFIG. 2, State0 is assigned identifier “00,” State1 is assigned identifier “01”, State2 is assigned identifier “10,” and State3 is assigned identifier “11” Using Applicants' method, each time data is written tosector300, the Data State Identifier and the Parity State Identifier forsector300 are incremented. As a general matter, Applicants' method includes defining (N) states. Incrementing the (i)th Data State/Parity State forsector300 includes assigning tosector300 the (i+1)th Data State and the (i+1)th Parity State, unless (i) equals (N−1). If (i) equals (N−1), then incrementing the (i)th Data State/Parity State means setting (i) equal to 0. For example where (N) is 4, State0 is incremented to State1, State1 is incremented to State2, State2 is incremented to State3, and State3 is incremented to State0.
Applicants' invention includes a method to check data integrity when handling data. The steps of an embodiment of that method to write data are summarized inFIG. 5. Referring now toFIG. 5, instep510 Applicants' method defines (N) First Data and Parity States and (M) Second Data and Parity States. The (N) First States are used when performing less Can a full array wide WRITE. The (M) Second States are used when performing a full array wide WRITE.
In certain embodiments,step510 includes defining 4 First States. In certain embodiments, those 4 First States correspond to States210 (FIG. 2),230 (FIG. 2),250 (FIG. 2), and270 (FIG. 2), where those 4 First States are assignedidentifiers220,240,260, and280, respectively. In other embodiments, Applicants' method defines more than 4 States. In yet other embodiments, Applicants' method defines 2 States. In yet other embodiments, Applicants' method defines 3 States.
In certain embodiments, the (N) First States ofstep510 are defined by the manufacturer of the information storage and retrieval system, such as for example system100 (FIG. 1). In other embodiments, the N) First States ofstep510 are defined by the owner and/or operator of the information storage and retrieval system. In yet other embodiments, the (N) First States ofstep510 are defined by a host computer, such as for example host computer125 (FIG. 1).
Instep520, Applicants' information storage and retrieval system receives data and a WRITE command to write that data to a target sector, i.e. a designated Logical Block Address. In certain embodiments,step520 is performed by a processor disposed in Applicants' information storage and retrieval system, such as for example processor132 (FIG. 1).
Instep530, Applicants' method determines if the WRITE command ofstep520 includes a full array wide WRITE, i.e. a full parity stripe. In certain embodiments,step530 is performed by a processor disposed in Applicants' information storage and retrieval system, such as for example processor132 (FIG. 1). If Applicants' method determines instep530 that the WRITE command ofstep520 comprises a full array wide WRITE, then the method transitions fromstep530 to step532 wherein the method randomly assigns one of the (M) Second States as both the Data State Identifier and the Parity State Identifier. In certain embodiments,step532 is performed by a processor disposed in Applicants' information storage and retrieval system, such as for example processor132 (FIG. 1).
Applicants' method transitions fromstep532 to step534 wherein the method writes the data received instep520, and writes the Data State Identifier assigned instep532 to the designated information storage array. In certain embodiments,step534 is performed by a processor disposed in Applicants' information storage and retrieval system, such as for example processor132 (FIG. 1).
Instep536, Applicants' method writes the Parity State Identifier assigned instep532 to the corresponding parity block disposed in Applicants' information storage array. In certain embodiments,step536 is performed by a processor disposed in Applicants' information storage and retrieval system, such as for example processor132 (FIG. 1).
If Applicants' method determines instep530 that the WRITE command ofstep520 does not comprises a full array wide WRITE, then the method transitions fromstep530 to step540 wherein the method reads the last assigned Data State Identifier for each target sector. References herein to writing “a target sector” or “the target sector” include writes to more than one target sector where that write operation comprises less than a full stride write. In certain embodiments,step540 is performed by a processor disposed in Applicants' information storage and retrieval system, such as for example processor132 (FIG. 1).
Applicant's' method transitions fromstep540 to step550 wherein the method reads the last assigned Parity State Identifier for each target sector. In certain embodiments,step550 is performed by a processor disposed in Applicants' information storage and retrieval system, such as for example processor132 (FIG. 1).
Applicants' method transitions fromstep550 to step560 wherein the method compares the Data State Identifier read instep540 for each target sector with the Parity State Identifier read instep550 for each target sector. In certain embodiments,step560 is performed by a processor disposed in Applicants' information storage and retrieval system, such as for example processor132 (FIG. 1).
If Applicants' method determines instep560 that the Data State Identifier and the Parity State Identifier differ for any of the target sectors, then a dropped write has been detected. For example, in the illustrated embodiment ofFIG. 4F the Data State Identifier and the Parity State Identifier differ. If the Data State Identifier and the Parity State Identifier differ, then Applicants' method transitions fromstep560 to step565 wherein the method generates an error log. In certain embodiments,step565 is performed by a processor disposed in Applicants' information storage and retrieval system, such as for example processor132 (FIG. 1).
Alternatively, if Applicants' method determines instep560 that the Data State Identifier and the Parity State Identifier for each target sector are the same, then Applicants' method transitions fromstep560 to step570. For example, in the illustrated embodiment ofFIG. 4D the Data State Identifier and the Parity State Identifier are the same.
Instep570, Applicants' method increments the Data State Identifier for each target sector, and saves that incremented Data State Identifier(s). In certain embodiments,step570 is performed by a processor disposed in Applicants' information storage and retrieval system, such as for example processor132 (FIG. 1).
Instep580, Applicants' method calculates a new parity for each target sector, and increments the Parity State Identifier for each target sector. In certain embodiments,step580 is performed by a processor disposed in Applicants' information storage and retrieval system, such as for example processor132 (FIG. 1).
Instep590, Applicants' method writes the data received instep520 to the data portion of the target sector(s), and writes the incremented Data State Identifier for each target sector to the metadata portion(s) of the target sector(s). In certain embodiments,step590 is performed by a processor disposed in Applicants' information storage and retrieval system, such as for example processor132 (FIG. 1).
Instep595, Applicants' method writes the new parity for each target sector and the incremented Parity State Identifier for each target sector to the parity block for each target sector. In certain embodiments,step595 is performed by a processor disposed in Applicants' information storage and retrieval system, such as for example processor132 (FIG. 1).
Referring now toFIGS. 5 and 6, in certain embodiments Applicants' method is encoded usingalgorithm600. Step610 comprises elements ofstep540. Step620 comprises elements ofstep550. Step630 comprises elements ofstep560.Steps640 and650 comprise elements ofstep570. Step660 comprises elements ofstep580. Step670 comprises elements ofstep590. Step680 comprises elements ofstep595.
Applicants' method further includes embodiments to read data. Referring now toFIG. 7, instep710 Applicants' information storage and retrieval system receives a READ command to read data from a target sector, i.e. a designated Logical Block Address. References herein to reading “a target sector” or “the target sector” include reads of more than one target sector. In certain embodiments,step710 is performed by a processor disposed in Applicants' information storage and retrieval system, such as for example processor132 (FIG. 1).
Instep720, Applicants' method reads the last assigned Data State Identifier for each target sector. In certain embodiments,step720 is performed by a processor disposed in Applicants' information storage and retrieval system, such as for example processor132 (FIG. 1).
Applicant's' method transitions fromstep720 to step730 wherein the method reads the last assigned Parity State Identifier for each target sector. In certain embodiments,step730 is performed by a processor disposed in Applicants' information storage and retrieval system, such as for example processor132 (FIG. 1).
Applicants' method transitions fromstep730 to step740 wherein the method compares the Data State Identifier for each target sector with the Parity State Identifier for each target sector. In certain embodiments,step740 is performed by a processor disposed in Applicants' information storage and retrieval system, such as for example processor132 (FIG. 1).
If Applicants' method determines instep740 that the Data State Identifier and the Parity State Identifier for any target sector differs, then a dropped write has been detected. If the Data State Identifier and the Parity State Identifier for any target sector differs, then Applicants' method transitions fromstep740 to step750 wherein the method generates an error log. In certain embodiments,step740 is performed by a processor disposed in Applicants' information storage and retrieval system, such as for example processor132 (FIG. 1).
Alternatively, if Applicants' method determines instep740 that the Data State Identifier and the Parity State Identifier are the same for all target sectors, then Applicants' method transitions fromstep740 to step760 wherein the method provides the requested information. In certain embodiments,step760 is performed by a processor disposed in Applicants' information storage and retrieval system, such as for example processor132 (FIG. 1).
The method ofFIG. 5, or the method ofFIG. 6, or the method ofFIG. 7, may be implemented separately. In certain embodiments, individual steps recited inFIG. 5 and/orFIG. 6, and/orFIG. 7, may be combined, eliminated, or reordered.
In certain embodiments, Applicants' invention includes instructions residing in memory133 (FIG. 1), where those instructions are executed by processor132 (FIG. 1) to performssteps520,530,532,534,536,540,550,560,565,570,580,590, and595, recited inFIG. 5, orsteps610 through680 recited inFIG. 6, and/orsteps710 through760 recited inFIG. 7. In other embodiments, Applicants' invention includes instructions residing in any other computer program product, where those instructions are executed by a computer external to, or internal to,system100, to performsteps520,530,532,534,536,5640,550,560,565,570,580,590, and595, recited inFIG. 5, orsteps610 through680 recited inFIG. 6, and/orsteps710 through760 recited inFIG. 7. In either case, the instructions may be encoded in an information storage medium comprising, for example, a magnetic information storage medium, an optical information storage medium, an electronic information storage medium, and the like. By “electronic storage media,” Applicants mean for example, a device such as a PROM, EPROM, EEPROM, Flash PROM, compactflash, smartmedia, and the like.
While the preferred embodiments of the present invention have been illustrated in detail, it should be apparent that modifications and adaptations to those embodiments may occur to one skilled in the art without departing from the scope of the present invention as set forth in the following claims.