📄 gdth_proc.c
字号:
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 + -