• A
    Drivers: hv: vmbus: Fix handling of messages with transaction ID of zero · 82cd4bac
    Andrea Parri (Microsoft) 提交于
    vmbus_request_addr() returns 0 (zero) if the transaction ID passed
    to as argument is 0.  This is unfortunate for two reasons: first,
    netvsc_send_completion() does not check for a NULL cmd_rqst (before
    dereferencing the corresponding NVSP message); second, 0 is a *valid*
    value of cmd_rqst in netvsc_send_tx_complete(), cf. the call of
    vmbus_sendpacket() in netvsc_send_pkt().
    
    vmbus_request_addr() has included the code in question since its
    introduction with commit e8b7db38 ("Drivers: hv: vmbus: Add
    vmbus_requestor data structure for VMBus hardening"); such code was
    motivated by the early use of vmbus_requestor by hv_storvsc.  Since
    hv_storvsc moved to a tag-based mechanism to generate and retrieve
    transaction IDs with commit bf5fd8ca ("scsi: storvsc: Use
    blk_mq_unique_tag() to generate requestIDs"), vmbus_request_addr()
    can be modified to return VMBUS_RQST_ERROR if the ID is 0.  This
    change solves the issues in hv_netvsc (and makes the handling of
    messages with transaction ID of 0 consistent with the semantics
    "the ID is not contained in the requestor/invalid ID").
    
    vmbus_next_request_id(), vmbus_request_addr() should still reserve
    the ID of 0 for Hyper-V, because Hyper-V will "ignore" (not respond
    to) VMBUS_DATA_PACKET_FLAG_COMPLETION_REQUESTED packets/requests with
    transaction ID of 0 from the guest.
    
    Fixes: bf5fd8ca ("scsi: storvsc: Use blk_mq_unique_tag() to generate requestIDs")
    Signed-off-by: NAndrea Parri (Microsoft) <parri.andrea@gmail.com>
    Reviewed-by: NMichael Kelley <mikelley@microsoft.com>
    Link: https://lore.kernel.org/r/20220419122325.10078-2-parri.andrea@gmail.comSigned-off-by: NWei Liu <wei.liu@kernel.org>
    82cd4bac
channel.c 36.9 KB