nbd/client: refactor nbd_read_eof
Refactor nbd_read_eof to return 1 on success, 0 on eof, when no data was read and <0 for other cases, because returned size of read data is not actually used. Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com> Message-Id: <20170804151440.320927-3-vsementsov@virtuozzo.com> [eblake: tweak function comments, rebase to test 083 enhancements] Signed-off-by: Eric Blake <eblake@redhat.com>
This commit is contained in:
		
							parent
							
								
									a0acf3a8f7
								
							
						
					
					
						commit
						ab01df1fe2
					
				| 
						 | 
				
			
			@ -925,11 +925,6 @@ ssize_t nbd_receive_reply(QIOChannel *ioc, NBDReply *reply, Error **errp)
 | 
			
		|||
        return ret;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (ret != sizeof(buf)) {
 | 
			
		||||
        error_setg(errp, "read failed");
 | 
			
		||||
        return -EINVAL;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* Reply
 | 
			
		||||
       [ 0 ..  3]    magic   (NBD_REPLY_MAGIC)
 | 
			
		||||
       [ 4 ..  7]    error   (0 == no error)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -77,21 +77,36 @@
 | 
			
		|||
#define NBD_ESHUTDOWN  108
 | 
			
		||||
 | 
			
		||||
/* nbd_read_eof
 | 
			
		||||
 * Tries to read @size bytes from @ioc. Returns number of bytes actually read.
 | 
			
		||||
 * May return a value >= 0 and < size only on EOF, i.e. when iteratively called
 | 
			
		||||
 * qio_channel_readv() returns 0. So, there is no need to call nbd_read_eof
 | 
			
		||||
 * iteratively.
 | 
			
		||||
 * Tries to read @size bytes from @ioc.
 | 
			
		||||
 * Returns 1 on success
 | 
			
		||||
 *         0 on eof, when no data was read (errp is not set)
 | 
			
		||||
 *         negative errno on failure (errp is set)
 | 
			
		||||
 */
 | 
			
		||||
static inline ssize_t nbd_read_eof(QIOChannel *ioc, void *buffer, size_t size,
 | 
			
		||||
                                   Error **errp)
 | 
			
		||||
static inline int nbd_read_eof(QIOChannel *ioc, void *buffer, size_t size,
 | 
			
		||||
                               Error **errp)
 | 
			
		||||
{
 | 
			
		||||
    struct iovec iov = { .iov_base = buffer, .iov_len = size };
 | 
			
		||||
    ssize_t ret;
 | 
			
		||||
 | 
			
		||||
    /* Sockets are kept in blocking mode in the negotiation phase.  After
 | 
			
		||||
     * that, a non-readable socket simply means that another thread stole
 | 
			
		||||
     * our request/reply.  Synchronization is done with recv_coroutine, so
 | 
			
		||||
     * that this is coroutine-safe.
 | 
			
		||||
     */
 | 
			
		||||
    return nbd_rwv(ioc, &iov, 1, size, true, errp);
 | 
			
		||||
 | 
			
		||||
    assert(size);
 | 
			
		||||
 | 
			
		||||
    ret = nbd_rwv(ioc, &iov, 1, size, true, errp);
 | 
			
		||||
    if (ret <= 0) {
 | 
			
		||||
        return ret;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (ret != size) {
 | 
			
		||||
        error_setg(errp, "End of file");
 | 
			
		||||
        return -EINVAL;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* nbd_read
 | 
			
		||||
| 
						 | 
				
			
			@ -100,9 +115,9 @@ static inline ssize_t nbd_read_eof(QIOChannel *ioc, void *buffer, size_t size,
 | 
			
		|||
static inline int nbd_read(QIOChannel *ioc, void *buffer, size_t size,
 | 
			
		||||
                           Error **errp)
 | 
			
		||||
{
 | 
			
		||||
    ssize_t ret = nbd_read_eof(ioc, buffer, size, errp);
 | 
			
		||||
    int ret = nbd_read_eof(ioc, buffer, size, errp);
 | 
			
		||||
 | 
			
		||||
    if (ret >= 0 && ret != size) {
 | 
			
		||||
    if (ret == 0) {
 | 
			
		||||
        ret = -EINVAL;
 | 
			
		||||
        error_setg(errp, "End of file");
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -69,12 +69,12 @@ read failed: Input/output error
 | 
			
		|||
 | 
			
		||||
=== Check disconnect 4 reply ===
 | 
			
		||||
 | 
			
		||||
read failed
 | 
			
		||||
End of file
 | 
			
		||||
read failed: Input/output error
 | 
			
		||||
 | 
			
		||||
=== Check disconnect 8 reply ===
 | 
			
		||||
 | 
			
		||||
read failed
 | 
			
		||||
End of file
 | 
			
		||||
read failed: Input/output error
 | 
			
		||||
 | 
			
		||||
=== Check disconnect before data ===
 | 
			
		||||
| 
						 | 
				
			
			@ -180,12 +180,12 @@ read failed: Input/output error
 | 
			
		|||
 | 
			
		||||
=== Check disconnect 4 reply ===
 | 
			
		||||
 | 
			
		||||
read failed
 | 
			
		||||
End of file
 | 
			
		||||
read failed: Input/output error
 | 
			
		||||
 | 
			
		||||
=== Check disconnect 8 reply ===
 | 
			
		||||
 | 
			
		||||
read failed
 | 
			
		||||
End of file
 | 
			
		||||
read failed: Input/output error
 | 
			
		||||
 | 
			
		||||
=== Check disconnect before data ===
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue