Logo Search packages:      
Sourcecode: dmraid version File versions


 * SNIA DDF1 v1.0 metadata format handler.
 * Copyright (C) 2005-2006 IBM, All rights reserved.
 * Written by Darrick Wong <djwong@us.ibm.com>
 * Copyright (C) 2006 Heinz Mauelshagen, Red Hat GmbH
 *                    All rights reserved.
 * See file LICENSE at the top of this source tree for license information.

#ifndef _DDF1_H
#define _DDF1_H

/* Beginning of stuff that Darrick Wong added */
#ifdef      FORMAT_HANDLER
#undef      FORMAT_HANDLER

#define     HANDLER     "ddf1"

/* Number of config records */
#define NUM_CONFIG_ENTRIES(ddf1) ((ddf1)->primary->config_record_len / \

/* Macros to access config records */
#define SR(ddf, idx)    ((struct ddf1_spare_header*)(((uint8_t*)(ddf)->cfg) + \
      ((idx) * (ddf)->primary->vd_config_record_len * 512)))

#define CR(ddf, idx)    ((struct ddf1_config_record*)(((uint8_t*)(ddf)->cfg) + \
      ((idx) * (ddf)->primary->vd_config_record_len * 512)))

#define CR_IDS(ddf, cr) ((uint32_t*)(((uint8_t*)(cr)) + \
      sizeof(struct ddf1_config_record)))

#define CR_OFF(ddf, cr) ((uint64_t*)(((uint8_t*)(cr)) + \
      sizeof(struct ddf1_config_record) + \
      (ddf1_cr_off_maxpds_helper(ddf) * sizeof(uint32_t))))

/* DDF1 metadata offset in bytes */
#define     DDF1_CONFIGOFFSET       ((di->sectors - 1) << 9)
/* DDF1 metadata offset on weird adaptec controllers */
#define     DDF1_CONFIGOFFSET_ADAPTEC     ((di->sectors - 257) << 9)

/* Data offset in sectors */
#define     DDF1_DATAOFFSET         0

/* Assume block size is 512... */
#define DDF1_BLKSIZE          512

/* Length of GUIDs in DDF */
#define DDF1_GUID_LENGTH      24

/* Length of DDF revision strings */
#define DDF1_REV_LENGTH       8

/* RAID types */
#define DDF1_RAID0            0x00
#define DDF1_RAID1            0x01
#define DDF1_RAID3            0x03
#define DDF1_RAID4            0x04
#define DDF1_RAID5            0x05
#define DDF1_RAID1E           0x11
#define DDF1_JBOD       0x0F
#define DDF1_CONCAT           0x1F
#define DDF1_RAID5E           0x15
#define DDF1_RAID5EE          0x25
#define DDF1_RAID6            0x16

#define DDF1_RAID5_RS         0
#define DDF1_RAID5_LA         2
#define DDF1_RAID5_LS         3

/* Table signatures */
#define DDF1_HEADER           0xDE11DE11
#define DDF1_ADAPTER_DATA     0XAD111111
#define DDF1_PHYS_DRIVE_REC   0X22222222
#define DDF1_FORCED_PD_GUID   0x33333333
#define DDF1_SPARE_REC        0x55555555
#define DDF1_VU_CONFIG_REC    0x88888888
#define DDF1_VENDOR_DATA      0x01DBEEF0
#define DDF1_BAD_BLOCKS       0xABADB10C
#define DDF1_INVALID          0xFFFFFFFF

/* DDF1 version string */
#define DDF1_VER_STRING       "01.00.00"

/* The DDF1 header table */
struct ddf1_header {
      uint32_t    signature;
      uint32_t    crc;
      uint8_t           guid[DDF1_GUID_LENGTH];
      uint8_t           ddf_rev[DDF1_REV_LENGTH];
      uint32_t    seqnum;
      uint32_t    timestamp;
      uint8_t           open_flag;
      uint8_t           foreign_flag;
      uint8_t           grouping_enforced;
      uint8_t           reserved2[45];
      uint64_t    primary_table_lba;
      uint64_t    secondary_table_lba;
      uint8_t           header_type;
      uint8_t           reserved3[3];
      uint32_t    workspace_length;
      uint64_t    workspace_lba;
      uint16_t    max_phys_drives;
      uint16_t    max_virt_drives;
      uint16_t    max_partitions;
      uint16_t    vd_config_record_len;
      uint16_t    max_primary_elements;
      uint8_t           reserved4[54];
      uint32_t    adapter_data_offset;
      uint32_t    adapter_data_len;
      uint32_t    phys_drive_offset;
      uint32_t    phys_drive_len;
      uint32_t    virt_drive_offset;
      uint32_t    virt_drive_len;
      uint32_t    config_record_offset;
      uint32_t    config_record_len;
      uint32_t    disk_data_offset;
      uint32_t    disk_data_len;
      uint32_t    badblock_offset;
      uint32_t    badblock_len;
      uint32_t    diag_offset;
      uint32_t    diag_len;
      uint32_t    vendor_offset;
      uint32_t    vendor_len;
      uint8_t           reserved5[256];
} __attribute__ ((packed));

/* The adapter data header */
struct ddf1_adapter {
      uint32_t    signature;
      uint32_t    crc;
      uint8_t           guid[DDF1_GUID_LENGTH];
      uint16_t    pci_vendor;
      uint16_t    pci_device;
      uint16_t    pci_subvendor;
      uint16_t    pci_subdevice;
      uint8_t           reserved2[24];
      uint8_t           adapter_data[448];
} __attribute__ ((packed));

/* Physical drive info */
struct ddf1_disk_data {
      uint32_t    signature;
      uint32_t    crc;
      uint8_t           guid[DDF1_GUID_LENGTH];
      uint32_t    reference;
      uint8_t           forced_ref_flag;
      uint8_t           forced_guid_flag;
      uint8_t           scratch[32];
      uint8_t           reserved[442];
} __attribute__ ((packed));

/* Physical drive record header */
struct ddf1_phys_drives {
      uint32_t    signature;
      uint32_t    crc;
      uint16_t    num_drives;
      uint16_t    max_drives;
      uint8_t           reserved2[52];
      /* 64 bytes */
      /* Drive records follow */
} __attribute__ ((packed));

/* Physical drive record */
struct ddf1_phys_drive {
      uint8_t           guid[DDF1_GUID_LENGTH];
      uint32_t    reference;
      uint16_t    type;
      uint16_t    state;
      uint64_t    size;
      uint8_t           path_info[18];
      uint8_t           reserved3[6];
} __attribute__ ((packed));

/* Virtual drive record header */
struct ddf1_virt_drives {
      uint32_t    signature;
      uint32_t    crc;
      uint16_t    num_drives;
      uint16_t    max_drives;
      uint8_t           reserved2[52];
      /* Drive records follow */
} __attribute__ ((packed));

/* Virtual drive record */
struct ddf1_virt_drive {
      uint8_t           guid[DDF1_GUID_LENGTH];
      uint16_t    vd_num;
      uint16_t    reserved2;
      uint32_t    type;
      uint8_t           state;
      uint8_t           init_state;
      uint8_t           reserved3[14];
      uint8_t           name[16];
} __attribute__ ((packed));

/* Virtual disk configuration record. */
struct ddf1_config_record {
      uint32_t    signature;
      uint32_t    crc;
      uint8_t           guid[DDF1_GUID_LENGTH];
      uint32_t    timestamp;
      uint32_t    seqnum;
      uint8_t           reserved[24];
      uint16_t    primary_element_count;
      uint8_t           stripe_size;
      uint8_t           raid_level;
      uint8_t           raid_qualifier;
      uint8_t           secondary_element_count;
      uint8_t           secondary_element_number;
      uint8_t           secondary_element_raid_level;
      uint64_t    sectors;
      uint64_t    size;
      uint64_t    reserved2;
      uint32_t    spares[8];
      uint64_t    cache_policy;
      uint8_t           bg_task_rate;
      /* 137 bytes */
      uint8_t           reserved3[3+52+192+32+32+16+16+32];
      /* 512 bytes */
} __attribute__ ((packed));

/* Spare disk record */
struct ddf1_spare {
      uint8_t           guid[DDF1_GUID_LENGTH];
      uint16_t    secondary_element;
      uint8_t           reserved[6];
} __attribute__ ((packed));

/* Spare disk assignment record */
struct ddf1_spare_header {
      uint32_t    signature;
      uint32_t    crc;
      uint32_t    timestamp;
      uint8_t           reserved[7];
      uint8_t           type;
      uint16_t    num_spares;
      uint16_t    max_spares;
      uint8_t           reserved2[8];
      struct ddf1_spare spares[0];
} __attribute__ ((packed));

/* Metadata owner */
struct ddf1 {
      struct ddf1_header anchor;
      uint64_t anchor_offset;

      struct ddf1_header *primary, *secondary;
      struct ddf1_adapter *adapter;
      struct ddf1_disk_data *disk_data;
      struct ddf1_phys_drives *pd_header;
      struct ddf1_phys_drive *pds;
      struct ddf1_virt_drives *vd_header;
      struct ddf1_virt_drive *vds;
      struct ddf1_config_record *cfg;

      int disk_format;
      int in_cpu_format;
      int adaptec_mode;

#endif /* FORMAT_HANDLER */

int register_ddf1(struct lib_context *lc);

#endif /* _DDF1_H */

Generated by  Doxygen 1.6.0   Back to index