Skip to content

Commit

Permalink
Support secure discard on zvols
Browse files Browse the repository at this point in the history
Linux 2.6.36 introduced REQ_SECURE to indicate when discards *must* be
processed, such that we cannot do optimizations like block alignment.
Consequently, the discard semantics prior to 2.6.36 require us to always
process unaligned discards. Previously, we would do this optimization
regardless. This patch changes things to correctly restrict this
optimization to situations where REQ_SECURE exists, but is not included
in the flags.

Signed-off-by: Richard Yao <ryao@gentoo.org>
  • Loading branch information
ryao committed Sep 4, 2015
1 parent 37f9dac commit fa56567
Showing 1 changed file with 12 additions and 7 deletions.
19 changes: 12 additions & 7 deletions module/zfs/zvol.c
Original file line number Diff line number Diff line change
Expand Up @@ -650,14 +650,19 @@ zvol_discard(struct bio *bio)
return (SET_ERROR(EIO));

/*
* Align the request to volume block boundaries. If we don't,
* then this will force dnode_free_range() to zero out the
* unaligned parts, which is slow (read-modify-write) and
* useless since we are not freeing any space by doing so.
* XXX: We should handle secure discard by zeroing out unaligned parts.
* Align the request to volume block boundaries when REQ_SECURE is
* available, but not requested. If we don't, then this will force
* dnode_free_range() to zero out the unaligned parts, which is slow
* (read-modify-write) and useless since we are not freeing any space
* by doing so. Kernels that do not support REQ_SECURE (2.6.32 through
* 2.6.35) will not receive this optimization.
*/
start = P2ROUNDUP(start, zv->zv_volblocksize);
end = P2ALIGN(end, zv->zv_volblocksize);
#ifdef REQ_SECURE
if (!(bio->bi_rw & REQ_SECURE)) {
start = P2ROUNDUP(start, zv->zv_volblocksize);
end = P2ALIGN(end, zv->zv_volblocksize);
}
#endif

if (start >= end)
return (0);
Expand Down

0 comments on commit fa56567

Please sign in to comment.