|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [win-pv-devel] [PATCH xenvbd 1/2] Give XENDISK PDOs a name
Use DeviceID/InstanceID to give PDOs a meaningful name that can be used
in log messages.
Also fix some whitespace bugs while in the neighbourhood.
Signed-off-by: Paul Durrant <paul.durrant@xxxxxxxxxx>
---
src/xendisk/driver.h | 2 +
src/xendisk/fdo.c | 140 ++++++++++++++++++++++++++++++++++++++++++++++++++-
src/xendisk/pdo.c | 96 +++++++++++++++++++++++------------
src/xendisk/pdo.h | 4 +-
4 files changed, 208 insertions(+), 34 deletions(-)
diff --git a/src/xendisk/driver.h b/src/xendisk/driver.h
index f1dc821..4221348 100644
--- a/src/xendisk/driver.h
+++ b/src/xendisk/driver.h
@@ -45,6 +45,8 @@ DriverGetParametersKey(
VOID
);
+#define MAX_DEVICE_ID_LEN 200
+
#pragma warning(push)
#pragma warning(disable:4201) // nonstandard extension used : nameless
struct/union
diff --git a/src/xendisk/fdo.c b/src/xendisk/fdo.c
index f00d47e..e260f85 100644
--- a/src/xendisk/fdo.c
+++ b/src/xendisk/fdo.c
@@ -240,6 +240,142 @@ FdoReleaseMutex(
FdoDestroy(Fdo);
}
+__drv_functionClass(IO_COMPLETION_ROUTINE)
+__drv_sameIRQL
+static NTSTATUS
+FdoQueryIdCompletion(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp,
+ IN PVOID Context
+ )
+{
+ PKEVENT Event = Context;
+
+ UNREFERENCED_PARAMETER(DeviceObject);
+ UNREFERENCED_PARAMETER(Irp);
+
+ KeSetEvent(Event, IO_NO_INCREMENT, FALSE);
+
+ return STATUS_MORE_PROCESSING_REQUIRED;
+}
+
+static NTSTATUS
+FdoQueryId(
+ IN PXENDISK_FDO Fdo,
+ IN PDEVICE_OBJECT DeviceObject,
+ IN BUS_QUERY_ID_TYPE Type,
+ OUT PCHAR Id
+ )
+{
+ PIRP Irp;
+ KEVENT Event;
+ PIO_STACK_LOCATION StackLocation;
+ NTSTATUS status;
+
+ UNREFERENCED_PARAMETER(Fdo);
+
+ ASSERT3U(KeGetCurrentIrql(), ==, PASSIVE_LEVEL);
+
+ Irp = IoAllocateIrp(DeviceObject->StackSize, FALSE);
+
+ status = STATUS_INSUFFICIENT_RESOURCES;
+ if (Irp == NULL)
+ goto fail1;
+
+ StackLocation = IoGetNextIrpStackLocation(Irp);
+
+ StackLocation->MajorFunction = IRP_MJ_PNP;
+ StackLocation->MinorFunction = IRP_MN_QUERY_ID;
+ StackLocation->Flags = 0;
+ StackLocation->Parameters.QueryId.IdType = Type;
+ StackLocation->DeviceObject = DeviceObject;
+ StackLocation->FileObject = NULL;
+
+ KeInitializeEvent(&Event, NotificationEvent, FALSE);
+
+ IoSetCompletionRoutine(Irp,
+ FdoQueryIdCompletion,
+ &Event,
+ TRUE,
+ TRUE,
+ TRUE);
+
+ // Default completion status
+ Irp->IoStatus.Status = STATUS_NOT_SUPPORTED;
+
+ status = IoCallDriver(DeviceObject, Irp);
+ if (status == STATUS_PENDING) {
+ (VOID) KeWaitForSingleObject(&Event,
+ Executive,
+ KernelMode,
+ FALSE,
+ NULL);
+ status = Irp->IoStatus.Status;
+ } else {
+ ASSERT3U(status, ==, Irp->IoStatus.Status);
+ }
+
+ if (!NT_SUCCESS(status))
+ goto fail2;
+
+ status = RtlStringCbPrintfA(Id,
+ MAX_DEVICE_ID_LEN,
+ "%ws",
+ (PWCHAR)Irp->IoStatus.Information);
+ ASSERT(NT_SUCCESS(status));
+
+ ExFreePool((PVOID)Irp->IoStatus.Information);
+
+ IoFreeIrp(Irp);
+
+ return STATUS_SUCCESS;
+
+fail2:
+ IoFreeIrp(Irp);
+
+fail1:
+ return status;
+}
+
+static NTSTATUS
+FdoAddDevice(
+ IN PXENDISK_FDO Fdo,
+ IN PDEVICE_OBJECT PhysicalDeviceObject
+ )
+{
+ CHAR DeviceID[MAX_DEVICE_ID_LEN];
+ CHAR InstanceID[MAX_DEVICE_ID_LEN];
+ NTSTATUS status;
+
+ status = FdoQueryId(Fdo,
+ PhysicalDeviceObject,
+ BusQueryDeviceID,
+ DeviceID);
+ if (!NT_SUCCESS(status))
+ goto fail1;
+
+ status = FdoQueryId(Fdo,
+ PhysicalDeviceObject,
+ BusQueryInstanceID,
+ InstanceID);
+ if (!NT_SUCCESS(status))
+ goto fail2;
+
+ status = PdoCreate(Fdo,
+ PhysicalDeviceObject,
+ DeviceID,
+ InstanceID);
+ if (!NT_SUCCESS(status))
+ goto fail3;
+
+ return STATUS_SUCCESS;
+
+fail3:
+fail2:
+fail1:
+ return status;
+}
+
static FORCEINLINE VOID
__FdoEnumerate(
IN PXENDISK_FDO Fdo,
@@ -287,8 +423,8 @@ __FdoEnumerate(
for (Index = 0; Index < Count; Index++) {
#pragma warning(suppress:6385) // Reading invalid data from
'PhysicalDeviceObject'
if (PhysicalDeviceObject[Index] != NULL) {
- (VOID) PdoCreate(Fdo,
- PhysicalDeviceObject[Index]);
+ (VOID) FdoAddDevice(Fdo,
+ PhysicalDeviceObject[Index]);
}
}
diff --git a/src/xendisk/pdo.c b/src/xendisk/pdo.c
index 140f999..e91b1da 100644
--- a/src/xendisk/pdo.c
+++ b/src/xendisk/pdo.c
@@ -51,10 +51,13 @@
#define PDO_TAG 'ODP'
+#define MAXNAMELEN 128
+
struct _XENDISK_PDO {
PXENDISK_DX Dx;
PDEVICE_OBJECT LowerDeviceObject;
PDEVICE_OBJECT PhysicalDeviceObject;
+ CHAR Name[MAXNAMELEN];
PXENDISK_THREAD SystemPowerThread;
PIRP SystemPowerIrp;
@@ -220,6 +223,31 @@ __PdoGetFdo(
return Pdo->Fdo;
}
+static FORCEINLINE VOID
+__PdoSetName(
+ IN PXENDISK_PDO Pdo,
+ IN PCHAR DeviceID,
+ IN PCHAR InstanceID
+ )
+{
+ NTSTATUS status;
+
+ status = RtlStringCbPrintfA(Pdo->Name,
+ MAXNAMELEN,
+ "%s\\%s",
+ DeviceID,
+ InstanceID);
+ ASSERT(NT_SUCCESS(status));
+}
+
+static FORCEINLINE PCHAR
+__PdoGetName(
+ IN PXENDISK_PDO Pdo
+ )
+{
+ return Pdo->Name;
+}
+
__drv_functionClass(IO_COMPLETION_ROUTINE)
__drv_sameIRQL
static NTSTATUS
@@ -1393,10 +1421,10 @@ __PdoSetDevicePowerUp(
if (!NT_SUCCESS(status))
goto done;
- Verbose("%p: %s -> %s\n",
- Pdo->Dx->DeviceObject,
- PowerDeviceStateName(__PdoGetDevicePowerState(Pdo)),
- PowerDeviceStateName(DeviceState));
+ Verbose("%s: %s -> %s\n",
+ __PdoGetName(Pdo),
+ PowerDeviceStateName(__PdoGetDevicePowerState(Pdo)),
+ PowerDeviceStateName(DeviceState));
__PdoSetDevicePowerState(Pdo, DeviceState);
@@ -1422,10 +1450,10 @@ __PdoSetDevicePowerDown(
ASSERT3U(DeviceState, >, __PdoGetDevicePowerState(Pdo));
- Verbose("%p: %s -> %s\n",
- Pdo->Dx->DeviceObject,
- PowerDeviceStateName(__PdoGetDevicePowerState(Pdo)),
- PowerDeviceStateName(DeviceState));
+ Verbose("%s: %s -> %s\n",
+ __PdoGetName(Pdo),
+ PowerDeviceStateName(__PdoGetDevicePowerState(Pdo)),
+ PowerDeviceStateName(DeviceState));
__PdoSetDevicePowerState(Pdo, DeviceState);
@@ -1492,10 +1520,10 @@ __PdoSetSystemPowerUp(
if (!NT_SUCCESS(status))
goto done;
- Verbose("%p: %s -> %s\n",
- Pdo->Dx->DeviceObject,
- PowerSystemStateName(__PdoGetSystemPowerState(Pdo)),
- PowerSystemStateName(SystemState));
+ Verbose("%s: %s -> %s\n",
+ __PdoGetName(Pdo),
+ PowerSystemStateName(__PdoGetSystemPowerState(Pdo)),
+ PowerSystemStateName(SystemState));
__PdoSetSystemPowerState(Pdo, SystemState);
@@ -1508,7 +1536,7 @@ done:
static FORCEINLINE NTSTATUS
__PdoSetSystemPowerDown(
- IN PXENDISK_PDO Pdo,
+ IN PXENDISK_PDO Pdo,
IN PIRP Irp
)
{
@@ -1521,10 +1549,10 @@ __PdoSetSystemPowerDown(
ASSERT3U(SystemState, >, __PdoGetSystemPowerState(Pdo));
- Verbose("%p: %s -> %s\n",
- Pdo->Dx->DeviceObject,
- PowerSystemStateName(__PdoGetSystemPowerState(Pdo)),
- PowerSystemStateName(SystemState));
+ Verbose("%s: %s -> %s\n",
+ __PdoGetName(Pdo),
+ PowerSystemStateName(__PdoGetSystemPowerState(Pdo)),
+ PowerSystemStateName(SystemState));
__PdoSetSystemPowerState(Pdo, SystemState);
@@ -2057,18 +2085,20 @@ PdoDispatch(
NTSTATUS
PdoCreate(
- PXENDISK_FDO Fdo,
- PDEVICE_OBJECT PhysicalDeviceObject
- )
-{
- PDEVICE_OBJECT LowerDeviceObject;
- ULONG DeviceType;
- PDEVICE_OBJECT FilterDeviceObject;
- PXENDISK_DX Dx;
- PXENDISK_PDO Pdo;
- HANDLE ParametersKey;
- ULONG InterceptTrim;
- NTSTATUS status;
+ IN PXENDISK_FDO Fdo,
+ IN PDEVICE_OBJECT PhysicalDeviceObject,
+ IN PCHAR DeviceID,
+ IN PCHAR InstanceID
+ )
+{
+ PDEVICE_OBJECT LowerDeviceObject;
+ ULONG DeviceType;
+ PDEVICE_OBJECT FilterDeviceObject;
+ PXENDISK_DX Dx;
+ PXENDISK_PDO Pdo;
+ HANDLE ParametersKey;
+ ULONG InterceptTrim;
+ NTSTATUS status;
LowerDeviceObject = IoGetAttachedDeviceReference(PhysicalDeviceObject);
DeviceType = LowerDeviceObject->DeviceType;
@@ -2121,6 +2151,8 @@ PdoCreate(
if (!NT_SUCCESS(status))
goto fail5;
+ __PdoSetName(Pdo, DeviceID, InstanceID);
+
ParametersKey = DriverGetParametersKey();
Pdo->InterceptTrim = TRUE;
@@ -2131,7 +2163,7 @@ PdoCreate(
if (NT_SUCCESS(status))
Pdo->InterceptTrim = (InterceptTrim != 0) ? TRUE : FALSE;
- Verbose("%p\n", FilterDeviceObject);
+ Verbose("%p (%s)\n", FilterDeviceObject, __PdoGetName(Pdo));
Dx->Pdo = Pdo;
@@ -2192,12 +2224,14 @@ PdoDestroy(
__PdoUnlink(Pdo);
- Verbose("%p\n", FilterDeviceObject);
+ Verbose("%s\n", __PdoGetName(Pdo));
Dx->Pdo = NULL;
Pdo->InterceptTrim = FALSE;
+ RtlZeroMemory(Pdo->Name, sizeof (Pdo->Name));
+
ThreadAlert(Pdo->DevicePowerThread);
ThreadJoin(Pdo->DevicePowerThread);
Pdo->DevicePowerThread = NULL;
diff --git a/src/xendisk/pdo.h b/src/xendisk/pdo.h
index 566d60f..6d17619 100644
--- a/src/xendisk/pdo.h
+++ b/src/xendisk/pdo.h
@@ -57,7 +57,9 @@ PdoGetPhysicalDeviceObject(
extern NTSTATUS
PdoCreate(
IN PXENDISK_FDO Fdo,
- IN PDEVICE_OBJECT PhysicalDeviceObject
+ IN PDEVICE_OBJECT PhysicalDeviceObject,
+ IN PCHAR DeviceID,
+ IN PCHAR InstanceID
);
extern VOID
--
2.5.3
_______________________________________________
win-pv-devel mailing list
win-pv-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/win-pv-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |