]> git.ipfire.org Git - thirdparty/mdadm.git/commitdiff
imsm: Metadata Attributes compatibility support
authorAdam Kwolek <adam.kwolek@intel.com>
Tue, 14 Jun 2011 13:59:18 +0000 (15:59 +0200)
committerNeilBrown <neilb@suse.de>
Tue, 14 Jun 2011 23:58:57 +0000 (09:58 +1000)
IMSM's meta data contains Attributes field that contains information about
supported features.
To assembly an array mdadm has to support all features specified by attributes.

The patch introduces new attributes support and validation of the attribuses
during an array assembly.

Signed-off-by: Adam Kwolek <adam.kwolek@intel.com>
Signed-off-by: Krzysztof Wojcik <krzysztof.wojcik@intel.com>
Signed-off-by: NeilBrown <neilb@suse.de>
super-intel.c

index bb76f74938c0c046fa5f5388f27e2e216dcf8b5f..7c45541c3655be397096d9ec800b203c2c2aa098 100644 (file)
 #define MAX_SIGNATURE_LENGTH  32
 #define MAX_RAID_SERIAL_LEN   16
 
-#define MPB_ATTRIB_CHECKSUM_VERIFY __cpu_to_le32(0x80000000)
-#define MPB_ATTRIB_PM      __cpu_to_le32(0x40000000)
-#define MPB_ATTRIB_2TB     __cpu_to_le32(0x20000000)
-#define MPB_ATTRIB_RAID0   __cpu_to_le32(0x00000001)
-#define MPB_ATTRIB_RAID1   __cpu_to_le32(0x00000002)
-#define MPB_ATTRIB_RAID10  __cpu_to_le32(0x00000004)
-#define MPB_ATTRIB_RAID1E  __cpu_to_le32(0x00000008)
-#define MPB_ATTRIB_RAID5   __cpu_to_le32(0x00000010)
-#define MPB_ATTRIB_RAIDCNG __cpu_to_le32(0x00000020)
+/* supports RAID0 */
+#define MPB_ATTRIB_RAID0               __cpu_to_le32(0x00000001)
+/* supports RAID1 */
+#define MPB_ATTRIB_RAID1               __cpu_to_le32(0x00000002)
+/* supports RAID10 */
+#define MPB_ATTRIB_RAID10              __cpu_to_le32(0x00000004)
+/* supports RAID1E */
+#define MPB_ATTRIB_RAID1E              __cpu_to_le32(0x00000008)
+/* supports RAID5 */
+#define MPB_ATTRIB_RAID5               __cpu_to_le32(0x00000010)
+/* supports RAID CNG */
+#define MPB_ATTRIB_RAIDCNG             __cpu_to_le32(0x00000020)
+/* supports expanded stripe sizes of  256K, 512K and 1MB */
+#define MPB_ATTRIB_EXP_STRIPE_SIZE     __cpu_to_le32(0x00000040)
+
+/* The OROM Support RST Caching of Volumes */
+#define MPB_ATTRIB_NVM                 __cpu_to_le32(0x02000000)
+/* The OROM supports creating disks greater than 2TB */
+#define MPB_ATTRIB_2TB_DISK            __cpu_to_le32(0x04000000)
+/* The OROM supports Bad Block Management */
+#define MPB_ATTRIB_BBM                 __cpu_to_le32(0x08000000)
+
+/* THe OROM Supports NVM Caching of Volumes */
+#define MPB_ATTRIB_NEVER_USE2           __cpu_to_le32(0x10000000)
+/* The OROM supports creating volumes greater than 2TB */
+#define MPB_ATTRIB_2TB                 __cpu_to_le32(0x20000000)
+/* originally for PMP, now it's wasted b/c. Never use this bit! */
+#define MPB_ATTRIB_NEVER_USE           __cpu_to_le32(0x40000000)
+/* Verify MPB contents against checksum after reading MPB */
+#define MPB_ATTRIB_CHECKSUM_VERIFY     __cpu_to_le32(0x80000000)
+
+/* Define all supported attributes that have to be accepted by mdadm
+ */
+#define MPB_ATTRIB_SUPPORTED           MPB_ATTRIB_CHECKSUM_VERIFY | \
+                                       MPB_ATTRIB_2TB             | \
+                                       MPB_ATTRIB_2TB_DISK        | \
+                                       MPB_ATTRIB_RAID0           | \
+                                       MPB_ATTRIB_RAID1           | \
+                                       MPB_ATTRIB_RAID10          | \
+                                       MPB_ATTRIB_RAID5           | \
+                                       MPB_ATTRIB_EXP_STRIPE_SIZE
 
 #define MPB_SECTOR_CNT 2210
 #define IMSM_RESERVED_SECTORS 4096
@@ -1096,6 +1128,90 @@ void examine_migr_rec_imsm(struct intel_super *super)
        }
 }
 
+/*******************************************************************************
+ * function: imsm_check_attributes
+ * Description: Function checks if features represented by attributes flags
+ *             are supported by mdadm.
+ * Parameters:
+ *             attributes - Attributes read from metadata
+ * Returns:
+ *             0 - passed attributes contains unsupported features flags
+ *             1 - all features are supported
+ ******************************************************************************/
+static int imsm_check_attributes(__u32 attributes)
+{
+       int ret_val = 1;
+       __u32 not_supported = (MPB_ATTRIB_SUPPORTED)^0xffffffff;
+
+       not_supported &= attributes;
+       if (not_supported) {
+               fprintf(stderr, Name "(IMSM): Unsupported attributes : %x\n", not_supported);
+               if (not_supported & MPB_ATTRIB_CHECKSUM_VERIFY) {
+                       dprintf("\t\tMPB_ATTRIB_CHECKSUM_VERIFY \n");
+                       not_supported ^= MPB_ATTRIB_CHECKSUM_VERIFY;
+               }
+               if (not_supported & MPB_ATTRIB_2TB) {
+                       dprintf("\t\tMPB_ATTRIB_2TB\n");
+                       not_supported ^= MPB_ATTRIB_2TB;
+               }
+               if (not_supported & MPB_ATTRIB_RAID0) {
+                       dprintf("\t\tMPB_ATTRIB_RAID0\n");
+                       not_supported ^= MPB_ATTRIB_RAID0;
+               }
+               if (not_supported & MPB_ATTRIB_RAID1) {
+                       dprintf("\t\tMPB_ATTRIB_RAID1\n");
+                       not_supported ^= MPB_ATTRIB_RAID1;
+               }
+               if (not_supported & MPB_ATTRIB_RAID10) {
+                       dprintf("\t\tMPB_ATTRIB_RAID10\n");
+                       not_supported ^= MPB_ATTRIB_RAID10;
+               }
+               if (not_supported & MPB_ATTRIB_RAID1E) {
+                       dprintf("\t\tMPB_ATTRIB_RAID1E\n");
+                       not_supported ^= MPB_ATTRIB_RAID1E;
+               }
+               if (not_supported & MPB_ATTRIB_RAID5) {
+               dprintf("\t\tMPB_ATTRIB_RAID5\n");
+                       not_supported ^= MPB_ATTRIB_RAID5;
+               }
+               if (not_supported & MPB_ATTRIB_RAIDCNG) {
+                       dprintf("\t\tMPB_ATTRIB_RAIDCNG\n");
+                       not_supported ^= MPB_ATTRIB_RAIDCNG;
+               }
+               if (not_supported & MPB_ATTRIB_BBM) {
+                       dprintf("\t\tMPB_ATTRIB_BBM\n");
+               not_supported ^= MPB_ATTRIB_BBM;
+               }
+               if (not_supported & MPB_ATTRIB_CHECKSUM_VERIFY) {
+                       dprintf("\t\tMPB_ATTRIB_CHECKSUM_VERIFY (== MPB_ATTRIB_LEGACY)\n");
+                       not_supported ^= MPB_ATTRIB_CHECKSUM_VERIFY;
+               }
+               if (not_supported & MPB_ATTRIB_EXP_STRIPE_SIZE) {
+                       dprintf("\t\tMPB_ATTRIB_EXP_STRIP_SIZE\n");
+                       not_supported ^= MPB_ATTRIB_EXP_STRIPE_SIZE;
+               }
+               if (not_supported & MPB_ATTRIB_2TB_DISK) {
+                       dprintf("\t\tMPB_ATTRIB_2TB_DISK\n");
+                       not_supported ^= MPB_ATTRIB_2TB_DISK;
+               }
+               if (not_supported & MPB_ATTRIB_NEVER_USE2) {
+                       dprintf("\t\tMPB_ATTRIB_NEVER_USE2\n");
+                       not_supported ^= MPB_ATTRIB_NEVER_USE2;
+               }
+               if (not_supported & MPB_ATTRIB_NEVER_USE) {
+                       dprintf("\t\tMPB_ATTRIB_NEVER_USE\n");
+                       not_supported ^= MPB_ATTRIB_NEVER_USE;
+               }
+
+               if (not_supported)
+                       dprintf(Name "(IMSM): Unknown attributes : %x\n", not_supported);
+
+               ret_val = 0;
+       }
+
+       return ret_val;
+}
+
 static void getinfo_super_imsm(struct supertype *st, struct mdinfo *info, char *map);
 
 static void examine_super_imsm(struct supertype *st, char *homehost)
@@ -1117,6 +1233,11 @@ static void examine_super_imsm(struct supertype *st, char *homehost)
        printf("    Orig Family : %08x\n", __le32_to_cpu(mpb->orig_family_num));
        printf("         Family : %08x\n", __le32_to_cpu(mpb->family_num));
        printf("     Generation : %08x\n", __le32_to_cpu(mpb->generation_num));
+       printf("     Attributes : ");
+       if (imsm_check_attributes(mpb->attributes))
+               printf("All supported\n");
+       else
+               printf("not supported\n");
        getinfo_super_imsm(st, &info, NULL);
        fname_from_uuid(st, &info, nbuf, ':');
        printf("           UUID : %s\n", nbuf + 5);
@@ -5396,6 +5517,13 @@ static struct mdinfo *container_content_imsm(struct supertype *st, char *subarra
        struct dl *d;
        int spare_disks = 0;
 
+       /* do not assemble arrays when not all attributes are supported */
+       if (imsm_check_attributes(mpb->attributes) == 0) {
+               fprintf(stderr, Name ": IMSM metadata loading not allowed "
+                       "due to attributes incompatibility.\n");
+               return NULL;
+       }
+
        /* check for bad blocks */
        if (imsm_bbm_log_size(super->anchor))
                bbm_errors = 1;