mirror of
https://github.com/torvalds/linux.git
synced 2026-06-10 07:32:29 +02:00
dm thin: do not send discards to shared blocks
commit650d2a06b4upstream. When process_discard receives a partial discard that doesn't cover a full block, it sends this discard down to that block. Unfortunately, the block can be shared and the discard would corrupt the other snapshots sharing this block. This patch detects block sharing and ends the discard with success when sending it to the shared block. The above change means that if the device supports discard it can't be guaranteed that a discard request zeroes data. Therefore, we set ti->discard_zeroes_data_unsupported. Thin target discard support with this bug arrived in commit104655fd4d(dm thin: support discards). Signed-off-by: Mikulas Patocka <mpatocka@redhat.com> Signed-off-by: Mike Snitzer <snitzer@redhat.com> Signed-off-by: Alasdair G Kergon <agk@redhat.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
08603bdd6b
commit
5b8bbc39d5
|
|
@ -1240,7 +1240,10 @@ static void process_discard(struct thin_c *tc, struct bio *bio)
|
|||
|
||||
cell_release_singleton(cell, bio);
|
||||
cell_release_singleton(cell2, bio);
|
||||
remap_and_issue(tc, bio, lookup_result.block);
|
||||
if ((!lookup_result.shared) && pool->pf.discard_passdown)
|
||||
remap_and_issue(tc, bio, lookup_result.block);
|
||||
else
|
||||
bio_endio(bio, 0);
|
||||
}
|
||||
break;
|
||||
|
||||
|
|
@ -2575,6 +2578,7 @@ static int thin_ctr(struct dm_target *ti, unsigned argc, char **argv)
|
|||
if (tc->pool->pf.discard_enabled) {
|
||||
ti->discards_supported = 1;
|
||||
ti->num_discard_requests = 1;
|
||||
ti->discard_zeroes_data_unsupported = 1;
|
||||
}
|
||||
|
||||
dm_put(pool_md);
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user