本节开始讨论一下MD设备中的superblock操作,关于superblock的说明如下(/include/linux/raid/md_p.h):
/*
* RAID superblock.
*
* The RAID superblock maintains some statistics on each RAID configuration.
* Each real device in the RAID set contains it near the end of the device.
* Some of the ideas are copied from the ext2fs implementation.
* RAID的superblock包含了每个RAID配置的一些统计信息。
* 在RAID设备中的每个成员设备都包含一份,放置在成员设备的末尾。
* 一些信息从ext2fs实现中拷贝而得。
*
* We currently use 4096 bytes as follows:
*
* word offset function
*
* 0 - 31 Constant generic RAID device information. 恒定的通用RAID设备信息
* 32 - 63 Generic state information. 通用的状态信息
* 64 - 127 Personality specific information. 个性特有的信息
* 128 - 511 12 32-words descriptors of the disks in the raid set. 在RAID设备中成员磁盘的12个32字描述符
* 512 - 911 Reserved.
* 912 - 1023 Disk specific descriptor. 磁盘特有的描述符
*/
/*
* If x is the real device size in bytes, we return an apparent size of: 如果x是成员磁盘的大小,我们将返回一个合适的大小如下:
*
* y = (x & ~(MD_RESERVED_BYTES - 1)) - MD_RESERVED_BYTES y是64K内的偏移
*
* and place the 4kB superblock at offset y. 并且在偏移位置y处开始存放4KB的superblock
*/
#define MD_RESERVED_BYTES (64 * 1024) MD设备的保留字节数
#define MD_RESERVED_SECTORS (MD_RESERVED_BYTES / 512) MD设备的保留扇区数
#define MD_NEW_SIZE_SECTORS(x) ((x & ~(MD_RESERVED_SECTORS - 1)) - MD_RESERVED_SECTORS) MD设备实际包含的扇区数
#define MD_SB_BYTES 4096 MD设备superblock的字节大小
#define MD_SB_WORDS (MD_SB_BYTES / 4) MD设备superblock字大小
#define MD_SB_SECTORS (MD_SB_BYTES / 512) MD设备superblock包含的扇区数
/*
* The following are counted in 32-bit words
*/
#define MD_SB_GENERIC_OFFSET 0 //下面宏定义参考上面关于superblock中关于信息位置的注释
#define MD_SB_PERSONALITY_OFFSET 64
#define MD_SB_DISKS_OFFSET 128
#define MD_SB_DESCRIPTOR_OFFSET 992
#define MD_SB_GENERIC_CONSTANT_WORDS 32
#define MD_SB_GENERIC_STATE_WORDS 32
#define MD_SB_GENERIC_WORDS (MD_SB_GENERIC_CONSTANT_WORDS + MD_SB_GENERIC_STATE_WORDS)
#define MD_SB_PERSONALITY_WORDS 64
#define MD_SB_DESCRIPTOR_WORDS 32
#define MD_SB_DISKS 27
#define MD_SB_DISKS_WORDS (MD_SB_DISKS*MD_SB_DESCRIPTOR_WORDS)
#define MD_SB_RESERVED_WORDS (1024 - MD_SB_GENERIC_WORDS - MD_SB_PERSONALITY_WORDS - MD_SB_DISKS_WORDS - MD_SB_DESCRIPTOR_WORDS)
#define MD_SB_EQUAL_WORDS (MD_SB_GENERIC_WORDS + MD_SB_PERSONALITY_WORDS + MD_SB_DISKS_WORDS)
介绍几个宏定义:
#define MD_CHANGE_DEVS 0 /* Some device status has changed 设备状态已经改变 */
#define MD_CHANGE_CLEAN 1 /* transition to or from 'clean' 转换到clean状态或是从clean状态转换到其他状态*/
#define MD_CHANGE_PENDING 2 /* superblock update in progress superblock正在更新*/
此外,mdk_rdev_s->sb_loaded变量说明superblock是否加载到内存中,该变量有三种情况:
0:superblock不在内存中,不需要更新;
1:superblock在内存中,需要更新;
2:superblock在内存中,但不需要更新;
superblock在内存中的表现根据version不同分为两种:
1)version=0.90.0:
typedef struct mdp_superblock_s {
/*
* Constant generic information
*/
__u32 md_magic; /* 0 MD identifier */
__u32 major_version; /*