diff options
author | Mikulas Patocka <mpatocka@redhat.com> | 2019-10-02 06:14:17 -0400 |
---|---|---|
committer | Mike Snitzer <snitzer@redhat.com> | 2019-10-10 09:45:48 -0400 |
commit | a2f83e8b0c82c9500421a26c49eb198b25fcdea3 (patch) | |
tree | ff79e8472252dbd823a0bf9e86e336a7da63af1f | |
parent | 0a005856d35936e351cc20ff3de04499bd7ffbfd (diff) |
dm snapshot: introduce account_start_copy() and account_end_copy()
This simple refactoring moves code for modifying the semaphore cow_count
into separate functions to prepare for changes that will extend these
methods to provide for a more sophisticated mechanism for COW
throttling.
Signed-off-by: Mikulas Patocka <mpatocka@redhat.com>
Reviewed-by: Nikos Tsironis <ntsironis@arrikto.com>
Signed-off-by: Mike Snitzer <snitzer@redhat.com>
-rw-r--r-- | drivers/md/dm-snap.c | 20 |
1 files changed, 15 insertions, 5 deletions
diff --git a/drivers/md/dm-snap.c b/drivers/md/dm-snap.c index f150f5c5492b..da3bd1794ee0 100644 --- a/drivers/md/dm-snap.c +++ b/drivers/md/dm-snap.c | |||
@@ -1512,6 +1512,16 @@ static void snapshot_dtr(struct dm_target *ti) | |||
1512 | kfree(s); | 1512 | kfree(s); |
1513 | } | 1513 | } |
1514 | 1514 | ||
1515 | static void account_start_copy(struct dm_snapshot *s) | ||
1516 | { | ||
1517 | down(&s->cow_count); | ||
1518 | } | ||
1519 | |||
1520 | static void account_end_copy(struct dm_snapshot *s) | ||
1521 | { | ||
1522 | up(&s->cow_count); | ||
1523 | } | ||
1524 | |||
1515 | /* | 1525 | /* |
1516 | * Flush a list of buffers. | 1526 | * Flush a list of buffers. |
1517 | */ | 1527 | */ |
@@ -1732,7 +1742,7 @@ static void copy_callback(int read_err, unsigned long write_err, void *context) | |||
1732 | rb_link_node(&pe->out_of_order_node, parent, p); | 1742 | rb_link_node(&pe->out_of_order_node, parent, p); |
1733 | rb_insert_color(&pe->out_of_order_node, &s->out_of_order_tree); | 1743 | rb_insert_color(&pe->out_of_order_node, &s->out_of_order_tree); |
1734 | } | 1744 | } |
1735 | up(&s->cow_count); | 1745 | account_end_copy(s); |
1736 | } | 1746 | } |
1737 | 1747 | ||
1738 | /* | 1748 | /* |
@@ -1756,7 +1766,7 @@ static void start_copy(struct dm_snap_pending_exception *pe) | |||
1756 | dest.count = src.count; | 1766 | dest.count = src.count; |
1757 | 1767 | ||
1758 | /* Hand over to kcopyd */ | 1768 | /* Hand over to kcopyd */ |
1759 | down(&s->cow_count); | 1769 | account_start_copy(s); |
1760 | dm_kcopyd_copy(s->kcopyd_client, &src, 1, &dest, 0, copy_callback, pe); | 1770 | dm_kcopyd_copy(s->kcopyd_client, &src, 1, &dest, 0, copy_callback, pe); |
1761 | } | 1771 | } |
1762 | 1772 | ||
@@ -1776,7 +1786,7 @@ static void start_full_bio(struct dm_snap_pending_exception *pe, | |||
1776 | pe->full_bio = bio; | 1786 | pe->full_bio = bio; |
1777 | pe->full_bio_end_io = bio->bi_end_io; | 1787 | pe->full_bio_end_io = bio->bi_end_io; |
1778 | 1788 | ||
1779 | down(&s->cow_count); | 1789 | account_start_copy(s); |
1780 | callback_data = dm_kcopyd_prepare_callback(s->kcopyd_client, | 1790 | callback_data = dm_kcopyd_prepare_callback(s->kcopyd_client, |
1781 | copy_callback, pe); | 1791 | copy_callback, pe); |
1782 | 1792 | ||
@@ -1866,7 +1876,7 @@ static void zero_callback(int read_err, unsigned long write_err, void *context) | |||
1866 | struct bio *bio = context; | 1876 | struct bio *bio = context; |
1867 | struct dm_snapshot *s = bio->bi_private; | 1877 | struct dm_snapshot *s = bio->bi_private; |
1868 | 1878 | ||
1869 | up(&s->cow_count); | 1879 | account_end_copy(s); |
1870 | bio->bi_status = write_err ? BLK_STS_IOERR : 0; | 1880 | bio->bi_status = write_err ? BLK_STS_IOERR : 0; |
1871 | bio_endio(bio); | 1881 | bio_endio(bio); |
1872 | } | 1882 | } |
@@ -1880,7 +1890,7 @@ static void zero_exception(struct dm_snapshot *s, struct dm_exception *e, | |||
1880 | dest.sector = bio->bi_iter.bi_sector; | 1890 | dest.sector = bio->bi_iter.bi_sector; |
1881 | dest.count = s->store->chunk_size; | 1891 | dest.count = s->store->chunk_size; |
1882 | 1892 | ||
1883 | down(&s->cow_count); | 1893 | account_start_copy(s); |
1884 | WARN_ON_ONCE(bio->bi_private); | 1894 | WARN_ON_ONCE(bio->bi_private); |
1885 | bio->bi_private = s; | 1895 | bio->bi_private = s; |
1886 | dm_kcopyd_zero(s->kcopyd_client, 1, &dest, 0, zero_callback, bio); | 1896 | dm_kcopyd_zero(s->kcopyd_client, 1, &dest, 0, zero_callback, bio); |