[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-unstable] xend: Accept udev events about SCSI and update physical SCSI information
# HG changeset patch # User Keir Fraser <keir.fraser@xxxxxxxxxx> # Date 1238495329 -3600 # Node ID 46188402c2d9381c4aeb713e775ddc1e9b58c591 # Parent 2ef77b4bdf589642aab55c24bbc0b2ced0d2752c xend: Accept udev events about SCSI and update physical SCSI information Signed-off-by: Masaki Kanno <kanno.masaki@xxxxxxxxxxxxxx> --- tools/hotplug/Linux/xend.rules | 2 tools/python/xen/util/vscsi_util.py | 80 ++++++++++++++++-------------- tools/python/xen/xend/XendNode.py | 40 ++++++++++++--- tools/python/xen/xend/server/udevevent.py | 22 ++++++-- 4 files changed, 95 insertions(+), 49 deletions(-) diff -r 2ef77b4bdf58 -r 46188402c2d9 tools/hotplug/Linux/xend.rules --- a/tools/hotplug/Linux/xend.rules Tue Mar 31 11:28:08 2009 +0100 +++ b/tools/hotplug/Linux/xend.rules Tue Mar 31 11:28:49 2009 +0100 @@ -1,3 +1,3 @@ SUBSYSTEM=="pci", RUN+="socket:/org/xen/ SUBSYSTEM=="pci", RUN+="socket:/org/xen/xend/udev_event" -#SUBSYSTEM=="scsi", RUN+="socket:/org/xen/xend/udev_event" +SUBSYSTEM=="scsi", RUN+="socket:/org/xen/xend/udev_event" #SUBSYSTEM=="net", KERNEL!="vif[0-9]*.[0-9]*|tap[0-9]*.[0-9]*", RUN+="socket:/org/xen/xend/udev_event" diff -r 2ef77b4bdf58 -r 46188402c2d9 tools/python/xen/util/vscsi_util.py --- a/tools/python/xen/util/vscsi_util.py Tue Mar 31 11:28:08 2009 +0100 +++ b/tools/python/xen/util/vscsi_util.py Tue Mar 31 11:28:49 2009 +0100 @@ -231,40 +231,50 @@ def get_scsi_scsilevel(pHCTL): except: return None +def _make_scsi_record(scsi_info): + scsi_rec = { + 'physical_HCTL': scsi_info[0], + 'dev_name': None, + 'sg_name': scsi_info[2], + 'scsi_id': None + } + if scsi_info[1] is not None: + scsi_rec['dev_name'] = scsi_info[1] + if scsi_info[3] is not None: + scsi_rec['scsi_id'] = scsi_info[3] + + scsi_rec['vendor_name'] = \ + get_scsi_vendor(scsi_rec['physical_HCTL']) + scsi_rec['model'] = \ + get_scsi_model(scsi_rec['physical_HCTL']) + scsi_rec['type_id'] = \ + get_scsi_typeid(scsi_rec['physical_HCTL']) + scsi_rec['revision'] = \ + get_scsi_revision(scsi_rec['physical_HCTL']) + scsi_rec['scsi_level'] = \ + get_scsi_scsilevel(scsi_rec['physical_HCTL']) + + try: + lsscsi_info = os.popen('lsscsi %s 2>/dev/null' % scsi_rec['physical_HCTL']).read().split() + scsi_rec['type'] = lsscsi_info[1] + except: + scsi_rec['type'] = None + + return scsi_rec + +def get_scsi_device(pHCTL): + scsis_info = _vscsi_get_scsidevices_by_lsscsi(pHCTL) + if not scsis_info: + scsis_info = _vscsi_get_scsidevices_by_sysfs() + for scsi_info in scsis_info: + if scsi_info[0] == pHCTL: + return _make_scsi_record(scsi_info) + return None + def get_all_scsi_devices(): - - scsi_devs = [] - + scsi_records = [] for scsi_info in vscsi_get_scsidevices(): - scsi_dev = { - 'physical_HCTL': scsi_info[0], - 'dev_name': None, - 'sg_name': scsi_info[2], - 'scsi_id': None - } - if scsi_info[1] is not None: - scsi_dev['dev_name'] = scsi_info[1] - if scsi_info[3] is not None: - scsi_dev['scsi_id'] = scsi_info[3] - - scsi_dev['vendor_name'] = \ - get_scsi_vendor(scsi_dev['physical_HCTL']) - scsi_dev['model'] = \ - get_scsi_model(scsi_dev['physical_HCTL']) - scsi_dev['type_id'] = \ - get_scsi_typeid(scsi_dev['physical_HCTL']) - scsi_dev['revision'] = \ - get_scsi_revision(scsi_dev['physical_HCTL']) - scsi_dev['scsi_level'] = \ - get_scsi_scsilevel(scsi_dev['physical_HCTL']) - - try: - lsscsi_info = os.popen('lsscsi %s 2>/dev/null' % scsi_dev['physical_HCTL']).read().split() - scsi_dev['type'] = lsscsi_info[1] - except: - scsi_dev['type'] = None - - scsi_devs.append(scsi_dev) - - return scsi_devs - + scsi_record = _make_scsi_record(scsi_info) + scsi_records.append(scsi_record) + return scsi_records + diff -r 2ef77b4bdf58 -r 46188402c2d9 tools/python/xen/xend/XendNode.py --- a/tools/python/xen/xend/XendNode.py Tue Mar 31 11:28:08 2009 +0100 +++ b/tools/python/xen/xend/XendNode.py Tue Mar 31 11:28:49 2009 +0100 @@ -378,14 +378,38 @@ class XendNode: self.save_PPCIs() - def add_PSCSI(self): - # TODO - log.debug("add_network(): Not implemented.") - - - def remove_PSCSI(self): - # TODO - log.debug("add_network(): Not implemented.") + def add_PSCSI(self, add_HCTL): + saved_pscsis = self.state_store.load_state('pscsi') + saved_pscsi_table = {} + if saved_pscsis: + for saved_uuid, saved_record in saved_pscsis.items(): + try: + saved_pscsi_table[saved_record['scsi_id']] = saved_uuid + except KeyError: + pass + + # Initialise the PSCSI + pscsi_record = vscsi_util.get_scsi_device(add_HCTL) + if pscsi_record and pscsi_record['scsi_id']: + pscsi_uuid = saved_pscsi_table.get(pscsi_record['scsi_id'], None) + if pscsi_uuid is None: + pscsi_uuid = uuid.createString() + XendPSCSI(pscsi_uuid, pscsi_record) + self.save_PSCSIs() + + + def remove_PSCSI(self, rem_HCTL): + saved_pscsis = self.state_store.load_state('pscsi') + if not saved_pscsis: + return + + # Remove the PSCSI + for pscsi_record in saved_pscsis.values(): + if rem_HCTL == pscsi_record['physical_HCTL']: + pscsi_ref = XendPSCSI.get_by_HCTL(rem_HCTL) + XendAPIStore.get(pscsi_ref, "PSCSI").destroy() + self.save_PSCSIs() + return ## def network_destroy(self, net_uuid): diff -r 2ef77b4bdf58 -r 46188402c2d9 tools/python/xen/xend/server/udevevent.py --- a/tools/python/xen/xend/server/udevevent.py Tue Mar 31 11:28:08 2009 +0100 +++ b/tools/python/xen/xend/server/udevevent.py Tue Mar 31 11:28:49 2009 +0100 @@ -40,13 +40,25 @@ class UdevEventProtocol(protocol.Protoco log.info("Removing pci device %s", pci_name) XendNode.instance().remove_PPCI(pci_name) - elif (udev_event.get('SUBSYSTEMS', None) == 'scsi'): + elif (udev_event.get('SUBSYSTEM', None) == 'scsi'): + hctl = None + devpath = udev_event.get('DEVPATH', None) + if devpath: + hctl = devpath.split('/')[-1] + if len(hctl.split(':')) != 4: + hctl = None + if hctl is None: + # By any possibility, if an HCTL isn't gotten from + # the udev event, the udev event is ignored. + log.warn("Invalid udev event about scsi received") + return + if (udev_event['ACTION'] == 'add'): - log.info("Adding scsi device") - XendNode.instance().add_PSCSI() + log.info("Adding scsi device %s", hctl) + XendNode.instance().add_PSCSI(hctl) elif (udev_event['ACTION'] == 'remove'): - log.info("Removing scci device") - XendNode.instance().remove_PSCSI() + log.info("Removing scsi device %s", hctl) + XendNode.instance().remove_PSCSI(hctl) elif (udev_event.get('SUBSYSTEM', None) == 'net'): interface = udev_event.get('INTERFACE', None) _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |