WinVerbs and WinMad don't handle IRP_MJ_CLEANUP and IRP_MJ_CLOSE properly.  
This patch pulls in a bug fix Sean applied in anger to the trunk.

Also minor code style tweaks to keep the code consistent.

Signed-off-by: Fab Tillier <[email protected]>

diff -dwup3 -x *svn* -x *makefile.inc -x *sources -r 
c:\dev\openib\ofw\gen1\branches\mlx4_30\trunk\core\winmad\kernel\wm_driver.c 
.\core\winmad\kernel\wm_driver.c
--- 
c:\dev\openib\ofw\gen1\branches\mlx4_30\trunk\core\winmad\kernel\wm_driver.c    
    Thu Mar 29 00:15:17 2012
+++ .\core\winmad\kernel\wm_driver.c    Thu Jul 26 16:48:04 2012
@@ -178,12 +178,24 @@ static VOID WmFileCreate(WDFDEVICE Devic
 
 static VOID WmFileCleanup(WDFFILEOBJECT FileObject)
 {
+       LIST_ENTRY *entry;
        WM_PROVIDER *prov = WmProviderGetContext(FileObject);
+       WM_PROVIDER *prov_entry;
 
        KeAcquireGuardedMutex(&Lock);
+       for (entry = ProvList.Flink; entry != &ProvList; entry = entry->Flink) {
+               prov_entry = CONTAINING_RECORD(entry, WM_PROVIDER, Entry);
+               if (prov == prov_entry) {
        RemoveEntryList(&prov->Entry);
+                       goto found;
+               }
+       }
+       prov = NULL;
+found:
        KeReleaseGuardedMutex(&Lock);
+       if (prov) {
        WmProviderCleanup(prov);
+       }
 }
 
 static VOID WmFileClose(WDFFILEOBJECT FileObject)
@@ -350,9 +362,7 @@ static NTSTATUS WmPowerD0Entry(WDFDEVICE
        }
        if (!NT_SUCCESS(status)) {
                goto exit;
-       }
-       else
-       {
+       } else {
                if( VerbsVersion(VERBS_MAJOR_VER, VERBS_MINOR_VER) != 
dev->VerbsInterface.InterfaceHeader.Version )
                {
                        WmDbgPrintEx(DPFLTR_IHVNETWORK_ID, 
DPFLTR_ERROR_LEVEL,"WinMad: GUID_RDMA_INTERFACE_VERBS version mismatch: 
requested version=%d, returned version=%d.\n",
@@ -381,9 +391,7 @@ static NTSTATUS WmPowerD0Entry(WDFDEVICE
                                                                         
AL_INTERFACE_VERSION, NULL);
        if (!NT_SUCCESS(status)) {
                goto exit;
-       }
-       else
-       {
+       } else {
                if( AL_INTERFACE_VERSION != dev->IbInterface.wdm.Version )
                {
                        WmDbgPrintEx(DPFLTR_IHVNETWORK_ID, 
DPFLTR_ERROR_LEVEL,"WinMad: GUID_IB_AL_INTERFACE version mismatch: requested 
version=%d, returned version=%d.\n",
diff -dwup3 -x *svn* -x *makefile.inc -x *sources -r 
c:\dev\openib\ofw\gen1\branches\mlx4_30\trunk\core\winverbs\kernel\wv_driver.c 
.\core\winverbs\kernel\wv_driver.c
--- 
c:\dev\openib\ofw\gen1\branches\mlx4_30\trunk\core\winverbs\kernel\wv_driver.c  
    Thu Mar 29 00:15:18 2012
+++ .\core\winverbs\kernel\wv_driver.c  Thu Jul 26 16:51:37 2012
@@ -415,12 +415,24 @@ static VOID WvFileCreate(WDFDEVICE Devic
 
 static VOID WvFileCleanup(WDFFILEOBJECT FileObject)
 {
+       LIST_ENTRY *entry;
        WV_PROVIDER *prov = WvProviderGetContext(FileObject);
+       WV_PROVIDER *prov_entry;
 
        KeAcquireGuardedMutex(&Lock);
+       for (entry = ProvList.Flink; entry != &ProvList; entry = entry->Flink) {
+               prov_entry = CONTAINING_RECORD(entry, WV_PROVIDER, Entry);
+               if (prov == prov_entry) {
        RemoveEntryList(&prov->Entry);
+                       goto found;
+               }
+       }
+       prov = NULL;
+found:
        KeReleaseGuardedMutex(&Lock);
+       if (prov) {
        WvProviderCleanup(prov);
+       }
 }
 
 static VOID WvFileClose(WDFFILEOBJECT FileObject)
@@ -517,9 +529,7 @@ static NTSTATUS WvPowerD0Entry(WDFDEVICE
        }
        if (!NT_SUCCESS(status)) {
                goto exit;
-       }
-       else
-       {
+       } else {
                if( VerbsVersion(VERBS_MAJOR_VER, VERBS_MINOR_VER) != 
dev->Interface.InterfaceHeader.Version )
                {
                        WvDbgPrintEx(DPFLTR_IHVNETWORK_ID, 
DPFLTR_ERROR_LEVEL,"WinVerbs: GUID_RDMA_INTERFACE_VERBS version mismatch: 
requested version=%d, returned version=%d.\n",
@@ -597,7 +607,6 @@ static NTSTATUS WvRdmaDeviceAdd(WDFDRIVE
        WdfFdoInitSetFilter(DeviceInit);
 
        WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(&attr, WV_RDMA_DEVICE);
-//     attr.EvtCleanupCallback = WvRdmaDeviceCleanup;
 
        WDF_PNPPOWER_EVENT_CALLBACKS_INIT(&power);
        power.EvtDeviceD0Entry = WvPowerD0Entry;


Attachment: ndv2.22.patch
Description: ndv2.22.patch

_______________________________________________
ofw mailing list
[email protected]
http://lists.openfabrics.org/cgi-bin/mailman/listinfo/ofw

Reply via email to