📄 gdth_proc.c
字号:
len = 0; begin = pos; } if (pos > offset + length) goto stop_output; } } gdth_ioctl_free(hanum, buf); if (!flag) { size = sprintf(buffer+len, "\n --\n"); len += size; pos = begin + len; } /* 5. about host drives */ size = sprintf(buffer+len,"\nHost Drives:"); len += size; pos = begin + len; flag = FALSE; buf = gdth_ioctl_alloc(hanum, GDTH_SCRATCH, FALSE); if (!buf) goto stop_output; for (i = 0; i < MAX_LDRIVES; ++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 *)buf; 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]); #if LINUX_VERSION_CODE >= 0x020322 gdth_do_cmd(scp, &gdtcmd, cmnd, 30); if (scp->SCp.Status != S_OK) #else gdth_do_cmd(&scp, &gdtcmd, cmnd, 30); if (scp.SCp.Status != S_OK) #endif { 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_LDRIVES) 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; } } } gdth_ioctl_free(hanum, buf); 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 (pos < offset) { len = 0; begin = pos; } if (pos > offset + length) goto stop_output; } if (!flag) { size = sprintf(buffer+len, "\n --\n"); len += size; pos = begin + len; } } /* 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, ha->pscratch); len = length; }stop_output:#if LINUX_VERSION_CODE >= 0x020322 scsi_release_command(scp); scsi_free_host_dev(sdev);#endif *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, char *cmnd, int timeout){ unsigned bufflen;#if LINUX_VERSION_CODE >= 0x020407 DECLARE_COMPLETION(wait);#elif LINUX_VERSION_CODE >= 0x020322 DECLARE_MUTEX_LOCKED(sem);#else struct semaphore sem = MUTEX_LOCKED;#endif TRACE2(("gdth_do_cmd()\n")); if (gdtcmd != NULL) { scp->SCp.this_residual = IOCTL_PRI; bufflen = sizeof(gdth_cmd_str); } else { scp->SCp.this_residual = DEFAULT_PRI; bufflen = 0; } scp->request.rq_status = RQ_SCSI_BUSY;#if LINUX_VERSION_CODE >= 0x020407 scp->request.waiting = &wait; scsi_do_cmd(scp, cmnd, gdtcmd, bufflen, gdth_scsi_done, timeout*HZ, 1); wait_for_completion(&wait);#else scp->request.sem = &sem;#if LINUX_VERSION_CODE >= 0x020322 scsi_do_cmd(scp, cmnd, gdtcmd, bufflen, gdth_scsi_done, timeout*HZ, 1);#else GDTH_LOCK_SCSI_DOCMD(); scsi_do_cmd(scp, cmnd, gdtcmd, bufflen, gdth_scsi_done, timeout*HZ, 1); GDTH_UNLOCK_SCSI_DOCMD();#endif down(&sem);#endif}void gdth_scsi_done(Scsi_Cmnd *scp){ TRACE2(("gdth_scsi_done()\n")); scp->request.rq_status = RQ_SCSI_DONE;#if LINUX_VERSION_CODE >= 0x020407 if (scp->request.waiting != NULL) complete(scp->request.waiting);#else if (scp->request.sem != NULL) up(scp->request.sem);#endif}static char *gdth_ioctl_alloc(int hanum, ushort size, int scratch){ gdth_ha_str *ha; ulong flags; char *ret_val; if (size == 0 || size > GDTH_SCRATCH) return FALSE; ha = HADATA(gdth_ctr_tab[hanum]); GDTH_LOCK_HA(ha, flags); if (scratch) { if (!ha->scratch_busy) { ha->scratch_busy = TRUE; ret_val = ha->pscratch; } else ret_val = NULL; } else {#if LINUX_VERSION_CODE >= 0x020322 ret_val = (void *) __get_free_pages(GFP_ATOMIC | GFP_DMA, GDTH_SCRATCH_ORD);#else ret_val = scsi_init_malloc(GDTH_SCRATCH, GFP_ATOMIC | GFP_DMA);#endif } GDTH_UNLOCK_HA(ha, flags); return ret_val;}static void gdth_ioctl_free(int hanum, char *buf){ gdth_ha_str *ha; ulong flags; ha = HADATA(gdth_ctr_tab[hanum]); GDTH_LOCK_HA(ha, flags); if (buf == ha->pscratch) { ha->scratch_busy = FALSE; } else {#if LINUX_VERSION_CODE >= 0x020322 free_pages((unsigned long)buf, GDTH_SCRATCH_ORD);#else scsi_init_free((void *)buf, GDTH_SCRATCH);#endif } GDTH_UNLOCK_HA(ha, flags);}static int gdth_ioctl_check_bin(int hanum, ushort size){ gdth_ha_str *ha; ulong flags; int ret_val; ha = HADATA(gdth_ctr_tab[hanum]); GDTH_LOCK_HA(ha, flags); ret_val = FALSE; if (ha->scratch_busy) { if (((gdth_iord_str *)ha->pscratch)->size == (ulong32)size) ret_val = TRUE; } GDTH_UNLOCK_HA(ha, flags); return ret_val;}static void gdth_wait_completion(int hanum, int busnum, int id){ gdth_ha_str *ha; ulong flags; int i; Scsi_Cmnd *scp; unchar b; ha = HADATA(gdth_ctr_tab[hanum]); GDTH_LOCK_HA(ha, flags); for (i = 0; i < GDTH_MAXCMDS; ++i) { scp = ha->cmd_tab[i].cmnd; b = virt_ctr ? NUMDATA(scp->host)->busnum : scp->channel; if (!SPECIAL_SCP(scp) && scp->target == (unchar)id && b == (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; unchar b; ha = HADATA(gdth_ctr_tab[hanum]); GDTH_LOCK_HA(ha, flags); for (scp = ha->req_first; scp; scp = (Scsi_Cmnd *)scp->SCp.ptr) { b = virt_ctr ? NUMDATA(scp->host)->busnum : scp->channel; if (scp->target == (unchar)id && b == (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; unchar b; ha = HADATA(gdth_ctr_tab[hanum]); GDTH_LOCK_HA(ha, flags); for (scp = ha->req_first; scp; scp = (Scsi_Cmnd *)scp->SCp.ptr) { b = virt_ctr ? NUMDATA(scp->host)->busnum : scp->channel; if (scp->target == (unchar)id && b == (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 LINUX_VERSION_CODE >= 0x02014B 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); }#else if (timeout > 0) { if (timer_table[SCSI_TIMER].expires == 0) { timer_table[SCSI_TIMER].expires = jiffies + timeout; timer_active |= 1 << SCSI_TIMER; } else { if (jiffies + timeout < timer_table[SCSI_TIMER].expires) timer_table[SCSI_TIMER].expires = jiffies + timeout; } }#endif return oldto;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -