Patch "scsi: sd: sd_zbc: Don't pass GFP_NOIO to kvcalloc" 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: sd: sd_zbc: Don't pass GFP_NOIO to kvcalloc

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-sd-sd_zbc-don-t-pass-gfp_noio-to-kvcalloc.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 59c964ef43184e366bda5b5b9597e3358e326532
Author: Johannes Thumshirn <johannes.thumshirn@xxxxxxx>
Date:   Wed Feb 17 22:52:45 2021 +0900

    scsi: sd: sd_zbc: Don't pass GFP_NOIO to kvcalloc
    
    [ Upstream commit 9acced3f58ad24407c1f9ebf53a8892c1e24cdb5 ]
    
    Dan reported we're passing in GFP_NOIO to kvmalloc() which will then
    fallback to doing kmalloc() instead of an optional vmalloc() if the size
    exceeds kmalloc()s limits. This will break with drives that have zone
    numbers exceeding PAGE_SIZE/sizeof(u32).
    
    Instead of passing in GFP_NOIO, enter an implicit GFP_NOIO allocation
    scope.
    
    Link: https://lore.kernel.org/r/YCuvSfKw4qEQBr/t@mwanda
    Link: https://lore.kernel.org/r/5a6345e2989fd06c049ac4e4627f6acb492c15b8.1613569821.git.johannes.thumshirn@xxxxxxx
    Fixes: 5795eb443060: ("scsi: sd_zbc: emulate ZONE_APPEND commands")
    Cc: Damien Le Moal <Damien.LeMoal@xxxxxxx>
    Reported-by: Dan Carpenter <dan.carpenter@xxxxxxxxxx>
    Reviewed-by: Damien Le Moal <damien.lemoal@xxxxxxx>
    Signed-off-by: Johannes Thumshirn <johannes.thumshirn@xxxxxxx>
    Signed-off-by: Martin K. Petersen <martin.petersen@xxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/scsi/sd_zbc.c b/drivers/scsi/sd_zbc.c
index cf07b7f935790..87a7274e4632b 100644
--- a/drivers/scsi/sd_zbc.c
+++ b/drivers/scsi/sd_zbc.c
@@ -688,6 +688,7 @@ int sd_zbc_revalidate_zones(struct scsi_disk *sdkp)
 	unsigned int nr_zones = sdkp->rev_nr_zones;
 	u32 max_append;
 	int ret = 0;
+	unsigned int flags;
 
 	/*
 	 * For all zoned disks, initialize zone append emulation data if not
@@ -720,16 +721,19 @@ int sd_zbc_revalidate_zones(struct scsi_disk *sdkp)
 	    disk->queue->nr_zones == nr_zones)
 		goto unlock;
 
+	flags = memalloc_noio_save();
 	sdkp->zone_blocks = zone_blocks;
 	sdkp->nr_zones = nr_zones;
-	sdkp->rev_wp_offset = kvcalloc(nr_zones, sizeof(u32), GFP_NOIO);
+	sdkp->rev_wp_offset = kvcalloc(nr_zones, sizeof(u32), GFP_KERNEL);
 	if (!sdkp->rev_wp_offset) {
 		ret = -ENOMEM;
+		memalloc_noio_restore(flags);
 		goto unlock;
 	}
 
 	ret = blk_revalidate_disk_zones(disk, sd_zbc_revalidate_zones_cb);
 
+	memalloc_noio_restore(flags);
 	kvfree(sdkp->rev_wp_offset);
 	sdkp->rev_wp_offset = NULL;
 



[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