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

!1699 dm bugfixes backport from mainline

Merge Pull Request from: @LiuYongQiang0816 
 
6 patches from lilingfeng and linan 
 
Link:https://gitee.com/openeuler/kernel/pulls/1699

 

Reviewed-by: default avatarZhang Changzhong <zhangchangzhong@huawei.com>
Signed-off-by: default avatarZhang Changzhong <zhangchangzhong@huawei.com>
parents 9be0f922 363e0fcd
Loading
Loading
Loading
Loading
+2 −4
Original line number Diff line number Diff line
@@ -755,11 +755,9 @@ static blk_status_t dm_mq_queue_rq(struct blk_mq_hw_ctx *hctx,
		struct dm_table *map;

		map = dm_get_live_table(md, &srcu_idx);
		if (!map) {
			DMERR_LIMIT("%s: mapping table unavailable, erroring io",
				    dm_device_name(md));
		if (unlikely(!map)) {
			dm_put_live_table(md, srcu_idx);
			return BLK_STS_IOERR;
			return BLK_STS_RESOURCE;
		}
		ti = dm_table_find_target(map, 0);
		dm_put_live_table(md, srcu_idx);
+22 −12
Original line number Diff line number Diff line
@@ -1711,13 +1711,15 @@ int dm_thin_remove_range(struct dm_thin_device *td,

int dm_pool_block_is_shared(struct dm_pool_metadata *pmd, dm_block_t b, bool *result)
{
	int r;
	int r = -EINVAL;
	uint32_t ref_count;

	down_read(&pmd->root_lock);
	if (!pmd->fail_io) {
		r = dm_sm_get_count(pmd->data_sm, b, &ref_count);
		if (!r)
			*result = (ref_count > 1);
	}
	up_read(&pmd->root_lock);

	return r;
@@ -1728,11 +1730,15 @@ int dm_pool_inc_data_range(struct dm_pool_metadata *pmd, dm_block_t b, dm_block_
	int r = 0;

	down_write(&pmd->root_lock);
	if (!pmd->fail_io) {
		for (; b != e; b++) {
			r = dm_sm_inc_block(pmd->data_sm, b);
			if (r)
				break;
		}
	} else {
		r = -EINVAL;
	}
	up_write(&pmd->root_lock);

	return r;
@@ -1743,11 +1749,15 @@ int dm_pool_dec_data_range(struct dm_pool_metadata *pmd, dm_block_t b, dm_block_
	int r = 0;

	down_write(&pmd->root_lock);
	if (!pmd->fail_io) {
		for (; b != e; b++) {
			r = dm_sm_dec_block(pmd->data_sm, b);
			if (r)
				break;
		}
	} else {
		r = -EINVAL;
	}
	up_write(&pmd->root_lock);

	return r;
+7 −2
Original line number Diff line number Diff line
@@ -1781,8 +1781,9 @@ static blk_qc_t dm_make_request(struct request_queue *q, struct bio *bio)

	map = dm_get_live_table(md, &srcu_idx);

	/* if we're suspended, we have to queue this io for later */
	if (unlikely(test_bit(DMF_BLOCK_IO_FOR_SUSPEND, &md->flags))) {
	/* If suspended, or map not yet available, queue this IO for later */
	if (unlikely(test_bit(DMF_BLOCK_IO_FOR_SUSPEND, &md->flags)) ||
	    unlikely(!map)) {
		dm_put_live_table(md, srcu_idx);

		if (!(bio->bi_opf & REQ_RAHEAD))
@@ -2746,6 +2747,10 @@ int dm_suspend(struct mapped_device *md, unsigned suspend_flags)
	}

	map = rcu_dereference_protected(md->map, lockdep_is_held(&md->suspend_lock));
	if (!map) {
		/* avoid deadlock with fs/namespace.c:do_mount() */
		suspend_flags &= ~DM_SUSPEND_LOCKFS_FLAG;
	}

	r = __dm_suspend(md, map, suspend_flags, TASK_INTERRUPTIBLE, DMF_SUSPENDED);
	if (r)
+1 −0
Original line number Diff line number Diff line
@@ -5462,6 +5462,7 @@ static int md_alloc(dev_t dev, char *name)
	 * completely removed (mddev_delayed_delete).
	 */
	flush_workqueue(md_misc_wq);
	flush_workqueue(md_rdev_misc_wq);

	mutex_lock(&disks_mutex);
	error = -EEXIST;