Patch "scsi: storvsc: Handle BlockSize change in Hyper-V VHD/VHDX file" has been added to the 5.10-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    scsi: storvsc: Handle BlockSize change in Hyper-V VHD/VHDX file

to the 5.10-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     scsi-storvsc-handle-blocksize-change-in-hyper-v-vhd-.patch
and it can be found in the queue-5.10 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 02f76f0cc725382e5f8e7461722d1770fa9193d2
Author: Michael Kelley <mikelley@xxxxxxxxxxxxx>
Date:   Mon Feb 27 08:48:34 2023 -0800

    scsi: storvsc: Handle BlockSize change in Hyper-V VHD/VHDX file
    
    [ Upstream commit 11d9874c4204a785f43d899a1ab12f9dc8d9de3e ]
    
    Hyper-V uses a VHD or VHDX file on the host as the underlying storage for a
    virtual disk.  The VHD/VHDX file format is a sparse format where real disk
    space on the host is assigned in chunks that the VHD/VHDX file format calls
    the BlockSize.  This BlockSize is not to be confused with the 512-byte (or
    4096-byte) sector size of the underlying storage device.  The default block
    size for a new VHD/VHDX file is 32 Mbytes.  When a guest VM touches any
    disk space within a 32 Mbyte chunk of the VHD/VHDX file, Hyper-V allocates
    32 Mbytes of real disk space for that section of the VHD/VHDX. Similarly,
    if a discard operation is done that covers an entire 32 Mbyte chunk,
    Hyper-V will free the real disk space for that portion of the VHD/VHDX.
    This BlockSize is surfaced in Linux as the "discard_granularity" in
    /sys/block/sd<x>/queue, which makes sense.
    
    Hyper-V also has differencing disks that can overlay a VHD/VHDX file to
    capture changes to the VHD/VHDX while preserving the original VHD/VHDX.
    One example of this differencing functionality is for VM snapshots.  When a
    snapshot is created, a differencing disk is created.  If the snapshot is
    rolled back, Hyper-V can just delete the differencing disk, and the VM will
    see the original disk contents at the time the snapshot was taken.
    Differencing disks are used in other scenarios as well.
    
    The BlockSize for a differencing disk defaults to 2 Mbytes, not 32 Mbytes.
    The smaller default is used because changes to differencing disks are
    typically scattered all over, and Hyper-V doesn't want to allocate 32
    Mbytes of real disk space for a stray write here or there.  The smaller
    BlockSize provides more efficient use of real disk space.
    
    When a differencing disk is added to a VHD/VHDX, Hyper-V reports
    UNIT_ATTENTION with a sense code indicating "Operating parameters have
    changed", because the value of discard_granularity should be changed to 2
    Mbytes. When the differencing disk is removed, discard_granularity should
    be changed back to 32 Mbytes.  However, current code simply reports a
    message from scsi_report_sense() and the value of
    /sys/block/sd<x>/queue/discard_granularity is not updated. The message
    isn't very actionable by a sysadmin.
    
    Fix this by having the storvsc driver check for the sense code indicating
    that the underly VHD/VHDX block size has changed, and do a rescan of the
    device to pick up the new discard_granularity.  With this change the entire
    transition to/from differencing disks is handled automatically and
    transparently, with no confusing messages being output.
    
    Link: https://lore.kernel.org/r/1677516514-86060-1-git-send-email-mikelley@xxxxxxxxxxxxx
    Signed-off-by: Michael Kelley <mikelley@xxxxxxxxxxxxx>
    Signed-off-by: Martin K. Petersen <martin.petersen@xxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/scsi/storvsc_drv.c b/drivers/scsi/storvsc_drv.c
index 3fa8a0c94bdc1..e38aebcabb26f 100644
--- a/drivers/scsi/storvsc_drv.c
+++ b/drivers/scsi/storvsc_drv.c
@@ -1013,6 +1013,22 @@ static void storvsc_handle_error(struct vmscsi_request *vm_srb,
 				goto do_work;
 			}
 
+			/*
+			 * Check for "Operating parameters have changed"
+			 * due to Hyper-V changing the VHD/VHDX BlockSize
+			 * when adding/removing a differencing disk. This
+			 * causes discard_granularity to change, so do a
+			 * rescan to pick up the new granularity. We don't
+			 * want scsi_report_sense() to output a message
+			 * that a sysadmin wouldn't know what to do with.
+			 */
+			if ((asc == 0x3f) && (ascq != 0x03) &&
+					(ascq != 0x0e)) {
+				process_err_fn = storvsc_device_scan;
+				set_host_byte(scmnd, DID_REQUEUE);
+				goto do_work;
+			}
+
 			/*
 			 * Otherwise, let upper layer deal with the
 			 * error when sense message is present



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux