diff options
Diffstat (limited to 'sys/dev/hptmv/hptproc.c')
| -rw-r--r-- | sys/dev/hptmv/hptproc.c | 73 |
1 files changed, 47 insertions, 26 deletions
diff --git a/sys/dev/hptmv/hptproc.c b/sys/dev/hptmv/hptproc.c index 1141edc06c63..7971e73040b2 100644 --- a/sys/dev/hptmv/hptproc.c +++ b/sys/dev/hptmv/hptproc.c @@ -65,8 +65,8 @@ hpt_set_asc_info(IAL_ADAPTER_T *pAdapter, char *buffer,int length) PVDevice pSubArray, pVDev; UINT i, iarray, ichan; struct cam_periph *periph = NULL; - intrmask_t oldspl; + mtx_lock(&pAdapter->lock); #ifdef SUPPORT_ARRAY if (length>=8 && strncmp(buffer, "rebuild ", 8)==0) { @@ -74,7 +74,6 @@ hpt_set_asc_info(IAL_ADAPTER_T *pAdapter, char *buffer,int length) length-=8; if (length>=5 && strncmp(buffer, "start", 5)==0) { - oldspl = lock_driver(); for(i = 0; i < MAX_ARRAY_PER_VBUS; i++) if ((pArray=ArrayTables(i))->u.array.dArStamp==0) continue; @@ -83,12 +82,11 @@ hpt_set_asc_info(IAL_ADAPTER_T *pAdapter, char *buffer,int length) hpt_queue_dpc((HPT_DPC)hpt_rebuild_data_block, pAdapter, pArray, (UCHAR)((pArray->u.array.CriticalMembers || pArray->VDeviceType == VD_RAID_1)? DUPLICATE : REBUILD_PARITY)); } - unlock_driver(oldspl); + mtx_unlock(&pAdapter->lock); return orig_length; } else if (length>=4 && strncmp(buffer, "stop", 4)==0) { - oldspl = lock_driver(); for(i = 0; i < MAX_ARRAY_PER_VBUS; i++) if ((pArray=ArrayTables(i))->u.array.dArStamp==0) continue; @@ -96,7 +94,7 @@ hpt_set_asc_info(IAL_ADAPTER_T *pAdapter, char *buffer,int length) if (pArray->u.array.rf_rebuilding) pArray->u.array.rf_abort_rebuild = 1; } - unlock_driver(oldspl); + mtx_unlock(&pAdapter->lock); return orig_length; } else if (length>=3 && buffer[1]==','&& buffer[0]>='1'&& buffer[2]>='1') @@ -107,17 +105,24 @@ hpt_set_asc_info(IAL_ADAPTER_T *pAdapter, char *buffer,int length) if(iarray >= MAX_VDEVICE_PER_VBUS || ichan >= MV_SATA_CHANNELS_NUM) return -EINVAL; pArray = _vbus_p->pVDevice[iarray]; - if (!pArray || (pArray->vf_online == 0)) return -EINVAL; + if (!pArray || (pArray->vf_online == 0)) { + mtx_unlock(&pAdapter->lock); + return -EINVAL; + } for (i=0;i<MV_SATA_CHANNELS_NUM;i++) if(i == ichan) goto rebuild; + mtx_unlock(&pAdapter->lock); return -EINVAL; rebuild: pVDev = &pAdapter->VDevices[ichan]; - if(!pVDev->u.disk.df_on_line || pVDev->pParent) return -EINVAL; + if(!pVDev->u.disk.df_on_line || pVDev->pParent) { + mtx_unlock(&pAdapter->lock); + return -EINVAL; + } /* Not allow to use a mounted disk ??? test*/ for(i = 0; i < MAX_VDEVICE_PER_VBUS; i++) @@ -127,6 +132,7 @@ rebuild: if (periph != NULL && periph->refcount >= 1) { hpt_printk(("Can not use disk used by OS!\n")); + mtx_unlock(&pAdapter->lock); return -EINVAL; } /* the Mounted Disk isn't delete */ @@ -139,15 +145,13 @@ rebuild: { pSubArray = pArray; loop: - oldspl = lock_driver(); if(hpt_add_disk_to_array(_VBUS_P VDEV_TO_ID(pSubArray), VDEV_TO_ID(pVDev)) == -1) { - unlock_driver(oldspl); + mtx_unlock(&pAdapter->lock); return -EINVAL; } pSubArray->u.array.rf_auto_rebuild = 0; pSubArray->u.array.rf_abort_rebuild = 0; hpt_queue_dpc((HPT_DPC)hpt_rebuild_data_block, pAdapter, pSubArray, DUPLICATE); - unlock_driver(oldspl); break; } case VD_RAID_0: @@ -159,8 +163,10 @@ loop: goto loop; } default: + mtx_unlock(&pAdapter->lock); return -EINVAL; } + mtx_unlock(&pAdapter->lock); return orig_length; } } @@ -175,24 +181,31 @@ loop: if (length>=1 && *buffer>='1') { iarray = *buffer-'1'; - if(iarray >= MAX_VDEVICE_PER_VBUS) return -EINVAL; + if(iarray >= MAX_VDEVICE_PER_VBUS) { + mtx_unlock(&pAdapter->lock); + return -EINVAL; + } pArray = _vbus_p->pVDevice[iarray]; - if (!pArray || (pArray->vf_online == 0)) return -EINVAL; + if (!pArray || (pArray->vf_online == 0)) { + mtx_unlock(&pAdapter->lock); + return -EINVAL; + } - if(pArray->VDeviceType != VD_RAID_1 && pArray->VDeviceType != VD_RAID_5) + if(pArray->VDeviceType != VD_RAID_1 && pArray->VDeviceType != VD_RAID_5) { + mtx_unlock(&pAdapter->lock); return -EINVAL; + } if (!(pArray->u.array.rf_need_rebuild || pArray->u.array.rf_rebuilding || pArray->u.array.rf_verifying || pArray->u.array.rf_initializing)) { - oldspl = lock_driver(); pArray->u.array.RebuildSectors = 0; hpt_queue_dpc((HPT_DPC)hpt_rebuild_data_block, pAdapter, pArray, VERIFY); - unlock_driver(oldspl); } + mtx_unlock(&pAdapter->lock); return orig_length; } } @@ -203,16 +216,21 @@ loop: if (length>=1 && *buffer>='1') { iarray = *buffer-'1'; - if(iarray >= MAX_VDEVICE_PER_VBUS) return -EINVAL; + if(iarray >= MAX_VDEVICE_PER_VBUS) { + mtx_unlock(&pAdapter->lock); + return -EINVAL; + } pArray = _vbus_p->pVDevice[iarray]; - if (!pArray || (pArray->vf_online == 0)) return -EINVAL; + if (!pArray || (pArray->vf_online == 0)) { + mtx_unlock(&pAdapter->lock); + return -EINVAL; + } if(pArray->u.array.rf_verifying) { - oldspl = lock_driver(); pArray->u.array.rf_abort_rebuild = 1; - unlock_driver(oldspl); } + mtx_unlock(&pAdapter->lock); return orig_length; } } @@ -226,6 +244,7 @@ loop: _vbus_(r5.enable_write_back) = *buffer-'0'; if (_vbus_(r5.enable_write_back)) hpt_printk(("RAID5 write back enabled")); + mtx_unlock(&pAdapter->lock); return orig_length; } } @@ -239,6 +258,7 @@ loop: length-=9; if (length>=1 && *buffer>='0' && *buffer<='3') { hpt_dbg_level = *buffer-'0'; + mtx_unlock(&pAdapter->lock); return orig_length; } } @@ -246,6 +266,7 @@ loop: /* TO DO */ } #endif + mtx_unlock(&pAdapter->lock); return -EINVAL; } @@ -486,12 +507,12 @@ hpt_get_info(IAL_ADAPTER_T *pAdapter, HPT_GET_INFO *pinfo) PVDevice pVDev; #ifndef FOR_DEMO + mtx_lock(&pAdapter->lock); if (pAdapter->beeping) { - intrmask_t oldspl = lock_driver(); pAdapter->beeping = 0; BeepOff(pAdapter->mvSataAdapter.adapterIoBaseAddress); - unlock_driver(oldspl); } + mtx_unlock(&pAdapter->lock); #endif hpt_copy_info(pinfo, "Controller #%d:\n\n", pAdapter->mvSataAdapter.adapterId); @@ -610,16 +631,16 @@ out: #define xhptregister_node(name) hptregister_node(name) -#if (__FreeBSD_version < 500043) +#if __FreeBSD_version >= 1100024 #define hptregister_node(name) \ - SYSCTL_NODE(, OID_AUTO, name, CTLFLAG_RW, 0, "Get/Set " #name " state root node") \ + SYSCTL_ROOT_NODE(OID_AUTO, name, CTLFLAG_RW, 0, "Get/Set " #name " state root node"); \ SYSCTL_OID(_ ## name, OID_AUTO, status, CTLTYPE_STRING|CTLFLAG_RW, \ NULL, 0, hpt_status, "A", "Get/Set " #name " state") -#else +#else #define hptregister_node(name) \ - SYSCTL_ROOT_NODE(OID_AUTO, name, CTLFLAG_RW, 0, "Get/Set " #name " state root node"); \ + SYSCTL_NODE(, OID_AUTO, name, CTLFLAG_RW, 0, "Get/Set " #name " state root node"); \ SYSCTL_OID(_ ## name, OID_AUTO, status, CTLTYPE_STRING|CTLFLAG_RW, \ - NULL, 0, hpt_status, "A", "Get/Set " #name " state"); + NULL, 0, hpt_status, "A", "Get/Set " #name " state") #endif xhptregister_node(PROC_DIR_NAME); |
