📄 md_k.h.txt
字号:
any questions,send email to netxiong@263.net
相关文件
/linux/raid/所有头文件
/drivers/md/md.c
************************基本定义******************************
(1)#define MAX_MD_DEVS (1<<MINORBITS) //MINORBITS是8,所以最多有16个MD设备
**************************************************************
**********************磁盘阵列的数据结构**********************
(1)struct mddev_s{ //这个结构是磁盘阵列的描述副
void *private; /* 专有信息 */
mdk_personality_t *pers; /* personality */
int __minor; /* 从设备号 */
mdp_super_t *sb; /* 超级块指针 */
int nb_dev; /* 磁盘数 */
struct md_list_head disks; /* 磁盘列表 链接rdev结构*/
int sb_dirty; /* 超级块更新标志 */
mdu_param_t param; /* 参数 */
int ro; /* 只读标志 */
unsigned int curr_resync; /* 重构比例 */
unsigned long resync_start;
char *name; /* 阵列名 */
int recovery_running;/* 重构正在进行标志 */
struct semaphore reconfig_sem; /* 重配置信号量 */
struct semaphore recovery_sem; /* 重构信号量 */
struct semaphore resync_sem; /* 同步信号量 */
struct md_list_head all_mddevs; /* 所有阵列列表 */
}
(2)struct mdk_rdev_s{ //这个数据结构代表一个磁盘设备或者一个磁盘分区
struct md_list_head same_set; /* 通过这个链表链接到mddev中的disks*/
struct md_list_head all; /* 链接到all_raid_disk中 */
struct md_list_head pending; /* 链接到pending_raid_disk中*/
kdev_t dev; /* 设备号 */
kdev_t old_dev; /* "" when it was last imported */
int size; /* 设备大小(以块为单位 */
mddev_t *mddev; /* 指向这个磁盘设备所在的阵列 */
unsigned long last_events; /* IO事件时间戳 */
struct inode *inode; /* i节点指针 */
struct file filp; /* 文件结构 */
mdp_super_t *sb; /* 这个磁盘设备的超级块指针 */
int sb_offset; /* 超级块偏移量 */
int faulty; /* 坏盘标志 */
int desc_nr; /* 超级块中的标示符索引 */
}
***************************************************************
/********************基本数据结构*****************************/
(1)这是内核态守护线程的基本数据结构。
typedef struct mdk_thread_s {
void (*run) (void *data);//实际的运行函数
void *data;
md_wait_queue_head_t wqueue;
unsigned long flags;
struct semaphore *sem;
struct task_struct *tsk;
const char *name;
} mdk_thread_t;
/*************************************************************/
**************************设备号的转换*******************************
这个结构的主要作用是讲kdev号转变成mddev,也就是相应的md设备。
typedef struct dev_mapping_s {
mddev_t *mddev; //相应的设备的指针
void *data; //自定义使用方法
} dev_mapping_t;
extern dev_mapping_t mddev_map [MAX_MD_DEVS];//定义在md.c中
extern inline mddev_t * kdev_to_mddev (kdev_t dev)
return mddev_map[MINOR(dev)].mddev;//从设备号召到相应的md设备
*********************************************************************
************************常用的宏**************************************
(1)#define ITERATE_RDEV_ALL(rdev,tmp) //遍历all_raid_disks中的盘。
ITERATE_RDEV_GENERIC(all_raid_disks,all,rdev,tmp)
(2)#define ITERATE_RDEV_PENDING(rdev,tmp)//遍历pending_raid_disks中的盘
ITERATE_RDEV_GENERIC(pending_raid_disks,pending,rdev,tmp)
(3)#define ITERATE_MDDEV(mddev,tmp) //遍历所有系统中的阵列资料
for (tmp = all_mddevs.next;
mddev = md_list_entry(tmp, mddev_t, all_mddevs),
tmp = tmp->next, tmp->prev != &all_mddevs
; )
(4)#define ITERATE_RDEV(mddev,rdev,tmp) //遍历磁盘阵列中的disk所连接的所有盘
ITERATE_RDEV_GENERIC((mddev)->disks,same_set,rdev,tmp)
**********************************************************************
********************加锁等待队列的定义*********************************
以下的这个加锁等待宏提供了一种申请临界资源等的等待方法。
特别注意:在使用这个宏是的时候,一定要保证lock处于加锁状态
#define wait_event_lock_irq(wq, condition, lock) \
do { \
if (condition) //如果符合条件,推出
break; \
__wait_event_lock_irq(wq, condition, lock); \
} while (0)
#define __wait_event_lock_irq(wq, condition, lock) \
do { \
wait_queue_t __wait; \
init_waitqueue_entry(&__wait, current); \
\
add_wait_queue(&wq, &__wait); \
for (;;) { \
set_current_state(TASK_UNINTERRUPTIBLE); \
if (condition) \
break; \
spin_unlock_irq(&lock); //解锁,在这个进程退出之前一定要解锁
run_task_queue(&tq_disk);//调用磁盘调度程序进行实际读写
schedule(); \
spin_lock_irq(&lock);//重新获得运行权,加锁
} \
current->state = TASK_RUNNING; \
remove_wait_queue(&wq, &__wait); \
} while (0)
***********************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -