Skip to content

Commit

Permalink
dm snapshot: fix oversights in optional discard support
Browse files Browse the repository at this point in the history
__find_snapshots_sharing_cow() should always be used with _origins_lock
held so fix snapshot_io_hints() accordingly.  Also, once a snapshot is
being merged discards must not be allowed -- otherwise incorrect or
duplicate work will be performed.

Fixes: 2e60238 ("dm snapshot: add optional discard support features")
Reported-by: Nikos Tsironis <[email protected]>
Signed-off-by: Mike Snitzer <[email protected]>
  • Loading branch information
snitm committed Jul 17, 2019
1 parent 3b8cafd commit 3ee2548
Showing 1 changed file with 10 additions and 0 deletions.
10 changes: 10 additions & 0 deletions drivers/md/dm-snap.c
Original file line number Diff line number Diff line change
Expand Up @@ -2072,6 +2072,12 @@ static int snapshot_merge_map(struct dm_target *ti, struct bio *bio)
return DM_MAPIO_REMAPPED;
}

if (unlikely(bio_op(bio) == REQ_OP_DISCARD)) {
/* Once merging, discards no longer effect change */
bio_endio(bio);
return DM_MAPIO_SUBMITTED;
}

chunk = sector_to_chunk(s->store, bio->bi_iter.bi_sector);

down_write(&s->lock);
Expand Down Expand Up @@ -2331,13 +2337,17 @@ static void snapshot_io_hints(struct dm_target *ti, struct queue_limits *limits)
if (snap->discard_zeroes_cow) {
struct dm_snapshot *snap_src = NULL, *snap_dest = NULL;

down_read(&_origins_lock);

(void) __find_snapshots_sharing_cow(snap, &snap_src, &snap_dest, NULL);
if (snap_src && snap_dest)
snap = snap_src;

/* All discards are split on chunk_size boundary */
limits->discard_granularity = snap->store->chunk_size;
limits->max_discard_sectors = snap->store->chunk_size;

up_read(&_origins_lock);
}
}

Expand Down

0 comments on commit 3ee2548

Please sign in to comment.