From: Ming Lei Date: Mon, 25 Oct 2021 02:54:25 +0000 (+0800) Subject: zram: avoid race between zram_remove and disksize_store X-Git-Tag: v5.16-rc1~73^2~20 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=5a4b653655d554b5f51a5d2252882708c56a6f7e;p=thirdparty%2Fkernel%2Fstable.git zram: avoid race between zram_remove and disksize_store After resetting device in zram_remove(), disksize_store still may come and allocate resources again before deleting gendisk, fix the race by resetting zram after del_gendisk() returns. At that time, disksize_store can't come any more. Reported-by: Luis Chamberlain Reviewed-by: Luis Chamberlain Signed-off-by: Ming Lei Acked-by: Minchan Kim Link: https://lore.kernel.org/r/20211025025426.2815424-4-ming.lei@redhat.com Signed-off-by: Jens Axboe --- diff --git a/drivers/block/zram/zram_drv.c b/drivers/block/zram/zram_drv.c index 13b65ebbab8da..2dfa3a396c7ce 100644 --- a/drivers/block/zram/zram_drv.c +++ b/drivers/block/zram/zram_drv.c @@ -2006,6 +2006,13 @@ static int zram_remove(struct zram *zram) /* del_gendisk drains pending reset_store */ WARN_ON_ONCE(claimed && zram->claim); + /* + * disksize_store() may be called in between zram_reset_device() + * and del_gendisk(), so run the last reset to avoid leaking + * anything allocated with disksize_store() + */ + zram_reset_device(zram); + blk_cleanup_disk(zram->disk); kfree(zram); return 0;