
On 04/05/2011 05:10 AM, Daniel P. Berrange wrote:
The SCSI volumes get a better 'key' field based on the fully qualified volume path. All SCSI volumes have a unique serial available in hardware which can be obtained by sending a suitable SCSI command. Call out to udev's 'scsi_id' command to fetch this value
In v3:
- Use virCommandSetOutputBuffer/virCommandRun instead of VIR_FDOPEN - Skip serial if it matches empty string
* src/storage/storage_backend_scsi.c: Improve volume key field value stability and uniqueness --- src/storage/storage_backend_scsi.c | 45 ++++++++++++++++++++++++++++++++--- 1 files changed, 41 insertions(+), 4 deletions(-)
+#ifdef HAVE_UDEV + virCommandPtr cmd = virCommandNewArgList( + "/lib/udev/scsi_id", + "--replace-whitespace", + "--whitelisted", + "--device", dev, + NULL + ); + + /* Run the program and capture its output */ + virCommandSetOutputBuffer(cmd, &serial); + if (virCommandRun(cmd, NULL) < 0) + goto cleanup; +#endif + + if (serial && STRNEQ(serial, "")) { + char *nl = strchr(serial, '\n'); + if (nl) + *nl = '\0'; + } else { + VIR_FREE(serial); + if (!(serial = strdup(dev))) + virReportOOMError(); + } + +#ifdef HAVE_UDEV +cleanup: + virCommandFree(cmd); +#endif
It seems a bit weird to have two #ifdef sections; but I don't see any easy way to consolidate them and still properly return failure on a failed virCommandRun. ACK. -- Eric Blake eblake@redhat.com +1-801-349-2682 Libvirt virtualization library http://libvirt.org