在 12/4/2025 7:38 AM, Dongsheng Yang 写道:
在 12/3/2025 1:56 PM, Dongsheng Yang 写道:
Hi,
Thanx for your patches, there are some comments inline.
According to these comments, I propose an update base on your patch
as [1].
BTW, I added a test case for this problem in dtg-tests:
https://github.com/DataTravelGuide/dtg-tests/blob/main/pcache.py.data/pcache_misc_tests/case21_gc_percent_persistence_after_recreate.sh
It update gc_percent online and recreate pcache device and check
gc_percen
[1]:
->info_index means next slot to write, so advancing it at init stage
is correct
We need to think more thoroughly about the usage of the slot index. In
my original design, all slot indices represent the “current slot”. So at
initialization it is 0; if loading, we simply point it to the loaded
slot; and on write we advance afterwards. However, the problem now is
that in all write functions, they first write to the current slot, then
advance.
Therefore I believe we should clarify that the meaning of the slot index
is “the current slot,” and stick to the original design. We only need to
modify the write functions: first perform the advance, and then write
into the correct slot.
Thanx
diff --git a/drivers/md/dm-pcache/cache.c b/drivers/md/dm-pcache/cache.c
index 6d5001548628..4d6db733c9bd 100644
--- a/drivers/md/dm-pcache/cache.c
+++ b/drivers/md/dm-pcache/cache.c
@@ -42,12 +42,7 @@ static int cache_info_init(struct pcache_cache
*cache, struct pcache_cache_optio
if (IS_ERR(cache_info_addr))
return PTR_ERR(cache_info_addr);
- if (cache_info_addr) {
- int index = ((char *)cache_info_addr - (char
*)cache->cache_info_addr) /
- PCACHE_CACHE_INFO_SIZE;
-
- cache->info_index = (index + 1) % PCACHE_META_INDEX_MAX;
-
+ if (cache_info_addr) {
if (opts->data_crc !=
(cache->cache_info.flags &
PCACHE_CACHE_FLAGS_DATA_CRC)) {
pcache_dev_err(pcache, "invalid option for
data_crc: %s, expected: %s",
@@ -56,6 +51,8 @@ static int cache_info_init(struct pcache_cache
*cache, struct pcache_cache_optio
return -EINVAL;
}
+ cache->info_index = ((char *)cache_info_addr - (char
*)cache->cache_info_addr) / PCACHE_CACHE_INFO_SIZE;
+
return 0;
}
diff --git a/drivers/md/dm-pcache/cache_segment.c
b/drivers/md/dm-pcache/cache_segment.c
index 0b4bb08011ce..0a0016702ce7 100644
--- a/drivers/md/dm-pcache/cache_segment.c
+++ b/drivers/md/dm-pcache/cache_segment.c
@@ -60,7 +60,6 @@ static int cache_seg_info_load(struct
pcache_cache_segment *cache_seg)
cache_seg->info_index =
((char *)cache_seg_info_addr - (char
*)cache_seg_info_addr_base) /
PCACHE_SEG_INFO_SIZE;
- cache_seg->info_index = (cache_seg->info_index + 1) %
PCACHE_META_INDEX_MAX;
out:
mutex_unlock(&cache_seg->info_lock);
在 12/2/2025 8:11 PM, Li Chen 写道:
From: Li Chen <[email protected]>
dm-pcache stores metadata (cache_info and segment_info) in 4K-aligned
slots on the cache device, using sequence numbers and CRC to identify
the latest valid copy.
However, the cache_info and segment_info paths were computing their
on-media index using sizeof(struct) instead of the 4K metadata stride.
As a result:
* cache_info updates (including gc_percent set via a dmsetup
message)
were written to invalid offsets between metadata slots and failed
to persist across table reloads or reboots.
* segment_info indexing became desynchronized, so rotation to the
"next" slot no longer matched the location returned by
pcache_meta_find_latest().
The issue can be reproduced with:
dmsetup create pcache_vdb --table \
"0 $(blockdev --getsz /dev/vdb) pcache /dev/pmem0 /dev/vdb 4 \
cache_mode writeback data_crc false"
# Check default gc_percent (70)
dmsetup status pcache_vdb
# Change gc_percent to 10
dmsetup message pcache_vdb 0 "gc_percent 10"
# Verify change is active in memory
dmsetup status pcache_vdb
# Reboot the system...
# Without patch (gc_percent reverts to 70):
dmsetup status pcache_vdb
# With patch (gc_percent persists as 10):
dmsetup status pcache_vdb
This series fixes the issue by deriving the metadata slot index from
the pointer returned by pcache_meta_find_latest(), using the 4K stride
(CACHE_INFO_SIZE / SEG_INFO_SIZE). This ensures that updates to
cache_info and segment_info are written to valid slots and remain
consistent with the on-media layout.
Li Chen (2):
dm pcache: fix cache info indexing
dm pcache: fix segment info indexing
drivers/md/dm-pcache/cache.c | 13 ++++++++++---
drivers/md/dm-pcache/cache_segment.c | 6 +++++-
2 files changed, 15 insertions(+), 4 deletions(-)