summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMikulas Patocka <mpatocka@redhat.com>2019-10-02 06:14:17 -0400
committerMike Snitzer <snitzer@redhat.com>2019-10-10 09:45:48 -0400
commita2f83e8b0c82c9500421a26c49eb198b25fcdea3 (patch)
treeff79e8472252dbd823a0bf9e86e336a7da63af1f
parent0a005856d35936e351cc20ff3de04499bd7ffbfd (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.c20
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
1515static void account_start_copy(struct dm_snapshot *s)
1516{
1517 down(&s->cow_count);
1518}
1519
1520static 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);