1. A method of protecting against at least T storage device failures in a group of N storage devices, comprising: setting a number K between 2 and T inclusive; logically partitioning a portion of each of the storage devices into one strip on each storage device; organizing strips on the storage devices into a stripe; partitioning each of the strips into at least one data element and at least one parity element; for each parity element, selecting a set of K data elements from the stripe so that: (a) the selected set of data elements has not already been selected for another parity element; (b) the selected data elements are located on K different storage devices; and (c) the storage devices of the selected data elements are different from the storage device of the parity element; ensuring that each data element is selected for T different parity elements; and generating a parity value from data values stored in the K data elements in the selected set of data elements and storing the parity value in the parity element.