.. | .. |
---|
| 1 | +// SPDX-License-Identifier: GPL-2.0-only |
---|
1 | 2 | #include "dm.h" |
---|
2 | 3 | #include "persistent-data/dm-transaction-manager.h" |
---|
3 | 4 | #include "persistent-data/dm-bitset.h" |
---|
.. | .. |
---|
1151 | 1152 | |
---|
1152 | 1153 | struct era { |
---|
1153 | 1154 | struct dm_target *ti; |
---|
1154 | | - struct dm_target_callbacks callbacks; |
---|
1155 | 1155 | |
---|
1156 | 1156 | struct dm_dev *metadata_dev; |
---|
1157 | 1157 | struct dm_dev *origin_dev; |
---|
.. | .. |
---|
1289 | 1289 | */ |
---|
1290 | 1290 | if (commit_needed) |
---|
1291 | 1291 | set_bit(get_block(era, bio), ws->bits); |
---|
1292 | | - generic_make_request(bio); |
---|
| 1292 | + submit_bio_noacct(bio); |
---|
1293 | 1293 | } |
---|
1294 | 1294 | blk_finish_plug(&plug); |
---|
1295 | 1295 | } |
---|
.. | .. |
---|
1396 | 1396 | static void stop_worker(struct era *era) |
---|
1397 | 1397 | { |
---|
1398 | 1398 | atomic_set(&era->suspended, 1); |
---|
1399 | | - flush_workqueue(era->wq); |
---|
| 1399 | + drain_workqueue(era->wq); |
---|
1400 | 1400 | } |
---|
1401 | 1401 | |
---|
1402 | 1402 | /*---------------------------------------------------------------- |
---|
1403 | 1403 | * Target methods |
---|
1404 | 1404 | *--------------------------------------------------------------*/ |
---|
1405 | | -static int dev_is_congested(struct dm_dev *dev, int bdi_bits) |
---|
1406 | | -{ |
---|
1407 | | - struct request_queue *q = bdev_get_queue(dev->bdev); |
---|
1408 | | - return bdi_congested(q->backing_dev_info, bdi_bits); |
---|
1409 | | -} |
---|
1410 | | - |
---|
1411 | | -static int era_is_congested(struct dm_target_callbacks *cb, int bdi_bits) |
---|
1412 | | -{ |
---|
1413 | | - struct era *era = container_of(cb, struct era, callbacks); |
---|
1414 | | - return dev_is_congested(era->origin_dev, bdi_bits); |
---|
1415 | | -} |
---|
1416 | | - |
---|
1417 | 1405 | static void era_destroy(struct era *era) |
---|
1418 | 1406 | { |
---|
1419 | 1407 | if (era->md) |
---|
.. | .. |
---|
1532 | 1520 | ti->flush_supported = true; |
---|
1533 | 1521 | |
---|
1534 | 1522 | ti->num_discard_bios = 1; |
---|
1535 | | - era->callbacks.congested_fn = era_is_congested; |
---|
1536 | | - dm_table_add_target_callbacks(ti->table, &era->callbacks); |
---|
1537 | 1523 | |
---|
1538 | 1524 | return 0; |
---|
1539 | 1525 | } |
---|
.. | .. |
---|
1580 | 1566 | } |
---|
1581 | 1567 | |
---|
1582 | 1568 | stop_worker(era); |
---|
| 1569 | + |
---|
| 1570 | + r = metadata_commit(era->md); |
---|
| 1571 | + if (r) { |
---|
| 1572 | + DMERR("%s: metadata_commit failed", __func__); |
---|
| 1573 | + /* FIXME: fail mode */ |
---|
| 1574 | + } |
---|
1583 | 1575 | } |
---|
1584 | 1576 | |
---|
1585 | 1577 | static int era_preresume(struct dm_target *ti) |
---|