Am 23.03.2016 um 18:58 hat Wouter Verhelst geschrieben: > On Wed, Mar 23, 2016 at 05:16:02PM +0300, Denis V. Lunev wrote: > > + The type of information required by the client is passed to server in the > > + command flags field. If the server does not implement requested type or > > + have no means to express it, it MUST NOT return an error, but instead MUST > > + return a single LBA status descriptor with *offset* and *length* equal to > > + the *offset* and *length* from request, and *status* set to `0`. > > + > > + The following request types are currently defined for the command: > > + > > + 1. Block provisioning state > > + > > + Upon receiving an `NBD_CMD_GET_LBA_STATUS` command with command flags > > + field set to `NBD_FLAG_GET_ALLOCATED` (0x0), the server MUST return > > I prefer to have a non-zero flag value. > > > + the provisioning state of the device. The following provisionnig states > > + are defined for the command: > > + > > + - `NBD_STATE_ALLOCATED` (0x0), LBA extent is present on the block device; > > + - `NBD_STATE_ZEROED` (0x1), LBA extent is present on the block device > > + and contains zeroes; > > Presumably this should be "contains only zeroes"? > > Also, this may end up being a fairly expensive call for the server to > process. Is it really useful? I think we need to make clear that this is meant as an optimisation and it's always a valid option for a server to return NBD_STATE_ALLOCATED even if the contents is zeroed. It is definitely useful if the server has a means to efficiently find out the allocation status (e.g. SEEK_HOLE). In that case the client may be able to avoid reading the block and sending it over the network, or when making a copy, it could use it to keep the target file sparse. If the client can't take advantage, we didn't have much overhead, so it's fine. It's less clear in a case where the server needs to read in the block and scan its contents. It could still be a net win if the next thing the client does is retrieving the block: The server would still have the cost of reading the block, but it wouldn't be transferred. But when the client doesn't follow up with a read, it's quite a bit of overhead that we had for no benefit. Returning NBD_STATE_ALLOCATED might be more appropriate in this case than scanning for zeros. Kevin