Revision c8969ede

b/nbd.c
596 596
        return -serrno;
597 597
    }
598 598

  
599
    if (flags & NBD_FLAG_READ_ONLY) {
600
        int read_only = 1;
601
        TRACE("Setting readonly attribute");
602

  
603
        if (ioctl(fd, BLKROSET, (unsigned long) &read_only) < 0) {
599
    if (ioctl(fd, NBD_SET_FLAGS, flags) < 0) {
600
        if (errno == ENOTTY) {
601
            int read_only = (flags & NBD_FLAG_READ_ONLY) != 0;
602
            TRACE("Setting readonly attribute");
603

  
604
            if (ioctl(fd, BLKROSET, (unsigned long) &read_only) < 0) {
605
                int serrno = errno;
606
                LOG("Failed setting read-only attribute");
607
                return -serrno;
608
            }
609
        } else {
604 610
            int serrno = errno;
605
            LOG("Failed setting read-only attribute");
611
            LOG("Failed setting flags");
606 612
            return -serrno;
607 613
        }
608 614
    }
609 615

  
610
    if (ioctl(fd, NBD_SET_FLAGS, flags) < 0
611
        && errno != ENOTTY) {
612
        int serrno = errno;
613
        LOG("Failed setting flags");
614
        return -serrno;
615
    }
616

  
617 616
    TRACE("Negotiation ended");
618 617

  
619 618
    return 0;

Also available in: Unified diff