Page MenuHomeFreeBSD

D5451.diff
No OneTemporary

D5451.diff

Index: head/sys/dev/hyperv/include/hyperv.h
===================================================================
--- head/sys/dev/hyperv/include/hyperv.h
+++ head/sys/dev/hyperv/include/hyperv.h
@@ -828,6 +828,8 @@
void *per_channel_state;
} hv_vmbus_channel;
+#define HV_VMBUS_CHAN_ISPRIMARY(chan) ((chan)->primary_channel == NULL)
+
static inline void
hv_set_channel_read_state(hv_vmbus_channel* channel, boolean_t state)
{
Index: head/sys/dev/hyperv/storvsc/hv_storvsc_drv_freebsd.c
===================================================================
--- head/sys/dev/hyperv/storvsc/hv_storvsc_drv_freebsd.c
+++ head/sys/dev/hyperv/storvsc/hv_storvsc_drv_freebsd.c
@@ -334,7 +334,7 @@
int ret = 0;
new_channel = (hv_vmbus_channel *)context;
- device = new_channel->primary_channel->device;
+ device = new_channel->device;
sc = get_stor_device(device, TRUE);
if (sc == NULL)
return;
@@ -837,12 +837,7 @@
struct hv_storvsc_request *request;
struct vstor_packet *vstor_packet;
- if (channel->primary_channel != NULL){
- device = channel->primary_channel->device;
- } else {
- device = channel->device;
- }
-
+ device = channel->device;
KASSERT(device, ("device is NULL"));
sc = get_stor_device(device, FALSE);
Index: head/sys/dev/hyperv/vmbus/hv_channel_mgmt.c
===================================================================
--- head/sys/dev/hyperv/vmbus/hv_channel_mgmt.c
+++ head/sys/dev/hyperv/vmbus/hv_channel_mgmt.c
@@ -211,6 +211,7 @@
* It is a sub channel offer, process it.
*/
new_channel->primary_channel = channel;
+ new_channel->device = channel->device;
mtx_lock(&channel->sc_lock);
TAILQ_INSERT_TAIL(
&channel->sc_list_anchor,
@@ -451,7 +452,10 @@
hv_vmbus_channel* channel;
channel = (hv_vmbus_channel*)context;
- hv_vmbus_child_device_unregister(channel->device);
+ if (HV_VMBUS_CHAN_ISPRIMARY(channel)) {
+ /* Only primary channel owns the hv_device */
+ hv_vmbus_child_device_unregister(channel->device);
+ }
}
/**
@@ -672,7 +676,10 @@
TAILQ_REMOVE(&hv_vmbus_g_connection.channel_anchor,
channel, list_entry);
- hv_vmbus_child_device_unregister(channel->device);
+ if (HV_VMBUS_CHAN_ISPRIMARY(channel)) {
+ /* Only primary channel owns the hv_device */
+ hv_vmbus_child_device_unregister(channel->device);
+ }
hv_vmbus_free_vmbus_channel(channel);
}
bzero(hv_vmbus_g_connection.channels,

File Metadata

Mime Type
text/plain
Expires
Tue, Feb 4, 9:56 AM (17 h, 57 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
16451602
Default Alt Text
D5451.diff (2 KB)

Event Timeline