Thanks, James. The idea of cutting communications with Scsi_Host at bsg_unregister_queue(..) time and leaving bsg_class_device to its own fate makes a lot of sense, conceptually. But there are implementation issues that are difficult to work around. bsg.c creates bsg_class_device and takes a reference to Scsi_Host at bsg_register_queue(..) time. The reference is dropped at bsg_class_device's release(..) function. If the driver implementing Scsi_Host template is not around we crash. We could move the reference drop from bsg_class_device's release(..) function to bsg_unregister_queue(..). That would be a small change in bsg.c. But bsg.c sets Scsi_Host as the parent of bsg_class_device's device. We cannot have a device around with a dangling parent. A device's parent cannot be changed dynamically. Not setting the device's parent at creation may affect software relying on bsg_class_device - Scsi_Host child-parent relations. It looks like I am out of options. Do you have suggestions on how to work around Scsi_Host being bsg_class_device's parent?