hc
2024-02-20 102a0743326a03cd1a1202ceda21e175b7d3575c
kernel/drivers/md/dm-log-writes.c
....@@ -40,7 +40,7 @@
4040 *
4141 * Would result in the log looking like this:
4242 *
43
- * c,a,flush,fuad,b,<other writes>,<next flush>
43
+ * c,a,b,flush,fuad,<other writes>,<next flush>
4444 *
4545 * This is meant to help expose problems where file systems do not properly wait
4646 * on data being written before invoking a FLUSH. FUA bypasses cache so once it
....@@ -127,7 +127,7 @@
127127 char *data;
128128 u32 datalen;
129129 struct list_head list;
130
- struct bio_vec vecs[0];
130
+ struct bio_vec vecs[];
131131 };
132132
133133 struct per_bio_data {
....@@ -699,7 +699,7 @@
699699 if (discard_bio)
700700 alloc_size = sizeof(struct pending_block);
701701 else
702
- alloc_size = sizeof(struct pending_block) + sizeof(struct bio_vec) * bio_segments(bio);
702
+ alloc_size = struct_size(block, vecs, bio_segments(bio));
703703
704704 block = kzalloc(alloc_size, GFP_NOIO);
705705 if (!block) {
....@@ -994,10 +994,26 @@
994994 return dax_copy_to_iter(lc->dev->dax_dev, pgoff, addr, bytes, i);
995995 }
996996
997
+static int log_writes_dax_zero_page_range(struct dm_target *ti, pgoff_t pgoff,
998
+ size_t nr_pages)
999
+{
1000
+ int ret;
1001
+ struct log_writes_c *lc = ti->private;
1002
+ sector_t sector = pgoff * PAGE_SECTORS;
1003
+
1004
+ ret = bdev_dax_pgoff(lc->dev->bdev, sector, nr_pages << PAGE_SHIFT,
1005
+ &pgoff);
1006
+ if (ret)
1007
+ return ret;
1008
+ return dax_zero_page_range(lc->dev->dax_dev, pgoff,
1009
+ nr_pages << PAGE_SHIFT);
1010
+}
1011
+
9971012 #else
9981013 #define log_writes_dax_direct_access NULL
9991014 #define log_writes_dax_copy_from_iter NULL
10001015 #define log_writes_dax_copy_to_iter NULL
1016
+#define log_writes_dax_zero_page_range NULL
10011017 #endif
10021018
10031019 static struct target_type log_writes_target = {
....@@ -1016,6 +1032,7 @@
10161032 .direct_access = log_writes_dax_direct_access,
10171033 .dax_copy_from_iter = log_writes_dax_copy_from_iter,
10181034 .dax_copy_to_iter = log_writes_dax_copy_to_iter,
1035
+ .dax_zero_page_range = log_writes_dax_zero_page_range,
10191036 };
10201037
10211038 static int __init dm_log_writes_init(void)