Unverified Commit 2807514f authored by openeuler-ci-bot's avatar openeuler-ci-bot Committed by Gitee
Browse files

!3756 md: mainline backport

Merge Pull Request from: @ci-robot 
 
PR sync from: Li Nan <linan122@huawei.com>
https://mailweb.openeuler.org/hyperkitty/list/kernel@openeuler.org/message/7BUIXUTXMNA4YCLZFGXDAHXCBXGG6DKU/ 
Christoph Hellwig (6):
  md: convert to blk_alloc_disk/blk_cleanup_disk
  md: add the bitmap group to the default groups for the md kobject
  md: extend disks_mutex coverage
  md: properly unwind when failing to add the kobject in md_alloc
  md: fix mddev->kobj lifetime
  md: fix error handling in md_alloc

Eric Dumazet (1):
  md: use msleep() in md_notify_reboot()

Luis Chamberlain (1):
  md: add error handling support for add_disk()

Rikard Falkeborn (1):
  md: Constify attribute_group structs

Yu Kuai (1):
  md/raid10: fix improper BUG_ON() in raise_barrier()

zhangyue (1):
  md: fix double free of mddev->private in autorun_array()


-- 
2.39.2
 
https://gitee.com/openeuler/kernel/issues/I63WZE
https://gitee.com/openeuler/kernel/issues/I81XCK,
https://gitee.com/openeuler/kernel/issues/I81XCK 
 
Link:https://gitee.com/openeuler/kernel/pulls/3756

 

Reviewed-by: default avatarYu Kuai <yukuai3@huawei.com>
Reviewed-by: default avatarJialin Zhang <zhangjialin11@huawei.com>
Signed-off-by: default avatarJialin Zhang <zhangjialin11@huawei.com>
parents 350d4b3a 6d01bb59
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -2637,7 +2637,7 @@ static struct attribute *md_bitmap_attrs[] = {
	&max_backlog_used.attr,
	NULL
};
struct attribute_group md_bitmap_group = {
const struct attribute_group md_bitmap_group = {
	.name = "bitmap",
	.attrs = md_bitmap_attrs,
};
+63 −45
Original line number Diff line number Diff line
@@ -686,7 +686,6 @@ static void md_safemode_timeout(struct timer_list *t);

void mddev_init(struct mddev *mddev)
{
	kobject_init(&mddev->kobj, &md_ktype);
	mutex_init(&mddev->open_mutex);
	mutex_init(&mddev->reconfig_mutex);
	mutex_init(&mddev->bitmap_info.mutex);
@@ -801,7 +800,16 @@ static struct mddev *mddev_alloc(dev_t unit)
	return ERR_PTR(error);
}

static struct attribute_group md_redundancy_group;
static void mddev_free(struct mddev *mddev)
{
	spin_lock(&all_mddevs_lock);
	list_del(&mddev->all_mddevs);
	spin_unlock(&all_mddevs_lock);

	kfree(mddev);
}

static const struct attribute_group md_redundancy_group;

void mddev_unlock(struct mddev *mddev)
{
@@ -818,7 +826,7 @@ void mddev_unlock(struct mddev *mddev)
		 * test it under the same mutex to ensure its correct value
		 * is seen.
		 */
		struct attribute_group *to_remove = mddev->to_remove;
		const struct attribute_group *to_remove = mddev->to_remove;
		mddev->to_remove = NULL;
		mddev->sysfs_active = 1;
		mutex_unlock(&mddev->reconfig_mutex);
@@ -5588,6 +5596,10 @@ static struct attribute *md_default_attrs[] = {
	NULL,
};

static const struct attribute_group md_default_group = {
	.attrs = md_default_attrs,
};

static struct attribute *md_redundancy_attrs[] = {
	&md_scan_mode.attr,
	&md_last_scan_mode.attr,
@@ -5605,11 +5617,17 @@ static struct attribute *md_redundancy_attrs[] = {
	&md_degraded.attr,
	NULL,
};
static struct attribute_group md_redundancy_group = {
static const struct attribute_group md_redundancy_group = {
	.name = NULL,
	.attrs = md_redundancy_attrs,
};

static const struct attribute_group *md_attr_groups[] = {
	&md_default_group,
	&md_bitmap_group,
	NULL,
};

static ssize_t
md_attr_show(struct kobject *kobj, struct attribute *attr, char *page)
{
@@ -5665,12 +5683,9 @@ static void md_free(struct kobject *ko)
	if (mddev->sysfs_level)
		sysfs_put(mddev->sysfs_level);

	if (mddev->gendisk)
	del_gendisk(mddev->gendisk);
	if (mddev->queue)
		blk_cleanup_queue(mddev->queue);
	if (mddev->gendisk)
		put_disk(mddev->gendisk);
	blk_cleanup_disk(mddev->gendisk);

	percpu_ref_exit(&mddev->writes_pending);

	bioset_exit(&mddev->bio_set);
@@ -5686,7 +5701,7 @@ static const struct sysfs_ops md_sysfs_ops = {
static struct kobj_type md_ktype = {
	.release	= md_free,
	.sysfs_ops	= &md_sysfs_ops,
	.default_attrs	= md_default_attrs,
	.default_groups	= md_attr_groups,
};

int mdp_major = 0;
@@ -5695,8 +5710,6 @@ static void mddev_delayed_delete(struct work_struct *ws)
{
	struct mddev *mddev = container_of(ws, struct mddev, del_work);

	sysfs_remove_group(&mddev->kobj, &md_bitmap_group);
	kobject_del(&mddev->kobj);
	kobject_put(&mddev->kobj);
}

@@ -5744,8 +5757,8 @@ static int md_alloc(dev_t dev, char *name)
	mutex_lock(&disks_mutex);
	mddev = mddev_alloc(dev);
	if (IS_ERR(mddev)) {
		mutex_unlock(&disks_mutex);
		return PTR_ERR(mddev);
		error = PTR_ERR(mddev);
		goto out_unlock;
	}

	partitioned = (MAJOR(mddev->unit) != MD_MAJOR);
@@ -5763,7 +5776,7 @@ static int md_alloc(dev_t dev, char *name)
			    strcmp(mddev2->gendisk->disk_name, name) == 0) {
				spin_unlock(&all_mddevs_lock);
				error = -EEXIST;
				goto abort;
				goto out_free_mddev;
			}
		spin_unlock(&all_mddevs_lock);
	}
@@ -5774,20 +5787,13 @@ static int md_alloc(dev_t dev, char *name)
		mddev->hold_active = UNTIL_STOP;

	error = -ENOMEM;
	mddev->queue = blk_alloc_queue(NUMA_NO_NODE);
	if (!mddev->queue)
		goto abort;
	disk = blk_alloc_disk(NUMA_NO_NODE);
	if (!disk)
		goto out_free_mddev;

	blk_set_stacking_limits(&mddev->queue->limits);

	disk = alloc_disk(1 << shift);
	if (!disk) {
		blk_cleanup_queue(mddev->queue);
		mddev->queue = NULL;
		goto abort;
	}
	disk->major = MAJOR(mddev->unit);
	disk->first_minor = unit << shift;
	disk->minors = 1 << shift;
	if (name)
		strcpy(disk->disk_name, name);
	else if (partitioned)
@@ -5796,7 +5802,9 @@ static int md_alloc(dev_t dev, char *name)
		sprintf(disk->disk_name, "md%d", unit);
	disk->fops = &md_fops;
	disk->private_data = mddev;
	disk->queue = mddev->queue;

	mddev->queue = disk->queue;
	blk_set_stacking_limits(&mddev->queue->limits);
	blk_queue_write_cache(mddev->queue, true, true);
	/* Allow extended partitions.  This makes the
	 * 'mdp' device redundant, but we can't really
@@ -5805,29 +5813,38 @@ static int md_alloc(dev_t dev, char *name)
	disk->flags |= GENHD_FL_EXT_DEVT;
	disk->events |= DISK_EVENT_MEDIA_CHANGE;
	mddev->gendisk = disk;
	add_disk(disk);
	error = add_disk_safe(disk);
	if (error)
		goto out_put_disk;

	kobject_init(&mddev->kobj, &md_ktype);
	error = kobject_add(&mddev->kobj, &disk_to_dev(disk)->kobj, "%s", "md");
	if (error) {
		/* This isn't possible, but as kobject_init_and_add is marked
		 * __must_check, we must do something with the result
		/*
		 * The disk is already live at this point.  Clear the hold flag
		 * and let mddev_put take care of the deletion, as it isn't any
		 * different from a normal close on last release now.
		 */
		pr_debug("md: cannot register %s/md - name in use\n",
			 disk->disk_name);
		error = 0;
		mddev->hold_active = 0;
		goto done;
	}
	if (mddev->kobj.sd &&
	    sysfs_create_group(&mddev->kobj, &md_bitmap_group))
		pr_debug("pointless warning\n");
 abort:
	mutex_unlock(&disks_mutex);
	if (!error && mddev->kobj.sd) {

	kobject_uevent(&mddev->kobj, KOBJ_ADD);
	mddev->sysfs_state = sysfs_get_dirent_safe(mddev->kobj.sd, "array_state");
	mddev->sysfs_level = sysfs_get_dirent_safe(mddev->kobj.sd, "level");
	}

done:
	mutex_unlock(&disks_mutex);
	mddev_put(mddev);
	return error;

out_put_disk:
	blk_cleanup_disk(disk);
out_free_mddev:
	mddev_free(mddev);
out_unlock:
	mutex_unlock(&disks_mutex);
	return error;
}

static struct kobject *md_probe(dev_t dev, int *part, void *data)
@@ -6363,6 +6380,7 @@ static void __md_stop(struct mddev *mddev)
	spin_lock(&mddev->lock);
	mddev->pers = NULL;
	spin_unlock(&mddev->lock);
	if (mddev->private)
		pers->free(mddev, mddev->private);
	mddev->private = NULL;
	if (pers->sync_request && mddev->to_remove == NULL)
@@ -9655,7 +9673,7 @@ static int md_notify_reboot(struct notifier_block *this,
	 * driver, we do want to have a safe RAID driver ...
	 */
	if (need_delay)
		mdelay(1000*1);
		msleep(1000);

	return NOTIFY_DONE;
}
+2 −2
Original line number Diff line number Diff line
@@ -500,7 +500,7 @@ struct mddev {
	atomic_t			max_corr_read_errors; /* max read retries */
	struct list_head		all_mddevs;

	struct attribute_group		*to_remove;
	const struct attribute_group	*to_remove;

	struct bio_set			bio_set;
	struct bio_set			sync_set; /* for sync operations like
@@ -637,7 +637,7 @@ struct md_sysfs_entry {
	ssize_t (*show)(struct mddev *, char *);
	ssize_t (*store)(struct mddev *, const char *, size_t);
};
extern struct attribute_group md_bitmap_group;
extern const struct attribute_group md_bitmap_group;

static inline struct kernfs_node *sysfs_get_dirent_safe(struct kernfs_node *sd, char *name)
{
+1 −1
Original line number Diff line number Diff line
@@ -941,8 +941,8 @@ static void flush_pending_writes(struct r10conf *conf)

static void raise_barrier(struct r10conf *conf, int force)
{
	BUG_ON(force && !conf->barrier);
	spin_lock_irq(&conf->resync_lock);
	BUG_ON(force && !conf->barrier);

	/* Wait until no block IO is waiting (unless 'force') */
	wait_event_lock_irq(conf->wait_barrier, force || !conf->nr_waiting,
+1 −1
Original line number Diff line number Diff line
@@ -6950,7 +6950,7 @@ static struct attribute *raid5_attrs[] = {
	&ppl_write_hint.attr,
	NULL,
};
static struct attribute_group raid5_attrs_group = {
static const struct attribute_group raid5_attrs_group = {
	.name = NULL,
	.attrs = raid5_attrs,
};