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

📄 gdth_proc.c

📁 Linux内核源代码 为压缩文件 是<<Linux内核>>一书中的源代码
💻 C
📖 第 1 页 / 共 3 页
字号:
		size = sprintf(buffer+len, "\n --\n");		len += size;  pos = begin + len;	    }	            if (pos < offset) {                len = 0;                begin = pos;            }            if (pos > offset + length)                goto stop_output;            /* 4. about array drives */            size = sprintf(buffer+len,"\nArray Drives:");            len += size;  pos = begin + len;	    flag = FALSE;            if (!gdth_ioctl_alloc(hanum, GDTH_SCRATCH))                goto stop_output;            for (i = 0; i < MAX_HDRIVES; ++i) {                if (!(ha->hdr[i].is_arraydrv && ha->hdr[i].is_master))                    continue;                /* 4.a array drive info */                TRACE2(("array_info() drive no %d\n",i));                pai = (gdth_arrayinf_str *)ha->pscratch;                gdtcmd.BoardNode = LOCALBOARD;                gdtcmd.Service = CACHESERVICE;                gdtcmd.OpCode = GDT_IOCTL;                gdtcmd.u.ioctl.p_param = virt_to_bus(pai);                gdtcmd.u.ioctl.param_size = sizeof(gdth_arrayinf_str);                gdtcmd.u.ioctl.subfunc = ARRAY_INFO | LA_CTRL_PATTERN;                gdtcmd.u.ioctl.channel = i;                gdth_do_cmd(scp, &gdtcmd, 30);                if (scp->SCp.Message == S_OK) {                    if (pai->ai_state == 0)                        strcpy(hrec, "idle");                    else if (pai->ai_state == 2)                        strcpy(hrec, "build");                    else if (pai->ai_state == 4)                        strcpy(hrec, "ready");                    else if (pai->ai_state == 6)                        strcpy(hrec, "fail");                    else if (pai->ai_state == 8 || pai->ai_state == 10)                        strcpy(hrec, "rebuild");                    else                        strcpy(hrec, "error");                    if (pai->ai_ext_state & 0x10)                        strcat(hrec, "/expand");                    else if (pai->ai_ext_state & 0x1)                        strcat(hrec, "/patch");                    size = sprintf(buffer+len,                                   "\n Number:       \t%-2d        \tStatus:        \t%s\n",                                   i,hrec);                    len += size;  pos = begin + len;                    flag = TRUE;                    if (pai->ai_type == 0)                        strcpy(hrec, "RAID-0");                    else if (pai->ai_type == 4)                        strcpy(hrec, "RAID-4");                    else if (pai->ai_type == 5)                        strcpy(hrec, "RAID-5");                    else                         strcpy(hrec, "RAID-10");                    size = sprintf(buffer+len,                                   " Capacity [MB]:\t%-6d    \tType:          \t%s\n",                                   pai->ai_size/(1024*1024/pai->ai_secsize),                                   hrec);                    len += size;  pos = begin + len;                }            }            gdth_ioctl_free(hanum);        	    if (!flag) {		size = sprintf(buffer+len, "\n --\n");		len += size;  pos = begin + len;	    }            if (pos < offset) {                len = 0;                begin = pos;            }            if (pos > offset + length)                goto stop_output;            /* 5. about host drives */            size = sprintf(buffer+len,"\nHost Drives:");            len += size;  pos = begin + len;	    flag = FALSE;            if (!gdth_ioctl_alloc(hanum, GDTH_SCRATCH))                goto stop_output;            for (i = 0; i < MAX_HDRIVES; ++i) {                if (!ha->hdr[i].is_logdrv ||                     (ha->hdr[i].is_arraydrv && !ha->hdr[i].is_master))                    continue;                /* 5.a get host drive list */                TRACE2(("host_get() drv_no %d\n",i));                           phg = (gdth_hget_str *)ha->pscratch;                gdtcmd.BoardNode = LOCALBOARD;                gdtcmd.Service = CACHESERVICE;                gdtcmd.OpCode = GDT_IOCTL;                gdtcmd.u.ioctl.p_param = virt_to_bus(phg);                gdtcmd.u.ioctl.param_size = sizeof(gdth_hget_str);                gdtcmd.u.ioctl.subfunc = HOST_GET | LA_CTRL_PATTERN;                gdtcmd.u.ioctl.channel = i;                phg->entries = MAX_HDRIVES;                phg->offset = GDTOFFSOF(gdth_hget_str, entry[0]);                 gdth_do_cmd(scp, &gdtcmd, 30);                if (scp->SCp.Message != S_OK) {                    ha->hdr[i].ldr_no = i;                    ha->hdr[i].rw_attribs = 0;                    ha->hdr[i].start_sec = 0;                } else {                    for (j = 0; j < phg->entries; ++j) {                        k = phg->entry[j].host_drive;                        if (k >= MAX_HDRIVES)                            continue;                        ha->hdr[k].ldr_no = phg->entry[j].log_drive;                        ha->hdr[k].rw_attribs = phg->entry[j].rw_attribs;                        ha->hdr[k].start_sec = phg->entry[j].start_sec;                    }                }                TRACE2(("host_get entries %d status %d\n",                        phg->entries, scp->SCp.Message));            }            gdth_ioctl_free(hanum);            for (i = 0; i < MAX_HDRIVES; ++i) {                if (!(ha->hdr[i].present))                    continue;                                size = sprintf(buffer+len,                               "\n Number:       \t%-2d        \tArr/Log. Drive:\t%d\n",                               i, ha->hdr[i].ldr_no);                len += size;  pos = begin + len;		flag = TRUE;                size = sprintf(buffer+len,                               " Capacity [MB]:\t%-6d    \tStart Sector:  \t%d\n",                               ha->hdr[i].size/2048, ha->hdr[i].start_sec);                len += size;  pos = begin + len;            }        	    if (!flag) {		size = sprintf(buffer+len, "\n --\n");		len += size;  pos = begin + len;	    }            if (pos < offset) {                len = 0;                begin = pos;            }            if (pos > offset + length)                goto stop_output;        }        /* controller events */        size = sprintf(buffer+len,"\nController Events:\n");        len += size;  pos = begin + len;        for (id = -1;;) {            id = gdth_read_event(ha, id, &estr);            if (estr.event_source == 0)                break;            if (estr.event_data.eu.driver.ionode == hanum &&                estr.event_source == ES_ASYNC) {                 gdth_log_event(&estr.event_data, hrec);                do_gettimeofday(&tv);                sec = (int)(tv.tv_sec - estr.first_stamp);		if (sec < 0) sec = 0;                size = sprintf(buffer+len," date- %02d:%02d:%02d\t%s\n",                               sec/3600, sec%3600/60, sec%60, hrec);                len += size;  pos = begin + len;                if (pos < offset) {                    len = 0;                    begin = pos;                }                if (pos > offset + length)                    goto stop_output;            }            if (id == -1)                break;        }    } else {        /* request from tool (GDTMON,..) */        piord = (gdth_iord_str *)ha->pscratch;        if (piord == NULL)            goto stop_output;        length = piord->size;        memcpy(buffer+len, (char *)piord, length);        gdth_ioctl_free(hanum);        len += length; pos = begin + len;        if (pos < offset) {            len = 0;            begin = pos;        }        if (pos > offset + length)            goto stop_output;    }stop_output:    scsi_release_command(scp);    scsi_free_host_dev(sdev);    *start = buffer +(offset-begin);    len -= (offset-begin);    if (len > length)        len = length;    TRACE2(("get_info() len %d pos %d begin %d offset %d length %d size %d\n",            len,(int)pos,(int)begin,(int)offset,length,size));    return(len);}static void gdth_do_cmd(Scsi_Cmnd *scp,gdth_cmd_str *gdtcmd,int timeout){    char cmnd[MAX_COMMAND_SIZE];    DECLARE_MUTEX_LOCKED(sem);    TRACE2(("gdth_do_cmd()\n"));    memset(cmnd, 0, MAX_COMMAND_SIZE);    scp->request.rq_status = RQ_SCSI_BUSY;    scp->request.sem = &sem;    scp->SCp.this_residual = IOCTL_PRI;    scsi_do_cmd(scp, cmnd, gdtcmd, sizeof(gdth_cmd_str),                 gdth_scsi_done, timeout*HZ, 1);    down(&sem);}void gdth_scsi_done(Scsi_Cmnd *scp){    TRACE2(("gdth_scsi_done()\n"));    scp->request.rq_status = RQ_SCSI_DONE;    if (scp->request.sem != NULL)        up(scp->request.sem);}static int gdth_ioctl_alloc(int hanum, ushort size){    gdth_ha_str *ha;    ulong flags;    int ret_val;    if (size == 0 || size > GDTH_SCRATCH)        return FALSE;    ha = HADATA(gdth_ctr_tab[hanum]);    GDTH_LOCK_HA(ha, flags);    if (!ha->scratch_busy) {        ha->scratch_busy = TRUE;        ret_val = TRUE;    } else        ret_val = FALSE;    GDTH_UNLOCK_HA(ha, flags);    return ret_val;}static void gdth_ioctl_free(int hanum){    gdth_ha_str *ha;    ulong flags;    ha = HADATA(gdth_ctr_tab[hanum]);    GDTH_LOCK_HA(ha, flags);    ha->scratch_busy = FALSE;    GDTH_UNLOCK_HA(ha, flags);}static void gdth_wait_completion(int hanum, int busnum, int id){    gdth_ha_str *ha;    ulong flags;    int i;    Scsi_Cmnd *scp;    ha = HADATA(gdth_ctr_tab[hanum]);    GDTH_LOCK_HA(ha, flags);    for (i = 0; i < GDTH_MAXCMDS; ++i) {        scp = ha->cmd_tab[i].cmnd;        if (!SPECIAL_SCP(scp) && scp->target == (unchar)id &&            scp->channel == (unchar)busnum)        {            scp->SCp.have_data_in = 0;            GDTH_UNLOCK_HA(ha, flags);            while (!scp->SCp.have_data_in)                barrier();            GDTH_LOCK_SCSI_DONE(flags);            scp->scsi_done(scp);            GDTH_UNLOCK_SCSI_DONE(flags);        GDTH_LOCK_HA(ha, flags);        }    }    GDTH_UNLOCK_HA(ha, flags);}static void gdth_stop_timeout(int hanum, int busnum, int id){    gdth_ha_str *ha;    ulong flags;    Scsi_Cmnd *scp;    ha = HADATA(gdth_ctr_tab[hanum]);    GDTH_LOCK_HA(ha, flags);    for (scp = ha->req_first; scp; scp = (Scsi_Cmnd *)scp->SCp.ptr) {        if (scp->target == (unchar)id &&            scp->channel == (unchar)busnum)        {            TRACE2(("gdth_stop_timeout(): update_timeout()\n"));            scp->SCp.buffers_residual = gdth_update_timeout(hanum, scp, 0);        }    }    GDTH_UNLOCK_HA(ha, flags);}static void gdth_start_timeout(int hanum, int busnum, int id){    gdth_ha_str *ha;    ulong flags;    Scsi_Cmnd *scp;    ha = HADATA(gdth_ctr_tab[hanum]);    GDTH_LOCK_HA(ha, flags);    for (scp = ha->req_first; scp; scp = (Scsi_Cmnd *)scp->SCp.ptr) {        if (scp->target == (unchar)id &&            scp->channel == (unchar)busnum)        {            TRACE2(("gdth_start_timeout(): update_timeout()\n"));            gdth_update_timeout(hanum, scp, scp->SCp.buffers_residual);        }    }    GDTH_UNLOCK_HA(ha, flags);}static int gdth_update_timeout(int hanum, Scsi_Cmnd *scp, int timeout){    int oldto;    oldto = scp->timeout_per_command;    scp->timeout_per_command = timeout;    if (timeout == 0) {        del_timer(&scp->eh_timeout);        scp->eh_timeout.data = (unsigned long) NULL;        scp->eh_timeout.expires = 0;    } else {        if (scp->eh_timeout.data != (unsigned long) NULL)             del_timer(&scp->eh_timeout);        scp->eh_timeout.data = (unsigned long) scp;        scp->eh_timeout.expires = jiffies + timeout;        add_timer(&scp->eh_timeout);    }    return oldto;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -