📄 raid.c
字号:
/*! raid.c dell硬盘检测入口*/#include <sys/ioctl.h>#include <sys/param.h>#include <sys/queue.h>#include <limits.h>#include <err.h>#include <fcntl.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include <ctype.h>#include "raid.h"#include <sys/stat.h>#include "Attr_API.h"struct locator { int channel; int target; int lun;};/* RAID IOCTL Operation Definition */struct raid_ioctl_operations { int (*raid_ioctl_init)(); int (*raid_ioctl_end)(); int (*raid_ioctl_sel_adapt)(unsigned char adapt_no); int (*raid_ioctl)(unsigned int cmd, char *addr); char raid_card_name[DEV_NAME_LEN];};/*获取raid状态的api, raid_ioctl_ops[0]用于sas perc5接口的硬盘 raid_ioctl_ops[1]用于scsi perc4硬盘*/static struct raid_ioctl_operations raid_ioctl_ops[] = { { .raid_ioctl_init = megasas_ioctl_init, .raid_ioctl_end = megasas_ioctl_end, .raid_ioctl_sel_adapt = megasas_ioctl_sel_adapt, .raid_ioctl = megasas_ioctl, "PERC5" }, { .raid_ioctl_init = megascsi_ioctl_init, .raid_ioctl_end = megascsi_ioctl_end, .raid_ioctl_sel_adapt = megascsi_ioctl_sel_adapt, .raid_ioctl = megascsi_ioctl, "PERCSCSI" }};//全局api 函数指针int (*raid_ioctl_init)();int (*raid_ioctl_end)();int (*raid_ioctl_sel_adapt)(unsigned char adapt_no);int (*raid_ioctl)(unsigned int cmd, char *addr);char raid_card_name[DEV_NAME_LEN];void mio_inq(char *);struct mio_locate bl;/* 功能:创建设备文件并获取设备raid信息 返回:卷数目*/int QueryRaidStatus(int *raidLevel, struct raid_ioctl_operations* poperation);/*功能:获取raid状态 参数:devnum 设备号,praidinfo存储探测结果 返回: 0 获取失败 其他 ,返回volume数量*/int GetRaidStatus(int devnum, int *raidLevel){ char sCommand[1024]={0}; int num=0; system("rm /dev/megadev0"); snprintf(sCommand, sizeof(sCommand),"mknod /dev/megadev0 c %d 0",devnum); system(sCommand); if((num=QueryRaidStatus(raidLevel, &raid_ioctl_ops[0]) )>0) return num; if((num=QueryRaidStatus(raidLevel, &raid_ioctl_ops[1]) )>0) return num; return 0;} int mio_inq_2(char *name, int *raidLevel);/* 功能:根据指定的api,获取接口信息 参数:praidinfo 保存探测的设备状态 poperation api指针集 返回:<=0获取状态失败 >0 获取的volume数目*/int QueryRaidStatus(int *raidLevel, struct raid_ioctl_operations* poperation){ int numv=0; raid_ioctl_init = poperation->raid_ioctl_init; raid_ioctl_end = poperation->raid_ioctl_end; raid_ioctl_sel_adapt = poperation->raid_ioctl_sel_adapt; raid_ioctl = poperation->raid_ioctl; strcpy(raid_card_name, poperation->raid_card_name); if (raid_ioctl_init()) { //printf("MEGA SAS IOCTL initialization failed\n"); return -1; } raid_ioctl_sel_adapt(0); numv=mio_inq_2(raid_card_name, raidLevel); raid_ioctl_end(); return numv;}/* 功能:DELL硬盘检测入口函数,该函数完成检测功能 */int ReadDellRaidInfo(){ FILE* fp=NULL; char cCommand[1024]={0}; char devinfo[300]={0}; int raidLevel = -1; int retflag=0; snprintf(cCommand,sizeof(cCommand),"cat /proc/devices |grep mega"); fp=popen(cCommand,"r"); if(NULL==fp) { //printf("there's no mega device\n"); return raidLevel; } while(!feof(fp)) { int len=0; int devno=0; memset(devinfo,0,sizeof(devinfo)); fgets(devinfo,sizeof(devinfo),fp); devinfo[sizeof(devinfo)-1]='\0'; //printf("%s\n",devinfo); len=strlen(devinfo); if(0==len) { //printf("this line is empty\n"); //fprintf(g_outfd,"this line is empty\n"); continue; } devinfo[len-1]='\0'; //printf("Dell_Raid_Chek:%s\n",devinfo); //fprintf(g_outfd,"Dell_Raid_Chek:%s\n",devinfo); devno=atoi(devinfo); retflag=GetRaidStatus(devno, &raidLevel); if(retflag<=0) { continue; } else { break; } //printf("vnum:%d\n",tmpraiddeisinfo._volumenum); //fprintf(g_outfd,"vnum:%d\n",tmpraiddeisinfo._volumenum); } pclose(fp); return raidLevel;}/* 功能:获取raid状态,结果保存在praidinfo中 参数: name 接口名 */int mio_inq_2(char *name, int *raidLevel){ int rv, i; struct mioc_inq bi; struct mioc_vol bv; (void)name; memset(&bi, 0, sizeof(bi)); bi.bi_cookie = bl.bl_cookie; rv = raid_ioctl(MIOC_INQ, (char *)&bi); if (rv == -1) { warn("MIOC_INQ"); return -1; } for (i = 0; i < bi.bi_novol; i++) { memset(&bv, 0, sizeof(bv)); bv.bv_cookie = bl.bl_cookie; bv.bv_volid = i; rv = raid_ioctl(MIOC_VOL, (char *)&bv); if (rv == -1) { warn("MIOC_VOL"); return -1; } /* if (name && strcmp(name, bv.bv_dev) != 0) { continue; }*/ if ((bv.bv_level == -1) && (bv.bv_nodisk == 1)) { continue; } else if ((bv.bv_level == -2) && (bv.bv_nodisk == 1)) { continue; } else { *raidLevel = bv.bv_level; //printf("the raid level is RAID%u\n", *raidLevel); } } return bi.bi_novol;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -