Skip to content
  • Alex Bligh's avatar
    nbd: support FLUSH requests · 75f187ab
    Alex Bligh authored
    
    
    Currently, the NBD device does not accept flush requests from the Linux
    block layer.  If the NBD server opened the target with neither O_SYNC nor
    O_DSYNC, however, the device will be effectively backed by a writeback
    cache.  Without issuing flushes properly, operation of the NBD device will
    not be safe against power losses.
    
    The NBD protocol has support for both a cache flush command and a FUA
    command flag; the server will also pass a flag to note its support for
    these features.  This patch adds support for the cache flush command and
    flag.  In the kernel, we receive the flags via the NBD_SET_FLAGS ioctl,
    and map NBD_FLAG_SEND_FLUSH to the argument of blk_queue_flush.  When the
    flag is active the block layer will send REQ_FLUSH requests, which we
    translate to NBD_CMD_FLUSH commands.
    
    FUA support is not included in this patch because all free software
    servers implement it with a full fdatasync; thus it has no advantage over
    supporting flush only.  Because I [Paolo] cannot really benchmark it in a
    realistic scenario, I cannot tell if it is a good idea or not.  It is also
    not clear if it is valid for an NBD server to support FUA but not flush.
    The Linux block layer gives a warning for this combination, the NBD
    protocol documentation says nothing about it.
    
    The patch also fixes a small problem in the handling of flags: nbd->flags
    must be cleared at the end of NBD_DO_IT, but the driver was not doing
    that.  The bug manifests itself as follows.  Suppose you two different
    client/server pairs to start the NBD device.  Suppose also that the first
    client supports NBD_SET_FLAGS, and the first server sends
    NBD_FLAG_SEND_FLUSH; the second pair instead does neither of these two
    things.  Before this patch, the second invocation of NBD_DO_IT will use a
    stale value of nbd->flags, and the second server will issue an error every
    time it receives an NBD_CMD_FLUSH command.
    
    This bug is pre-existing, but it becomes much more important after this
    patch; flush failures make the device pretty much unusable, unlike
    
    Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
    Signed-off-by: default avatarAlex Bligh <alex@alex.org.uk>
    Acked-by: default avatarPaul Clements <Paul.Clements@steeleye.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    75f187ab