diff options
Diffstat (limited to 'drivers/md/raid5.h')
-rw-r--r-- | drivers/md/raid5.h | 61 |
1 files changed, 57 insertions, 4 deletions
diff --git a/drivers/md/raid5.h b/drivers/md/raid5.h index 0c7375ad12bd..633d79289616 100644 --- a/drivers/md/raid5.h +++ b/drivers/md/raid5.h | |||
@@ -394,9 +394,62 @@ typedef struct raid5_private_data raid5_conf_t; | |||
394 | /* | 394 | /* |
395 | * Our supported algorithms | 395 | * Our supported algorithms |
396 | */ | 396 | */ |
397 | #define ALGORITHM_LEFT_ASYMMETRIC 0 | 397 | #define ALGORITHM_LEFT_ASYMMETRIC 0 /* Rotating Parity N with Data Restart */ |
398 | #define ALGORITHM_RIGHT_ASYMMETRIC 1 | 398 | #define ALGORITHM_RIGHT_ASYMMETRIC 1 /* Rotating Parity 0 with Data Restart */ |
399 | #define ALGORITHM_LEFT_SYMMETRIC 2 | 399 | #define ALGORITHM_LEFT_SYMMETRIC 2 /* Rotating Parity N with Data Continuation */ |
400 | #define ALGORITHM_RIGHT_SYMMETRIC 3 | 400 | #define ALGORITHM_RIGHT_SYMMETRIC 3 /* Rotating Parity 0 with Data Continuation */ |
401 | 401 | ||
402 | /* Define non-rotating (raid4) algorithms. These allow | ||
403 | * conversion of raid4 to raid5. | ||
404 | */ | ||
405 | #define ALGORITHM_PARITY_0 4 /* P or P,Q are initial devices */ | ||
406 | #define ALGORITHM_PARITY_N 5 /* P or P,Q are final devices. */ | ||
407 | |||
408 | /* DDF RAID6 layouts differ from md/raid6 layouts in two ways. | ||
409 | * Firstly, the exact positioning of the parity block is slightly | ||
410 | * different between the 'LEFT_*' modes of md and the "_N_*" modes | ||
411 | * of DDF. | ||
412 | * Secondly, or order of datablocks over which the Q syndrome is computed | ||
413 | * is different. | ||
414 | * Consequently we have different layouts for DDF/raid6 than md/raid6. | ||
415 | * These layouts are from the DDFv1.2 spec. | ||
416 | * Interestingly DDFv1.2-Errata-A does not specify N_CONTINUE but | ||
417 | * leaves RLQ=3 as 'Vendor Specific' | ||
418 | */ | ||
419 | |||
420 | #define ALGORITHM_ROTATING_ZERO_RESTART 8 /* DDF PRL=6 RLQ=1 */ | ||
421 | #define ALGORITHM_ROTATING_N_RESTART 9 /* DDF PRL=6 RLQ=2 */ | ||
422 | #define ALGORITHM_ROTATING_N_CONTINUE 10 /*DDF PRL=6 RLQ=3 */ | ||
423 | |||
424 | |||
425 | /* For every RAID5 algorithm we define a RAID6 algorithm | ||
426 | * with exactly the same layout for data and parity, and | ||
427 | * with the Q block always on the last device (N-1). | ||
428 | * This allows trivial conversion from RAID5 to RAID6 | ||
429 | */ | ||
430 | #define ALGORITHM_LEFT_ASYMMETRIC_6 16 | ||
431 | #define ALGORITHM_RIGHT_ASYMMETRIC_6 17 | ||
432 | #define ALGORITHM_LEFT_SYMMETRIC_6 18 | ||
433 | #define ALGORITHM_RIGHT_SYMMETRIC_6 19 | ||
434 | #define ALGORITHM_PARITY_0_6 20 | ||
435 | #define ALGORITHM_PARITY_N_6 ALGORITHM_PARITY_N | ||
436 | |||
437 | static inline int algorithm_valid_raid5(int layout) | ||
438 | { | ||
439 | return (layout >= 0) && | ||
440 | (layout <= 5); | ||
441 | } | ||
442 | static inline int algorithm_valid_raid6(int layout) | ||
443 | { | ||
444 | return (layout >= 0 && layout <= 5) | ||
445 | || | ||
446 | (layout == 8 || layout == 10) | ||
447 | || | ||
448 | (layout >= 16 && layout <= 20); | ||
449 | } | ||
450 | |||
451 | static inline int algorithm_is_DDF(int layout) | ||
452 | { | ||
453 | return layout >= 8 && layout <= 10; | ||
454 | } | ||
402 | #endif | 455 | #endif |