* [dm-devel] [PATCH] dm-writecache: allow the underlying device to be shrunk
@ 2021-02-09 15:56 Mikulas Patocka
2021-02-09 21:51 ` [dm-devel] " Mike Snitzer
0 siblings, 1 reply; 2+ messages in thread
From: Mikulas Patocka @ 2021-02-09 15:56 UTC (permalink / raw)
To: Zdenek Kabelac, David Teigland, Mike Snitzer; +Cc: dm-devel
Allow shrinking the underlying data device (dm-writecache must be
suspended when the device is shrunk).
This patch modifies dm-writecache, so that it doesn't attempt to write any
data beyond the end of the data device.
Signed-off-by: Mikulas Patocka <mpatocka@redhat.com>
Cc: stable@vger.kernel.org
---
drivers/md/dm-writecache.c | 18 ++++++++++++++++++
1 file changed, 18 insertions(+)
Index: linux-2.6/drivers/md/dm-writecache.c
===================================================================
--- linux-2.6.orig/drivers/md/dm-writecache.c 2021-02-05 20:30:35.000000000 +0100
+++ linux-2.6/drivers/md/dm-writecache.c 2021-02-09 16:50:36.000000000 +0100
@@ -148,6 +148,7 @@ struct dm_writecache {
size_t metadata_sectors;
size_t n_blocks;
uint64_t seq_count;
+ uint64_t data_device_sectors;
void *block_start;
struct wc_entry *entries;
unsigned block_size;
@@ -969,6 +970,8 @@ static void writecache_resume(struct dm_
wc_lock(wc);
+ wc->data_device_sectors = i_size_read(wc->dev->bdev->bd_inode) >> SECTOR_SHIFT;
+
if (WC_MODE_PMEM(wc)) {
persistent_memory_invalidate_cache(wc->memory_map, wc->memory_map_size);
} else {
@@ -1638,6 +1641,10 @@ static bool wc_add_block(struct writebac
void *address = memory_data(wc, e);
persistent_memory_flush_cache(address, block_size);
+
+ if (unlikely(wb->bio.bi_iter.bi_sector + bio_sectors(&wb->bio) >= wc->data_device_sectors))
+ return true;
+
return bio_add_page(&wb->bio, persistent_memory_page(address),
block_size, persistent_memory_page_offset(address)) != 0;
}
@@ -1709,6 +1716,9 @@ static void __writecache_writeback_pmem(
if (writecache_has_error(wc)) {
bio->bi_status = BLK_STS_IOERR;
bio_endio(bio);
+ } else if (unlikely(!bio_sectors(bio))) {
+ bio->bi_status = BLK_STS_OK;
+ bio_endio(bio);
} else {
submit_bio(bio);
}
@@ -1752,6 +1762,14 @@ static void __writecache_writeback_ssd(s
e = f;
}
+ if (unlikely(to.sector + to.count > wc->data_device_sectors)) {
+ if (to.sector >= wc->data_device_sectors) {
+ writecache_copy_endio(0, 0, c);
+ continue;
+ }
+ from.count = to.count = wc->data_device_sectors - to.sector;
+ }
+
dm_kcopyd_copy(wc->dm_kcopyd, &from, 1, &to, 0, writecache_copy_endio, c);
__writeback_throttle(wc, wbl);
--
dm-devel mailing list
dm-devel@redhat.com
https://www.redhat.com/mailman/listinfo/dm-devel
^ permalink raw reply [flat|nested] 2+ messages in thread
* Re: [dm-devel] dm-writecache: allow the underlying device to be shrunk
2021-02-09 15:56 [dm-devel] [PATCH] dm-writecache: allow the underlying device to be shrunk Mikulas Patocka
@ 2021-02-09 21:51 ` Mike Snitzer
0 siblings, 0 replies; 2+ messages in thread
From: Mike Snitzer @ 2021-02-09 21:51 UTC (permalink / raw)
To: Mikulas Patocka; +Cc: dm-devel, David Teigland, Zdenek Kabelac
On Tue, Feb 09 2021 at 10:56am -0500,
Mikulas Patocka <mpatocka@redhat.com> wrote:
> Allow shrinking the underlying data device (dm-writecache must be
> suspended when the device is shrunk).
>
> This patch modifies dm-writecache, so that it doesn't attempt to write any
> data beyond the end of the data device.
>
> Signed-off-by: Mikulas Patocka <mpatocka@redhat.com>
> Cc: stable@vger.kernel.org
>
> ---
> drivers/md/dm-writecache.c | 18 ++++++++++++++++++
> 1 file changed, 18 insertions(+)
>
> Index: linux-2.6/drivers/md/dm-writecache.c
> ===================================================================
> --- linux-2.6.orig/drivers/md/dm-writecache.c 2021-02-05 20:30:35.000000000 +0100
> +++ linux-2.6/drivers/md/dm-writecache.c 2021-02-09 16:50:36.000000000 +0100
> @@ -148,6 +148,7 @@ struct dm_writecache {
> size_t metadata_sectors;
> size_t n_blocks;
> uint64_t seq_count;
> + uint64_t data_device_sectors;
> void *block_start;
> struct wc_entry *entries;
> unsigned block_size;
> @@ -969,6 +970,8 @@ static void writecache_resume(struct dm_
>
> wc_lock(wc);
>
> + wc->data_device_sectors = i_size_read(wc->dev->bdev->bd_inode) >> SECTOR_SHIFT;
> +
I switched it to using bdev_nr_sectors() (and sector_t instead of uint64_t) instead.
> if (WC_MODE_PMEM(wc)) {
> persistent_memory_invalidate_cache(wc->memory_map, wc->memory_map_size);
> } else {
> @@ -1638,6 +1641,10 @@ static bool wc_add_block(struct writebac
> void *address = memory_data(wc, e);
>
> persistent_memory_flush_cache(address, block_size);
> +
> + if (unlikely(wb->bio.bi_iter.bi_sector + bio_sectors(&wb->bio) >= wc->data_device_sectors))
> + return true;
> +
I updated it to use bio_end_sector()
Otherwise looks good.
diff --git a/drivers/md/dm-writecache.c b/drivers/md/dm-writecache.c
index d9c0d41e29f3..844c4be11768 100644
--- a/drivers/md/dm-writecache.c
+++ b/drivers/md/dm-writecache.c
@@ -148,7 +148,7 @@ struct dm_writecache {
size_t metadata_sectors;
size_t n_blocks;
uint64_t seq_count;
- uint64_t data_device_sectors;
+ sector_t data_device_sectors;
void *block_start;
struct wc_entry *entries;
unsigned block_size;
@@ -978,7 +978,7 @@ static void writecache_resume(struct dm_target *ti)
wc_lock(wc);
- wc->data_device_sectors = i_size_read(wc->dev->bdev->bd_inode) >> SECTOR_SHIFT;
+ wc->data_device_sectors = bdev_nr_sectors(wc->dev->bdev);
if (WC_MODE_PMEM(wc)) {
persistent_memory_invalidate_cache(wc->memory_map, wc->memory_map_size);
@@ -1650,7 +1650,7 @@ static bool wc_add_block(struct writeback_struct *wb, struct wc_entry *e, gfp_t
persistent_memory_flush_cache(address, block_size);
- if (unlikely(wb->bio.bi_iter.bi_sector + bio_sectors(&wb->bio) >= wc->data_device_sectors))
+ if (unlikely(bio_end_sector(&wb->bio) >= wc->data_device_sectors))
return true;
return bio_add_page(&wb->bio, persistent_memory_page(address),
BUT, it should be noted bdev_nr_sectors is pretty recent, introduced
with commit a782483cc1f8 ("block: remove the nr_sects field in struct
hd_struct"). SO using bdev_nr_sectors creates problems with stable@...
given that I'll revert back to open-coding it in the tsable@ patch and
then apply a quick change to use bdev_nr_sectors().
Mike
--
dm-devel mailing list
dm-devel@redhat.com
https://www.redhat.com/mailman/listinfo/dm-devel
^ permalink raw reply related [flat|nested] 2+ messages in thread
end of thread, other threads:[~2021-02-09 21:52 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-02-09 15:56 [dm-devel] [PATCH] dm-writecache: allow the underlying device to be shrunk Mikulas Patocka
2021-02-09 21:51 ` [dm-devel] " Mike Snitzer
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).