On 2021/12/21 19:15, Christoph Hellwig wrote: > On Tue, Dec 21, 2021 at 11:08:11AM +0100, Christoph Hellwig wrote: >> On Fri, Dec 17, 2021 at 07:37:43PM +0900, Tetsuo Handa wrote: >>> Well, I don't think that we can remove this blk_free_ext_minor() call, for >>> this call is releasing disk->first_minor rather than MINOR(bdev->bd_dev). >>> >>> Since bdev_add(disk->part0, MKDEV(disk->major, disk->first_minor)) is not >>> called when reaching the out_free_ext_minor label, >>> >>> if (MAJOR(bdev->bd_dev) == BLOCK_EXT_MAJOR) >>> blk_free_ext_minor(MINOR(bdev->bd_dev)); >>> >>> in bdev_free_inode() will not be called because MAJOR(bdev->bd_dev) == 0 >>> because bdev->bd_dev == 0. >>> >>> I think we can apply this patch as-is... >> >> With the patch as-is we'll still leak disk->ev if device_add fails. >> Something like the patch below should solve that by moving the disk->ev >> allocation later and always cleaning it up through disk->release: Then what about this simple fix? diff --git a/block/disk-events.c b/block/disk-events.c index 8d5496e7592a..05b1249650ab 100644 --- a/block/disk-events.c +++ b/block/disk-events.c @@ -501,4 +501,5 @@ void disk_release_events(struct gendisk *disk) /* the block count should be 1 from disk_del_events() */ WARN_ON_ONCE(disk->ev && disk->ev->block != 1); kfree(disk->ev); + disk->ev = NULL; }