Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge tag 'for-4.18/dm-fixes-2' of git://git.kernel.org/pub/scm/linux/kernel/git/device-mapper/linux-dm

Pull device mapper fix from Mike Snitzer:
"Fix DM writecache target to allow an optional offset to the start of
the data and metadata area.

This allows userspace tools (e.g. LVM2) to place a header and metadata
at the front of the writecache device for its use"

* tag 'for-4.18/dm-fixes-2' of git://git.kernel.org/pub/scm/linux/kernel/git/device-mapper/linux-dm:
dm writecache: support optional offset for start of device

+31 -14
+2
Documentation/device-mapper/writecache.txt
··· 15 15 size) 16 16 5. the number of optional parameters (the parameters with an argument 17 17 count as two) 18 + start_sector n (default: 0) 19 + offset from the start of cache device in 512-byte sectors 18 20 high_watermark n (default: 50) 19 21 start writeback when the number of used blocks reach this 20 22 watermark
+29 -14
drivers/md/dm-writecache.c
··· 136 136 struct dm_target *ti; 137 137 struct dm_dev *dev; 138 138 struct dm_dev *ssd_dev; 139 + sector_t start_sector; 139 140 void *memory_map; 140 141 uint64_t memory_map_size; 141 142 size_t metadata_sectors; ··· 294 293 } 295 294 296 295 dax_read_unlock(id); 296 + 297 + wc->memory_map += (size_t)wc->start_sector << SECTOR_SHIFT; 298 + wc->memory_map_size -= (size_t)wc->start_sector << SECTOR_SHIFT; 299 + 297 300 return 0; 298 301 err3: 299 302 kvfree(pages); ··· 316 311 static void persistent_memory_release(struct dm_writecache *wc) 317 312 { 318 313 if (wc->memory_vmapped) 319 - vunmap(wc->memory_map); 314 + vunmap(wc->memory_map - ((size_t)wc->start_sector << SECTOR_SHIFT)); 320 315 } 321 316 322 317 static struct page *persistent_memory_page(void *addr) ··· 364 359 365 360 static sector_t cache_sector(struct dm_writecache *wc, struct wc_entry *e) 366 361 { 367 - return wc->metadata_sectors + 362 + return wc->start_sector + wc->metadata_sectors + 368 363 ((sector_t)e->index << (wc->block_size_bits - SECTOR_SHIFT)); 369 364 } 370 365 ··· 476 471 if (unlikely(region.sector + region.count > wc->metadata_sectors)) 477 472 region.count = wc->metadata_sectors - region.sector; 478 473 474 + region.sector += wc->start_sector; 479 475 atomic_inc(&endio.count); 480 476 req.bi_op = REQ_OP_WRITE; 481 477 req.bi_op_flags = REQ_SYNC; ··· 1952 1946 } 1953 1947 wc->memory_map_size = i_size_read(wc->ssd_dev->bdev->bd_inode); 1954 1948 1955 - if (WC_MODE_PMEM(wc)) { 1956 - r = persistent_memory_claim(wc); 1957 - if (r) { 1958 - ti->error = "Unable to map persistent memory for cache"; 1959 - goto bad; 1960 - } 1961 - } 1962 - 1963 1949 /* 1964 1950 * Parse the cache block size 1965 1951 */ ··· 1980 1982 1981 1983 while (opt_params) { 1982 1984 string = dm_shift_arg(&as), opt_params--; 1983 - if (!strcasecmp(string, "high_watermark") && opt_params >= 1) { 1985 + if (!strcasecmp(string, "start_sector") && opt_params >= 1) { 1986 + unsigned long long start_sector; 1987 + string = dm_shift_arg(&as), opt_params--; 1988 + if (sscanf(string, "%llu%c", &start_sector, &dummy) != 1) 1989 + goto invalid_optional; 1990 + wc->start_sector = start_sector; 1991 + if (wc->start_sector != start_sector || 1992 + wc->start_sector >= wc->memory_map_size >> SECTOR_SHIFT) 1993 + goto invalid_optional; 1994 + } else if (!strcasecmp(string, "high_watermark") && opt_params >= 1) { 1984 1995 string = dm_shift_arg(&as), opt_params--; 1985 1996 if (sscanf(string, "%d%c", &high_wm_percent, &dummy) != 1) 1986 1997 goto invalid_optional; ··· 2046 2039 goto bad; 2047 2040 } 2048 2041 2049 - if (!WC_MODE_PMEM(wc)) { 2042 + if (WC_MODE_PMEM(wc)) { 2043 + r = persistent_memory_claim(wc); 2044 + if (r) { 2045 + ti->error = "Unable to map persistent memory for cache"; 2046 + goto bad; 2047 + } 2048 + } else { 2050 2049 struct dm_io_region region; 2051 2050 struct dm_io_request req; 2052 2051 size_t n_blocks, n_metadata_blocks; 2053 2052 uint64_t n_bitmap_bits; 2053 + 2054 + wc->memory_map_size -= (uint64_t)wc->start_sector << SECTOR_SHIFT; 2054 2055 2055 2056 bio_list_init(&wc->flush_list); 2056 2057 wc->flush_thread = kthread_create(writecache_flush_thread, wc, "dm_writecache_flush"); ··· 2112 2097 } 2113 2098 2114 2099 region.bdev = wc->ssd_dev->bdev; 2115 - region.sector = 0; 2100 + region.sector = wc->start_sector; 2116 2101 region.count = wc->metadata_sectors; 2117 2102 req.bi_op = REQ_OP_READ; 2118 2103 req.bi_op_flags = REQ_SYNC; ··· 2280 2265 2281 2266 static struct target_type writecache_target = { 2282 2267 .name = "writecache", 2283 - .version = {1, 0, 0}, 2268 + .version = {1, 1, 0}, 2284 2269 .module = THIS_MODULE, 2285 2270 .ctr = writecache_ctr, 2286 2271 .dtr = writecache_dtr,