| .. | .. |
|---|
| 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) |
|---|