Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

md: check for NULL ->meta_bdev before calling bdev_read_only

->meta_bdev is optional and not set for most arrays. Add a
rdev_read_only helper that calls bdev_read_only for both devices
in a safe way.

Fixes: 6f0d9689b670 ("block: remove the NULL bdev check in bdev_read_only")
Reported-by: Guoqing Jiang <guoqing.jiang@cloud.ionos.com>
Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Jens Axboe <axboe@kernel.dk>

authored by

Christoph Hellwig and committed by
Jens Axboe
d7a47838 f7bf5e24

+8 -5
+8 -5
drivers/md/md.c
··· 2399 2399 } 2400 2400 EXPORT_SYMBOL(md_integrity_add_rdev); 2401 2401 2402 + static bool rdev_read_only(struct md_rdev *rdev) 2403 + { 2404 + return bdev_read_only(rdev->bdev) || 2405 + (rdev->meta_bdev && bdev_read_only(rdev->meta_bdev)); 2406 + } 2407 + 2402 2408 static int bind_rdev_to_array(struct md_rdev *rdev, struct mddev *mddev) 2403 2409 { 2404 2410 char b[BDEVNAME_SIZE]; ··· 2414 2408 if (find_rdev(mddev, rdev->bdev->bd_dev)) 2415 2409 return -EEXIST; 2416 2410 2417 - if ((bdev_read_only(rdev->bdev) || bdev_read_only(rdev->meta_bdev)) && 2418 - mddev->pers) 2411 + if (rdev_read_only(rdev) && mddev->pers) 2419 2412 return -EROFS; 2420 2413 2421 2414 /* make sure rdev->sectors exceeds mddev->dev_sectors */ ··· 5848 5843 continue; 5849 5844 sync_blockdev(rdev->bdev); 5850 5845 invalidate_bdev(rdev->bdev); 5851 - if (mddev->ro != 1 && 5852 - (bdev_read_only(rdev->bdev) || 5853 - bdev_read_only(rdev->meta_bdev))) { 5846 + if (mddev->ro != 1 && rdev_read_only(rdev)) { 5854 5847 mddev->ro = 1; 5855 5848 if (mddev->gendisk) 5856 5849 set_disk_ro(mddev->gendisk, 1);