⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 md_k.h.txt

📁 Linux下开发的心得笔记 包括加锁的问题、内核编程的一些注意事项、内核程序风格的注意事项、为操作函数集等和一些源码。
💻 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 + -