• Lars Ellenberg's avatar
    drbd: when receiving P_TRIM, zero-out partial unaligned chunks · dd4f699d
    Lars Ellenberg authored
    We can avoid spurious data divergence caused by partially-ignored
    discards on certain backends with discard_zeroes_data=0, if we
    translate partial unaligned discard requests into explicit zero-out.
    
    The relevant use case is LVM/DM thin.
    
    If on different nodes, DRBD is backed by devices with differing
    discard characteristics, discards may lead to data divergence
    (old data or garbage left over on one backend, zeroes due to
    unmapped areas on the other backend). Online verify would now
    potentially report tons of spurious differences.
    
    While probably harmless for most use cases (fstrim on a file system),
    DRBD cannot have that, it would violate our promise to upper layers
    that our data instances on the nodes are identical.
    
    To be correct and play safe (make sure data is identical on both copies),
    we would have to disable discard support, if our local backend (on a
    Primary) does not support "discard_zeroes_data=true".
    
    We'd also have to translate discards to explicit zero-out on the
    receiving (typically: Secondary) side, unless the receiving side
    supports "discard_zeroes_data=true".
    
    Which both would allocate those blocks, instead of unmapping them,
    in contrast with expectations.
    
    LVM/DM thin does set discard_zeroes_data=0,
    because it silently ignores discards to partial chunks.
    
    We can work around this by checking the alignment first.
    For unaligned (wrt. alignment and granularity) or too small discards,
    we zero-out the initial (and/or) trailing unaligned partial chunks,
    but discard all the aligned full chunks.
    
    At least for LVM/DM thin, the result is effectively "discard_zeroes_data=1".
    
    Arguably it should behave this way internally, by default,
    and we'll try to make that happen.
    
    But our workaround is still valid for already deployed setups,
    and for other devices that may behave this way.
    
    Setting discard-zeroes-if-aligned=yes will allow DRBD to use
    discards, and to announce discard_zeroes_data=true, even on
    backends that announce discard_zeroes_data=false.
    
    Setting discard-zeroes-if-aligned=no will cause DRBD to always
    fall-back to zero-out on the receiving side, and to not even
    announce discard capabilities on the Primary, if the respective
    backend announces discard_zeroes_data=false.
    
    We used to ignore the discard_zeroes_data setting completely.
    To not break established and expected behaviour, and suddenly
    cause fstrim on thin-provisioned LVs to run out-of-space,
    instead of freeing up space, the default value is "yes".
    Signed-off-by: 's avatarPhilipp Reisner <philipp.reisner@linbit.com>
    Signed-off-by: 's avatarLars Ellenberg <lars.ellenberg@linbit.com>
    Signed-off-by: 's avatarJens Axboe <axboe@fb.com>
    dd4f699d
drbd_genl.h 21.4 KB