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

Configure Feed

Select the types of activity you want to include in your feed.

Revert "md: improve partition detection in md array"

This reverts commit 5b479c91da90eef605f851508744bfe8269591a0.

Quoth Neil Brown:

"It causes an oops when auto-detecting raid arrays, and it doesn't
seem easy to fix.

The array may not be 'open' when do_md_run is called, so
bdev->bd_disk might be NULL, so bd_set_size can oops.

This whole approach of opening an md device before it has been
assembled just seems to get more and more painful. I think I'm going
to have to come up with something clever to provide both backward
comparability with usage expectation, and sane integration into the
rest of the kernel."

Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

+22 -8
+18 -8
drivers/md/md.c
··· 3104 3104 struct gendisk *disk; 3105 3105 struct mdk_personality *pers; 3106 3106 char b[BDEVNAME_SIZE]; 3107 - struct block_device *bdev; 3108 3107 3109 3108 if (list_empty(&mddev->disks)) 3110 3109 /* cannot run an array with no devices.. */ ··· 3331 3332 md_wakeup_thread(mddev->thread); 3332 3333 md_wakeup_thread(mddev->sync_thread); /* possibly kick off a reshape */ 3333 3334 3334 - bdev = bdget_disk(mddev->gendisk, 0); 3335 - if (bdev) { 3336 - bd_set_size(bdev, mddev->array_size << 1); 3337 - blkdev_ioctl(bdev->bd_inode, NULL, BLKRRPART, 0); 3338 - bdput(bdev); 3339 - } 3340 - 3335 + mddev->changed = 1; 3341 3336 md_new_event(mddev); 3342 3337 kobject_uevent(&mddev->gendisk->kobj, KOBJ_CHANGE); 3343 3338 return 0; ··· 3453 3460 mddev->pers = NULL; 3454 3461 3455 3462 set_capacity(disk, 0); 3463 + mddev->changed = 1; 3456 3464 3457 3465 if (mddev->ro) 3458 3466 mddev->ro = 0; ··· 4593 4599 return 0; 4594 4600 } 4595 4601 4602 + static int md_media_changed(struct gendisk *disk) 4603 + { 4604 + mddev_t *mddev = disk->private_data; 4605 + 4606 + return mddev->changed; 4607 + } 4608 + 4609 + static int md_revalidate(struct gendisk *disk) 4610 + { 4611 + mddev_t *mddev = disk->private_data; 4612 + 4613 + mddev->changed = 0; 4614 + return 0; 4615 + } 4596 4616 static struct block_device_operations md_fops = 4597 4617 { 4598 4618 .owner = THIS_MODULE, ··· 4614 4606 .release = md_release, 4615 4607 .ioctl = md_ioctl, 4616 4608 .getgeo = md_getgeo, 4609 + .media_changed = md_media_changed, 4610 + .revalidate_disk= md_revalidate, 4617 4611 }; 4618 4612 4619 4613 static int md_thread(void * arg)
+1
drivers/md/raid1.c
··· 2063 2063 */ 2064 2064 mddev->array_size = sectors>>1; 2065 2065 set_capacity(mddev->gendisk, mddev->array_size << 1); 2066 + mddev->changed = 1; 2066 2067 if (mddev->array_size > mddev->size && mddev->recovery_cp == MaxSector) { 2067 2068 mddev->recovery_cp = mddev->size << 1; 2068 2069 set_bit(MD_RECOVERY_NEEDED, &mddev->recovery);
+2
drivers/md/raid5.c
··· 3864 3864 sectors &= ~((sector_t)mddev->chunk_size/512 - 1); 3865 3865 mddev->array_size = (sectors * (mddev->raid_disks-conf->max_degraded))>>1; 3866 3866 set_capacity(mddev->gendisk, mddev->array_size << 1); 3867 + mddev->changed = 1; 3867 3868 if (sectors/2 > mddev->size && mddev->recovery_cp == MaxSector) { 3868 3869 mddev->recovery_cp = mddev->size << 1; 3869 3870 set_bit(MD_RECOVERY_NEEDED, &mddev->recovery); ··· 3999 3998 conf->mddev->array_size = conf->mddev->size * 4000 3999 (conf->raid_disks - conf->max_degraded); 4001 4000 set_capacity(conf->mddev->gendisk, conf->mddev->array_size << 1); 4001 + conf->mddev->changed = 1; 4002 4002 4003 4003 bdev = bdget_disk(conf->mddev->gendisk, 0); 4004 4004 if (bdev) {
+1
include/linux/raid/md_k.h
··· 201 201 struct mutex reconfig_mutex; 202 202 atomic_t active; 203 203 204 + int changed; /* true if we might need to reread partition info */ 204 205 int degraded; /* whether md should consider 205 206 * adding a spare 206 207 */