diff --git a/block/genhd.c b/block/genhd.c
index 2127d29003419fb5bf51c1c173aeb362d9b95955..f66726a4fad278dc34344f041edabca183944b91 100644
--- a/block/genhd.c
+++ b/block/genhd.c
@@ -765,6 +765,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);
@@ -780,7 +781,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 739c0cc5fd2221ea028caab6ab4d385faa993e07..cc3e1bd86d25c4d1dee2aef37934b57c16eaf81e 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);