nbd: fixes to read-only handling
We do not need BLKROSET if the kernel supports setting flags. Also, always do BLKROSET even for a read-write export, otherwise the read-only state remains "sticky" after the invocation of "qemu-nbd -r". Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
		
							parent
							
								
									4057725f35
								
							
						
					
					
						commit
						c8969eded2
					
				
							
								
								
									
										23
									
								
								nbd.c
								
								
								
								
							
							
						
						
									
										23
									
								
								nbd.c
								
								
								
								
							| 
						 | 
				
			
			@ -596,24 +596,23 @@ int nbd_init(int fd, int csock, uint32_t flags, off_t size, size_t blocksize)
 | 
			
		|||
        return -serrno;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (flags & NBD_FLAG_READ_ONLY) {
 | 
			
		||||
        int read_only = 1;
 | 
			
		||||
        TRACE("Setting readonly attribute");
 | 
			
		||||
    if (ioctl(fd, NBD_SET_FLAGS, flags) < 0) {
 | 
			
		||||
        if (errno == ENOTTY) {
 | 
			
		||||
            int read_only = (flags & NBD_FLAG_READ_ONLY) != 0;
 | 
			
		||||
            TRACE("Setting readonly attribute");
 | 
			
		||||
 | 
			
		||||
        if (ioctl(fd, BLKROSET, (unsigned long) &read_only) < 0) {
 | 
			
		||||
            if (ioctl(fd, BLKROSET, (unsigned long) &read_only) < 0) {
 | 
			
		||||
                int serrno = errno;
 | 
			
		||||
                LOG("Failed setting read-only attribute");
 | 
			
		||||
                return -serrno;
 | 
			
		||||
            }
 | 
			
		||||
        } else {
 | 
			
		||||
            int serrno = errno;
 | 
			
		||||
            LOG("Failed setting read-only attribute");
 | 
			
		||||
            LOG("Failed setting flags");
 | 
			
		||||
            return -serrno;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (ioctl(fd, NBD_SET_FLAGS, flags) < 0
 | 
			
		||||
        && errno != ENOTTY) {
 | 
			
		||||
        int serrno = errno;
 | 
			
		||||
        LOG("Failed setting flags");
 | 
			
		||||
        return -serrno;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    TRACE("Negotiation ended");
 | 
			
		||||
 | 
			
		||||
    return 0;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue