[Libvir] Record an error when refusing a read-only operation
Daniel P. Berrange
berrange at redhat.com
Wed Aug 16 14:30:30 UTC 2006
The libvirt.c front-end can be compiled in 'pedantic' mode in which case it
explicitly refuses operations with side-effects in read-only connections.
When doing so, however, it was not recording any error message so feedback
to the user was misleading / obsure. This patch adds an extra error code
VIR_ERR_READ_ONLY which is used when an operation is denied due to a read
only connection.
This patch also passes 'VIR_DRV_OPEN_QUIET' to the 'open' method so tell
the XenD driver not complain if it fails to open a HV connection. This is
because it was complaining whenever trying to open a test:///default
connection.
Dan.
--
|=- Red Hat, Engineering, Emerging Technologies, Boston. +1 978 392 2496 -=|
|=- Perl modules: http://search.cpan.org/~danberr/ -=|
|=- Projects: http://freshmeat.net/~danielpb/ -=|
|=- GnuPG: 7D3B9505 F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 -=|
-------------- next part --------------
Index: src/libvirt.c
===================================================================
RCS file: /data/cvs/libvirt/src/libvirt.c,v
retrieving revision 1.42
diff -c -r1.42 libvirt.c
*** src/libvirt.c 11 Aug 2006 14:40:04 -0000 1.42
--- src/libvirt.c 16 Aug 2006 15:17:43 -0000
***************
*** 240,246 ****
for (i = 0;i < MAX_DRIVERS;i++) {
if ((virDriverTab[i] != NULL) && (virDriverTab[i]->open != NULL)) {
! res = virDriverTab[i]->open(ret, name, 0);
/*
* For a default connect to Xen make sure we manage to contact
* all related drivers.
--- 240,246 ----
for (i = 0;i < MAX_DRIVERS;i++) {
if ((virDriverTab[i] != NULL) && (virDriverTab[i]->open != NULL)) {
! res = virDriverTab[i]->open(ret, name, VIR_DRV_OPEN_QUIET);
/*
* For a default connect to Xen make sure we manage to contact
* all related drivers.
***************
*** 730,737 ****
conn = domain->conn;
#if PEDANTIC
! if (domain->conn->flags & VIR_CONNECT_RO)
return (-1);
#endif
/*
--- 730,739 ----
conn = domain->conn;
#if PEDANTIC
! if (domain->conn->flags & VIR_CONNECT_RO) {
! virLibDomainError(domain, VIR_ERR_READ_ONLY, __FUNCTION__);
return (-1);
+ }
#endif
/*
***************
*** 805,812 ****
conn = domain->conn;
#if PEDANTIC
! if (domain->conn->flags & VIR_CONNECT_RO)
return (-1);
#endif
/*
--- 807,816 ----
conn = domain->conn;
#if PEDANTIC
! if (domain->conn->flags & VIR_CONNECT_RO) {
! virLibDomainError(domain, VIR_ERR_READ_ONLY, __FUNCTION__);
return (-1);
+ }
#endif
/*
***************
*** 857,864 ****
conn = domain->conn;
#if PEDANTIC
! if (domain->conn->flags & VIR_CONNECT_RO)
return (-1);
#endif
/*
--- 861,870 ----
conn = domain->conn;
#if PEDANTIC
! if (domain->conn->flags & VIR_CONNECT_RO) {
! virLibDomainError(domain, VIR_ERR_READ_ONLY, __FUNCTION__);
return (-1);
+ }
#endif
/*
***************
*** 1030,1037 ****
conn = domain->conn;
#if PEDANTIC
! if (domain->conn->flags & VIR_CONNECT_RO)
return (-1);
#endif
/* Go though the driver registered entry points */
--- 1036,1045 ----
conn = domain->conn;
#if PEDANTIC
! if (domain->conn->flags & VIR_CONNECT_RO) {
! virLibDomainError(domain, VIR_ERR_READ_ONLY, __FUNCTION__);
return (-1);
+ }
#endif
/* Go though the driver registered entry points */
***************
*** 1075,1082 ****
conn = domain->conn;
#if PEDANTIC
! if (domain->conn->flags & VIR_CONNECT_RO)
return (-1);
#endif
/* Go though the driver registered entry points */
--- 1083,1092 ----
conn = domain->conn;
#if PEDANTIC
! if (domain->conn->flags & VIR_CONNECT_RO) {
! virLibDomainError(domain, VIR_ERR_READ_ONLY, __FUNCTION__);
return (-1);
+ }
#endif
/* Go though the driver registered entry points */
***************
*** 1168,1174 ****
virDomainGetUUIDString(virDomainPtr domain, char *buf)
{
unsigned char uuid[16];
!
if (!VIR_IS_DOMAIN(domain)) {
virLibDomainError(domain, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
return (-1);
--- 1178,1184 ----
virDomainGetUUIDString(virDomainPtr domain, char *buf)
{
unsigned char uuid[16];
!
if (!VIR_IS_DOMAIN(domain)) {
virLibDomainError(domain, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
return (-1);
***************
*** 1309,1316 ****
return (-1);
}
conn = domain->conn;
! if (domain->conn->flags & VIR_CONNECT_RO)
return (-1);
/*
* in that case instead of trying only though one method try all availble.
--- 1319,1330 ----
return (-1);
}
conn = domain->conn;
! #if PEDANTIC
! if (domain->conn->flags & VIR_CONNECT_RO) {
! virLibDomainError(domain, VIR_ERR_READ_ONLY, __FUNCTION__);
return (-1);
+ }
+ #endif
/*
* in that case instead of trying only though one method try all availble.
***************
*** 1361,1368 ****
return (-1);
}
conn = domain->conn;
! if (domain->conn->flags & VIR_CONNECT_RO)
return (-1);
/*
* in that case instead of trying only though one method try all availble.
--- 1375,1386 ----
return (-1);
}
conn = domain->conn;
! #if PEDANTIC
! if (domain->conn->flags & VIR_CONNECT_RO) {
! virLibDomainError(domain, VIR_ERR_READ_ONLY, __FUNCTION__);
return (-1);
+ }
+ #endif
/*
* in that case instead of trying only though one method try all availble.
***************
*** 1682,1689 ****
virLibDomainError(domain, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
return (-1);
}
! if (domain->conn->flags & VIR_CONNECT_RO)
return (-1);
if (nvcpus < 1) {
virLibDomainError(domain, VIR_ERR_INVALID_ARG, __FUNCTION__);
return (-1);
--- 1700,1711 ----
virLibDomainError(domain, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
return (-1);
}
! #if PEDANTIC
! if (domain->conn->flags & VIR_CONNECT_RO) {
! virLibDomainError(domain, VIR_ERR_READ_ONLY, __FUNCTION__);
return (-1);
+ }
+ #endif
if (nvcpus < 1) {
virLibDomainError(domain, VIR_ERR_INVALID_ARG, __FUNCTION__);
return (-1);
***************
*** 1748,1755 ****
virLibDomainError(domain, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
return (-1);
}
! if (domain->conn->flags & VIR_CONNECT_RO)
return (-1);
if ((vcpu > 32000) || (cpumap == NULL) || (maplen < 1)) {
virLibDomainError(domain, VIR_ERR_INVALID_ARG, __FUNCTION__);
return (-1);
--- 1770,1781 ----
virLibDomainError(domain, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
return (-1);
}
! #if PEDANTIC
! if (domain->conn->flags & VIR_CONNECT_RO) {
! virLibDomainError(domain, VIR_ERR_READ_ONLY, __FUNCTION__);
return (-1);
+ }
+ #endif
if ((vcpu > 32000) || (cpumap == NULL) || (maplen < 1)) {
virLibDomainError(domain, VIR_ERR_INVALID_ARG, __FUNCTION__);
return (-1);
Index: src/virterror.c
===================================================================
RCS file: /data/cvs/libvirt/src/virterror.c,v
retrieving revision 1.15
diff -c -r1.15 virterror.c
*** src/virterror.c 28 Jul 2006 15:10:18 -0000 1.15
--- src/virterror.c 16 Aug 2006 15:17:43 -0000
***************
*** 533,538 ****
--- 533,542 ----
else
errmsg = "domain %s exists already";
break;
+ case VIR_ERR_READ_ONLY:
+ errmsg = "the hypervisor connection is readonly";
+ break;
+
}
return (errmsg);
}
Index: include/libvirt/virterror.h
===================================================================
RCS file: /data/cvs/libvirt/include/libvirt/virterror.h,v
retrieving revision 1.14
diff -c -r1.14 virterror.h
*** include/libvirt/virterror.h 28 Jun 2006 18:19:13 -0000 1.14
--- include/libvirt/virterror.h 16 Aug 2006 15:17:43 -0000
***************
*** 105,111 ****
VIR_ERR_DRIVER_FULL, /* too many drivers registered */
VIR_ERR_CALL_FAILED, /* not supported by the drivers */
VIR_ERR_XML_ERROR, /* an XML description is not well formed or broken */
! VIR_ERR_DOM_EXIST /* the domain already exist */
} virErrorNumber;
/**
--- 105,112 ----
VIR_ERR_DRIVER_FULL, /* too many drivers registered */
VIR_ERR_CALL_FAILED, /* not supported by the drivers */
VIR_ERR_XML_ERROR, /* an XML description is not well formed or broken */
! VIR_ERR_DOM_EXIST, /* the domain already exist */
! VIR_ERR_READ_ONLY /* the HV connection is readonly */
} virErrorNumber;
/**
More information about the libvir-list
mailing list