[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [win-pv-devel] [PATCH 8/9] Change enumeration function to take PANSI_STRING array to simplify parsing of the data returned by STORE(Directory)
Signed-off-by: Owen Smith <owen.smith@xxxxxxxxxx> --- src/xenvbd/fdo.c | 287 ++++++++++++++++++++++++++++++++++--------------------- 1 file changed, 180 insertions(+), 107 deletions(-) diff --git a/src/xenvbd/fdo.c b/src/xenvbd/fdo.c index 29ec966..9e04bb1 100644 --- a/src/xenvbd/fdo.c +++ b/src/xenvbd/fdo.c @@ -428,16 +428,6 @@ FdoDebugCallback( //============================================================================= // Enumeration -__checkReturn -static FORCEINLINE PCHAR -__NextSz( - __in PCHAR Str - ) -{ - for (; *Str; ++Str) ; - ++Str; - return Str; -} static FORCEINLINE ULONG __ParseVbd( __in PCHAR DeviceIdStr @@ -573,14 +563,15 @@ __FdoIsPdoUnplugged( static FORCEINLINE VOID __FdoEnumerate( - __in PXENVBD_FDO Fdo, - __in PCHAR Devices, - __out PBOOLEAN NeedInvalidate, - __out PBOOLEAN NeedReboot + __in PXENVBD_FDO Fdo, + __in PANSI_STRING Devices, + __out PBOOLEAN NeedInvalidate, + __out PBOOLEAN NeedReboot ) { ULONG TargetId; - PCHAR Device; + PANSI_STRING Device; + ULONG Index; PXENVBD_PDO Pdo; *NeedInvalidate = FALSE; @@ -593,8 +584,10 @@ __FdoEnumerate( if (Pdo == NULL) continue; - for (Device = Devices; *Device; Device = __NextSz(Device)) { - ULONG DeviceTargetId = __ParseVbd(Device); + for (Index = 0; Devices[Index].Buffer != NULL; ++Index) { + ULONG DeviceTargetId; + Device = &Devices[Index]; + DeviceTargetId = __ParseVbd(Device->Buffer); if (TargetId == DeviceTargetId) { Missing = FALSE; break; @@ -618,10 +611,12 @@ __FdoEnumerate( } // add new targets - for (Device = Devices; *Device; Device = __NextSz(Device)) { + for (Index = 0; Devices[Index].Buffer != NULL; ++Index) { XENVBD_DEVICE_TYPE DeviceType; - TargetId = __ParseVbd(Device); + Device = &Devices[Index]; + + TargetId = __ParseVbd(Device->Buffer); if (TargetId == 0xFFFFFFFF) { continue; } @@ -632,26 +627,181 @@ __FdoEnumerate( continue; } - if (__FdoHiddenTarget(Fdo, Device, &DeviceType)) { + if (__FdoHiddenTarget(Fdo, Device->Buffer, &DeviceType)) { continue; } if (!__FdoIsPdoUnplugged(Fdo, FdoEnum(Fdo), - Device, + Device->Buffer, TargetId)) { *NeedReboot = TRUE; continue; } if (PdoCreate(Fdo, - Device, + Device->Buffer, TargetId, DeviceType)) { *NeedInvalidate = TRUE; } } } + +static FORCEINLINE PANSI_STRING +__FdoMultiSzToAnsi( + IN PCHAR Buffer + ) +{ + PANSI_STRING Ansi; + LONG Index; + LONG Count; + NTSTATUS status; + + Index = 0; + Count = 0; + for (;;) { + if (Buffer[Index] == '\0') { + Count++; + Index++; + + // Check for double NUL + if (Buffer[Index] == '\0') + break; + } else { + Index++; + } + } + + Ansi = __AllocateNonPagedPoolWithTag(__FUNCTION__, + __LINE__, + sizeof (ANSI_STRING) * (Count + 1), + FDO_SIGNATURE); + + status = STATUS_NO_MEMORY; + if (Ansi == NULL) + goto fail1; + + for (Index = 0; Index < Count; Index++) { + ULONG Length; + + Length = (ULONG)strlen(Buffer); + Ansi[Index].MaximumLength = (USHORT)(Length + 1); + Ansi[Index].Buffer = __AllocateNonPagedPoolWithTag(__FUNCTION__, + __LINE__, + Ansi[Index].MaximumLength, + FDO_SIGNATURE); + + status = STATUS_NO_MEMORY; + if (Ansi[Index].Buffer == NULL) + goto fail2; + + RtlCopyMemory(Ansi[Index].Buffer, Buffer, Length); + Ansi[Index].Length = (USHORT)Length; + + Buffer += Length + 1; + } + + return Ansi; + +fail2: + Error("fail2\n"); + + while (--Index >= 0) + __FreePoolWithTag(Ansi[Index].Buffer, FDO_SIGNATURE); + + __FreePoolWithTag(Ansi, FDO_SIGNATURE); + +fail1: + Error("fail1 (%08x)\n", status); + + return NULL; +} + +static FORCEINLINE PANSI_STRING +__FdoMultiSzToUpcaseAnsi( + IN PCHAR Buffer + ) +{ + PANSI_STRING Ansi; + LONG Index; + LONG Count; + NTSTATUS status; + + Index = 0; + Count = 0; + for (;;) { + if (Buffer[Index] == '\0') { + Count++; + Index++; + + // Check for double NUL + if (Buffer[Index] == '\0') + break; + } else { + Buffer[Index] = __toupper(Buffer[Index]); + Index++; + } + } + + Ansi = __AllocateNonPagedPoolWithTag(__FUNCTION__, + __LINE__, + sizeof (ANSI_STRING) * (Count + 1), + FDO_SIGNATURE); + + status = STATUS_NO_MEMORY; + if (Ansi == NULL) + goto fail1; + + for (Index = 0; Index < Count; Index++) { + ULONG Length; + + Length = (ULONG)strlen(Buffer); + Ansi[Index].MaximumLength = (USHORT)(Length + 1); + Ansi[Index].Buffer = __AllocateNonPagedPoolWithTag(__FUNCTION__, + __LINE__, + Ansi[Index].MaximumLength, + FDO_SIGNATURE); + + status = STATUS_NO_MEMORY; + if (Ansi[Index].Buffer == NULL) + goto fail2; + + RtlCopyMemory(Ansi[Index].Buffer, Buffer, Length); + Ansi[Index].Length = (USHORT)Length; + + Buffer += Length + 1; + } + + return Ansi; + +fail2: + Error("fail2\n"); + + while (--Index >= 0) + __FreePoolWithTag(Ansi[Index].Buffer, FDO_SIGNATURE); + + __FreePoolWithTag(Ansi, FDO_SIGNATURE); + +fail1: + Error("fail1 (%08x)\n", status); + + return NULL; +} + +static FORCEINLINE VOID +__FdoFreeAnsi( + IN PANSI_STRING Ansi + ) +{ + ULONG Index; + + for (Index = 0; Ansi[Index].Buffer != NULL; Index++) + __FreePoolWithTag(Ansi[Index].Buffer, FDO_SIGNATURE); + + __FreePoolWithTag(Ansi, FDO_SIGNATURE); +} + static DECLSPEC_NOINLINE VOID FdoScanTargets( __in PXENVBD_FDO Fdo @@ -659,6 +809,7 @@ FdoScanTargets( { NTSTATUS Status; PCHAR Buffer; + PANSI_STRING Devices; BOOLEAN NeedInvalidate; BOOLEAN NeedReboot; @@ -666,9 +817,15 @@ FdoScanTargets( if (!NT_SUCCESS(Status)) return; - __FdoEnumerate(Fdo, Buffer, &NeedInvalidate, &NeedReboot); + Devices = __FdoMultiSzToAnsi(Buffer); XENBUS_STORE(Free, &Fdo->Store, Buffer); + if (Devices == NULL) + return; + + __FdoEnumerate(Fdo, Devices, &NeedInvalidate, &NeedReboot); + __FdoFreeAnsi(Devices); + if (NeedInvalidate) { StorPortNotification(BusChangeDetected, Fdo, 0); } @@ -900,90 +1057,6 @@ __FdoRelease( XENFILT_EMULATED(Release, &Fdo->Emulated); } -static FORCEINLINE PANSI_STRING -__FdoMultiSzToUpcaseAnsi( - IN PCHAR Buffer - ) -{ - PANSI_STRING Ansi; - LONG Index; - LONG Count; - NTSTATUS status; - - Index = 0; - Count = 0; - for (;;) { - if (Buffer[Index] == '\0') { - Count++; - Index++; - - // Check for double NUL - if (Buffer[Index] == '\0') - break; - } else { - Buffer[Index] = __toupper(Buffer[Index]); - Index++; - } - } - - Ansi = __AllocateNonPagedPoolWithTag(__FUNCTION__, - __LINE__, - sizeof (ANSI_STRING) * (Count + 1), - FDO_SIGNATURE); - - status = STATUS_NO_MEMORY; - if (Ansi == NULL) - goto fail1; - - for (Index = 0; Index < Count; Index++) { - ULONG Length; - - Length = (ULONG)strlen(Buffer); - Ansi[Index].MaximumLength = (USHORT)(Length + 1); - Ansi[Index].Buffer = __AllocateNonPagedPoolWithTag(__FUNCTION__, - __LINE__, - Ansi[Index].MaximumLength, - FDO_SIGNATURE); - - status = STATUS_NO_MEMORY; - if (Ansi[Index].Buffer == NULL) - goto fail2; - - RtlCopyMemory(Ansi[Index].Buffer, Buffer, Length); - Ansi[Index].Length = (USHORT)Length; - - Buffer += Length + 1; - } - - return Ansi; - -fail2: - Error("fail2\n"); - - while (--Index >= 0) - __FreePoolWithTag(Ansi[Index].Buffer, FDO_SIGNATURE); - - __FreePoolWithTag(Ansi, FDO_SIGNATURE); - -fail1: - Error("fail1 (%08x)\n", status); - - return NULL; -} - -static FORCEINLINE VOID -__FdoFreeAnsi( - IN PANSI_STRING Ansi - ) -{ - ULONG Index; - - for (Index = 0; Ansi[Index].Buffer != NULL; Index++) - __FreePoolWithTag(Ansi[Index].Buffer, FDO_SIGNATURE); - - __FreePoolWithTag(Ansi, FDO_SIGNATURE); -} - static FORCEINLINE BOOLEAN __FdoMatchDistribution( IN PXENVBD_FDO Fdo, -- 1.9.4.msysgit.1 _______________________________________________ win-pv-devel mailing list win-pv-devel@xxxxxxxxxxxxxxxxxxxx http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |