mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2024-12-26 11:19:32 +03:00
Support secure discard on zvols
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>
This commit is contained in:
parent
37f9dac592
commit
fa56567630
@ -650,14 +650,19 @@ zvol_discard(struct bio *bio)
|
|||||||
return (SET_ERROR(EIO));
|
return (SET_ERROR(EIO));
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Align the request to volume block boundaries. If we don't,
|
* Align the request to volume block boundaries when REQ_SECURE is
|
||||||
* then this will force dnode_free_range() to zero out the
|
* available, but not requested. If we don't, then this will force
|
||||||
* unaligned parts, which is slow (read-modify-write) and
|
* dnode_free_range() to zero out the unaligned parts, which is slow
|
||||||
* useless since we are not freeing any space by doing so.
|
* (read-modify-write) and useless since we are not freeing any space
|
||||||
* XXX: We should handle secure discard by zeroing out unaligned parts.
|
* 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);
|
#ifdef REQ_SECURE
|
||||||
end = P2ALIGN(end, zv->zv_volblocksize);
|
if (!(bio->bi_rw & REQ_SECURE)) {
|
||||||
|
start = P2ROUNDUP(start, zv->zv_volblocksize);
|
||||||
|
end = P2ALIGN(end, zv->zv_volblocksize);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
if (start >= end)
|
if (start >= end)
|
||||||
return (0);
|
return (0);
|
||||||
|
Loading…
Reference in New Issue
Block a user