未验证 提交 f829a6a3 编写于 作者: O openeuler-ci-bot 提交者: Gitee

!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: Zhang Changzhong <zhangchangzhong@huawei.com> 
Signed-off-by: Zhang Changzhong <zhangchangzhong@huawei.com> 
...@@ -755,11 +755,9 @@ static blk_status_t dm_mq_queue_rq(struct blk_mq_hw_ctx *hctx, ...@@ -755,11 +755,9 @@ static blk_status_t dm_mq_queue_rq(struct blk_mq_hw_ctx *hctx,
struct dm_table *map; struct dm_table *map;
map = dm_get_live_table(md, &srcu_idx); map = dm_get_live_table(md, &srcu_idx);
if (!map) { if (unlikely(!map)) {
DMERR_LIMIT("%s: mapping table unavailable, erroring io",
dm_device_name(md));
dm_put_live_table(md, srcu_idx); dm_put_live_table(md, srcu_idx);
return BLK_STS_IOERR; return BLK_STS_RESOURCE;
} }
ti = dm_table_find_target(map, 0); ti = dm_table_find_target(map, 0);
dm_put_live_table(md, srcu_idx); dm_put_live_table(md, srcu_idx);
......
...@@ -1711,13 +1711,15 @@ int dm_thin_remove_range(struct dm_thin_device *td, ...@@ -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 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; uint32_t ref_count;
down_read(&pmd->root_lock); down_read(&pmd->root_lock);
r = dm_sm_get_count(pmd->data_sm, b, &ref_count); if (!pmd->fail_io) {
if (!r) r = dm_sm_get_count(pmd->data_sm, b, &ref_count);
*result = (ref_count > 1); if (!r)
*result = (ref_count > 1);
}
up_read(&pmd->root_lock); up_read(&pmd->root_lock);
return r; return r;
...@@ -1728,10 +1730,14 @@ int dm_pool_inc_data_range(struct dm_pool_metadata *pmd, dm_block_t b, dm_block_ ...@@ -1728,10 +1730,14 @@ int dm_pool_inc_data_range(struct dm_pool_metadata *pmd, dm_block_t b, dm_block_
int r = 0; int r = 0;
down_write(&pmd->root_lock); down_write(&pmd->root_lock);
for (; b != e; b++) { if (!pmd->fail_io) {
r = dm_sm_inc_block(pmd->data_sm, b); for (; b != e; b++) {
if (r) r = dm_sm_inc_block(pmd->data_sm, b);
break; if (r)
break;
}
} else {
r = -EINVAL;
} }
up_write(&pmd->root_lock); up_write(&pmd->root_lock);
...@@ -1743,10 +1749,14 @@ int dm_pool_dec_data_range(struct dm_pool_metadata *pmd, dm_block_t b, dm_block_ ...@@ -1743,10 +1749,14 @@ int dm_pool_dec_data_range(struct dm_pool_metadata *pmd, dm_block_t b, dm_block_
int r = 0; int r = 0;
down_write(&pmd->root_lock); down_write(&pmd->root_lock);
for (; b != e; b++) { if (!pmd->fail_io) {
r = dm_sm_dec_block(pmd->data_sm, b); for (; b != e; b++) {
if (r) r = dm_sm_dec_block(pmd->data_sm, b);
break; if (r)
break;
}
} else {
r = -EINVAL;
} }
up_write(&pmd->root_lock); up_write(&pmd->root_lock);
......
...@@ -1781,8 +1781,9 @@ static blk_qc_t dm_make_request(struct request_queue *q, struct bio *bio) ...@@ -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); map = dm_get_live_table(md, &srcu_idx);
/* if we're suspended, we have to queue this io for later */ /* If suspended, or map not yet available, queue this IO for later */
if (unlikely(test_bit(DMF_BLOCK_IO_FOR_SUSPEND, &md->flags))) { if (unlikely(test_bit(DMF_BLOCK_IO_FOR_SUSPEND, &md->flags)) ||
unlikely(!map)) {
dm_put_live_table(md, srcu_idx); dm_put_live_table(md, srcu_idx);
if (!(bio->bi_opf & REQ_RAHEAD)) if (!(bio->bi_opf & REQ_RAHEAD))
...@@ -2746,6 +2747,10 @@ int dm_suspend(struct mapped_device *md, unsigned suspend_flags) ...@@ -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)); 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); r = __dm_suspend(md, map, suspend_flags, TASK_INTERRUPTIBLE, DMF_SUSPENDED);
if (r) if (r)
......
...@@ -5462,6 +5462,7 @@ static int md_alloc(dev_t dev, char *name) ...@@ -5462,6 +5462,7 @@ static int md_alloc(dev_t dev, char *name)
* completely removed (mddev_delayed_delete). * completely removed (mddev_delayed_delete).
*/ */
flush_workqueue(md_misc_wq); flush_workqueue(md_misc_wq);
flush_workqueue(md_rdev_misc_wq);
mutex_lock(&disks_mutex); mutex_lock(&disks_mutex);
error = -EEXIST; error = -EEXIST;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册