Thread (59 messages) 59 messages, 9 authors, 2016-09-15

Re: [Nbd] [RESEND][PATCH 0/5] nbd improvements

flat view

From: Alex Bligh <hidden>
Date: 2016-09-15 12:04:47
Also in: lkml

On 15 Sep 2016, at 12:52, Christoph Hellwig [off-list ref] wrote:
=20
On Thu, Sep 15, 2016 at 12:46:07PM +0100, Alex Bligh wrote:
quoted
Essentially NBD does supports FLUSH/FUA like this:
=20
=
https://www.kernel.org/doc/Documentation/block/writeback_cache_control.txt=
quoted
=20
IE supports the same FLUSH/FUA primitives as other block drivers =
(AIUI).
quoted
=20
Link to protocol (per last email) here:
=20
=
https://github.com/yoe/nbd/blob/master/doc/proto.md#ordering-of-messages-a=
nd-writes
=20
Flush as defined by the Linux block layer (and supported that way in
SCSI, ATA, NVMe) only requires to flush all already completed writes
to non-volatile media.  It does not impose any ordering unlike the
nbd spec.
As maintainer of the NBD spec, I'm confused as to why you think it
imposes any ordering - if you think this, clearly I need to clean up
the wording.

Here's what it says:
The server MAY process commands out of order, and MAY reply out of =
order,
except that:
=20
	=E2=80=A2 All write commands (that includes NBD_CMD_WRITE, and =
NBD_CMD_TRIM)
that the server completes (i.e. replies to) prior to processing to a
NBD_CMD_FLUSH MUST be written to non-volatile storage prior to =
replying to that
NBD_CMD_FLUSH. This paragraph only applies if NBD_FLAG_SEND_FLUSH is =
set within
the transmission flags, as otherwise NBD_CMD_FLUSH will never be sent =
by the
client to the server.
(and another bit re FUA that isn't relevant here).

Here's the Linux Kernel documentation:
The REQ_PREFLUSH flag can be OR ed into the r/w flags of a bio =
submitted from
the filesystem and will make sure the volatile cache of the storage =
device
has been flushed before the actual I/O operation is started.  This =
explicitly
guarantees that previously completed write requests are on =
non-volatile
storage before the flagged bio starts. In addition the REQ_PREFLUSH =
flag can be
set on an otherwise empty bio structure, which causes only an explicit =
cache
flush without any dependent I/O.  It is recommend to use
the blkdev_issue_flush() helper for a pure cache flush.

I believe that NBD treats NBD_CMD_FLUSH the same as a REQ_PREFLUSH and =
empty
bio.

If you don't read those two as compatible, I'd like to understand why =
not
(i.e. what additional constraints one is applying that the other is not)
as they are meant to be the same (save that NBD only has FLUSH as a =
command,
i.e. the 'empty bio' version). I am happy to improve the docs to make it
clearer.

(sidenote: I am interested in the change from REQ_FLUSH to REQ_PREFLUSH,
but in an empty bio it's not really relevant I think).
FUA as defined by the Linux block layer (and supported that way in =
SCSI,
ATA, NVMe) only requires the write operation the FUA bit is set on to =
be
on non-volatile media before completing the write operation.  It does
not impose any ordering, which seems to match the nbd spec.  Unlike =
the
NBD spec Linux does not allow FUA to be set on anything by WRITE
commands.  Some other storage protocols allow a FUA bit on READ
commands or other commands that write data to the device, though.
I think you mean "anything *but* WRITE commands". In NBD setting
FUA on a command that does not write will do nothing, but FUA can
be set on NBD_CMD_TRIM and has the expected effect.

Interestingly the kernel docs are silent on which commands REQ_FUA
can be set on.

--=20
Alex Bligh



Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help