diff --git a/block/genhd.c b/block/genhd.c index 686a54698aa0273bc0cf91fa7b6e46c8848675c7..408cda8af4ebac639df071ab5342f37f653fcf29 100644 --- a/block/genhd.c +++ b/block/genhd.c @@ -774,6 +774,7 @@ void del_gendisk(struct gendisk *disk) bdev = bdget_disk(disk, 0); if (bdev) mutex_lock(&bdev->bd_mutex); + disk->flags &= ~GENHD_FL_UP; /* invalidate stuff */ disk_part_iter_init(&piter, disk, DISK_PITER_INCL_EMPTY | DISK_PITER_REVERSE); @@ -789,7 +790,6 @@ void del_gendisk(struct gendisk *disk) invalidate_partition(disk, 0); bdev_unhash_inode(disk_devt(disk)); set_capacity(disk, 0); - disk->flags &= ~GENHD_FL_UP; up_write(&disk->lookup_sem); if (!(disk->flags & GENHD_FL_HIDDEN)) diff --git a/block/ioctl.c b/block/ioctl.c index 899ffd50a7c6b86b4ec7d1c289d286dbcfee6516..3bcfc8dc32fad4336886cf5d4b1e454eaaba87e1 100644 --- a/block/ioctl.c +++ b/block/ioctl.c @@ -50,6 +50,10 @@ static int blkpg_ioctl(struct block_device *bdev, struct blkpg_ioctl_arg __user return -EINVAL; mutex_lock(&bdev->bd_mutex); + if (!(disk->flags & GENHD_FL_UP)) { + mutex_unlock(&bdev->bd_mutex); + return -ENXIO; + } /* overlap? */ disk_part_iter_init(&piter, disk, diff --git a/block/partition-generic.c b/block/partition-generic.c index 63b82df5bbb40c63272e518e4a6636eca58fbef6..ddaa5d41139c69fda9984ea575a518d7e4858461 100644 --- a/block/partition-generic.c +++ b/block/partition-generic.c @@ -525,6 +525,9 @@ int rescan_partitions(struct gendisk *disk, struct block_device *bdev) struct parsed_partitions *state = NULL; struct hd_struct *part; int p, highest, res; + + if (!(disk->flags & GENHD_FL_UP)) + return -ENXIO; rescan: if (state && !IS_ERR(state)) { free_partitions(state);