|
@@ -4347,13 +4347,19 @@ static int md_alloc(dev_t dev, char *name)
|
|
disk->fops = &md_fops;
|
|
disk->fops = &md_fops;
|
|
disk->private_data = mddev;
|
|
disk->private_data = mddev;
|
|
disk->queue = mddev->queue;
|
|
disk->queue = mddev->queue;
|
|
|
|
+ blk_queue_flush(mddev->queue, REQ_FLUSH | REQ_FUA);
|
|
/* Allow extended partitions. This makes the
|
|
/* Allow extended partitions. This makes the
|
|
* 'mdp' device redundant, but we can't really
|
|
* 'mdp' device redundant, but we can't really
|
|
* remove it now.
|
|
* remove it now.
|
|
*/
|
|
*/
|
|
disk->flags |= GENHD_FL_EXT_DEVT;
|
|
disk->flags |= GENHD_FL_EXT_DEVT;
|
|
- add_disk(disk);
|
|
|
|
mddev->gendisk = disk;
|
|
mddev->gendisk = disk;
|
|
|
|
+ /* As soon as we call add_disk(), another thread could get
|
|
|
|
+ * through to md_open, so make sure it doesn't get too far
|
|
|
|
+ */
|
|
|
|
+ mutex_lock(&mddev->open_mutex);
|
|
|
|
+ add_disk(disk);
|
|
|
|
+
|
|
error = kobject_init_and_add(&mddev->kobj, &md_ktype,
|
|
error = kobject_init_and_add(&mddev->kobj, &md_ktype,
|
|
&disk_to_dev(disk)->kobj, "%s", "md");
|
|
&disk_to_dev(disk)->kobj, "%s", "md");
|
|
if (error) {
|
|
if (error) {
|
|
@@ -4367,8 +4373,7 @@ static int md_alloc(dev_t dev, char *name)
|
|
if (mddev->kobj.sd &&
|
|
if (mddev->kobj.sd &&
|
|
sysfs_create_group(&mddev->kobj, &md_bitmap_group))
|
|
sysfs_create_group(&mddev->kobj, &md_bitmap_group))
|
|
printk(KERN_DEBUG "pointless warning\n");
|
|
printk(KERN_DEBUG "pointless warning\n");
|
|
-
|
|
|
|
- blk_queue_flush(mddev->queue, REQ_FLUSH | REQ_FUA);
|
|
|
|
|
|
+ mutex_unlock(&mddev->open_mutex);
|
|
abort:
|
|
abort:
|
|
mutex_unlock(&disks_mutex);
|
|
mutex_unlock(&disks_mutex);
|
|
if (!error && mddev->kobj.sd) {
|
|
if (!error && mddev->kobj.sd) {
|