Skip to content

Commit 2a2a4c5

Browse files
committed
dm: use bioset_init_from_src() to copy bio_set
We can't just copy and clear a bio_set, use the bio helper to setup a new bio_set with the settings from another one. Fixes: 6f1c819 ("dm: convert to bioset_init()/mempool_init()") Reported-by: Venkat R.B <[email protected]> Tested-by: Venkat R.B <[email protected]> Tested-by: Li Wang <[email protected]> Reviewed-by: Mike Snitzer <[email protected]> Signed-off-by: Jens Axboe <[email protected]>
1 parent 28e89fd commit 2a2a4c5

File tree

1 file changed

+16
-6
lines changed

1 file changed

+16
-6
lines changed

drivers/md/dm.c

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1953,9 +1953,10 @@ static void free_dev(struct mapped_device *md)
19531953
kvfree(md);
19541954
}
19551955

1956-
static void __bind_mempools(struct mapped_device *md, struct dm_table *t)
1956+
static int __bind_mempools(struct mapped_device *md, struct dm_table *t)
19571957
{
19581958
struct dm_md_mempools *p = dm_table_get_md_mempools(t);
1959+
int ret = 0;
19591960

19601961
if (dm_table_bio_based(t)) {
19611962
/*
@@ -1982,13 +1983,16 @@ static void __bind_mempools(struct mapped_device *md, struct dm_table *t)
19821983
bioset_initialized(&md->bs) ||
19831984
bioset_initialized(&md->io_bs));
19841985

1985-
md->bs = p->bs;
1986-
memset(&p->bs, 0, sizeof(p->bs));
1987-
md->io_bs = p->io_bs;
1988-
memset(&p->io_bs, 0, sizeof(p->io_bs));
1986+
ret = bioset_init_from_src(&md->bs, &p->bs);
1987+
if (ret)
1988+
goto out;
1989+
ret = bioset_init_from_src(&md->io_bs, &p->io_bs);
1990+
if (ret)
1991+
bioset_exit(&md->bs);
19891992
out:
19901993
/* mempool bind completed, no longer need any mempools in the table */
19911994
dm_table_free_md_mempools(t);
1995+
return ret;
19921996
}
19931997

19941998
/*
@@ -2033,6 +2037,7 @@ static struct dm_table *__bind(struct mapped_device *md, struct dm_table *t,
20332037
struct request_queue *q = md->queue;
20342038
bool request_based = dm_table_request_based(t);
20352039
sector_t size;
2040+
int ret;
20362041

20372042
lockdep_assert_held(&md->suspend_lock);
20382043

@@ -2068,7 +2073,11 @@ static struct dm_table *__bind(struct mapped_device *md, struct dm_table *t,
20682073
md->immutable_target = dm_table_get_immutable_target(t);
20692074
}
20702075

2071-
__bind_mempools(md, t);
2076+
ret = __bind_mempools(md, t);
2077+
if (ret) {
2078+
old_map = ERR_PTR(ret);
2079+
goto out;
2080+
}
20722081

20732082
old_map = rcu_dereference_protected(md->map, lockdep_is_held(&md->suspend_lock));
20742083
rcu_assign_pointer(md->map, (void *)t);
@@ -2078,6 +2087,7 @@ static struct dm_table *__bind(struct mapped_device *md, struct dm_table *t,
20782087
if (old_map)
20792088
dm_sync_table(md);
20802089

2090+
out:
20812091
return old_map;
20822092
}
20832093

0 commit comments

Comments
 (0)