
On Mon, Feb 04, 2013 at 10:16:44PM +0800, Osier Yang wrote:
Only nodedev-destroy and nodedev-dumpxml can benifit from the new API, other commands like nodedev-detach only works for PCI devices, WWN makes no sense for them.
--- Rebased on Peter's virsh cleanup patches. --- tools/virsh-nodedev.c | 84 +++++++++++++++++++++++++++++++++++++++--------- tools/virsh.pod | 15 +++++--- 2 files changed, 77 insertions(+), 22 deletions(-)
diff --git a/tools/virsh-nodedev.c b/tools/virsh-nodedev.c index f85bded..7c51a56 100644 --- a/tools/virsh-nodedev.c +++ b/tools/virsh-nodedev.c @@ -101,9 +101,14 @@ static const vshCmdInfo info_node_device_destroy[] = {
static const vshCmdOptDef opts_node_device_destroy[] = { {.name = "name", + .type = VSH_OT_ALIAS, + .flags = 0, + .help = "device" + }, + {.name = "device", .type = VSH_OT_DATA, .flags = VSH_OFLAG_REQ, - .help = N_("name of the device to be destroyed") + .help = N_("device name or wwn pair in 'wwnn,wwpn' format") }, {.name = NULL} }; @@ -112,21 +117,47 @@ static bool cmdNodeDeviceDestroy(vshControl *ctl, const vshCmd *cmd) { virNodeDevicePtr dev = NULL; - bool ret = true; - const char *name = NULL; + bool ret = false; + const char *device_value = NULL; + char **arr = NULL; + int narr;
- if (vshCommandOptStringReq(ctl, cmd, "name", &name) < 0) + if (vshCommandOptStringReq(ctl, cmd, "device", &device_value) < 0) return false;
- dev = virNodeDeviceLookupByName(ctl->conn, name); + if (strchr(device_value, ',')) { + narr = vshStringToArray(device_value, &arr); + if (narr != 2) { + vshError(ctl, _("Malformed device value '%s'"), device_value); + goto cleanup; + } + + if (!virValidateWWN(arr[0]) || !virValidateWWN(arr[1])) + goto cleanup; + + dev = virNodeDeviceLookupSCSIHostByWWN(ctl->conn, arr[0], arr[1], 0); + } else { + dev = virNodeDeviceLookupByName(ctl->conn, device_value); + } + + if (!dev) { + vshError(ctl, "%s '%s'", _("Could not find matching device"), device_value); + goto cleanup; + }
if (virNodeDeviceDestroy(dev) == 0) { - vshPrint(ctl, _("Destroyed node device '%s'\n"), name); + vshPrint(ctl, _("Destroyed node device '%s'\n"), device_value); } else { - vshError(ctl, _("Failed to destroy node device '%s'"), name); - ret = false; + vshError(ctl, _("Failed to destroy node device '%s'"), device_value); + goto cleanup; }
+ ret = true; +cleanup: + if (arr) { + VIR_FREE(*arr);
Hmm, IIUC, that is equiv to VIR_FREE(arr[0]), so what is free'ing arr[1] ?
+ VIR_FREE(arr); + }
ACK if that leak is fixed, or otherwise explained. Daniel -- |: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :| |: http://libvirt.org -o- http://virt-manager.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|