diff -r 22c89412fc8c tools/python/xen/util/pci.py --- a/tools/python/xen/util/pci.py Wed Oct 15 15:58:09 2008 +0100 +++ b/tools/python/xen/util/pci.py Thu Oct 16 11:39:05 2008 +0900 @@ -12,8 +12,8 @@ import types import types import struct import time - -PROC_MNT_PATH = '/proc/mounts' +from xen.util import utils + PROC_PCI_PATH = '/proc/bus/pci/devices' PROC_PCI_NUM_RESOURCES = 7 @@ -97,9 +97,6 @@ MSIX_SIZE_MASK = 0x7ff # Global variable to store information from lspci lspci_info = None -# Global variable to store the sysfs mount point -sysfs_mnt_point = None - #Calculate PAGE_SHIFT: number of bits to shift an address to get the page number PAGE_SIZE = resource.getpagesize() PAGE_SHIFT = 0 @@ -141,20 +138,8 @@ def parse_pci_name(pci_name_string): def find_sysfs_mnt(): - global sysfs_mnt_point - if not sysfs_mnt_point is None: - return sysfs_mnt_point - try: - mounts_file = open(PROC_MNT_PATH,'r') - - for line in mounts_file: - sline = line.split() - if len(sline)<3: - continue - if sline[2]=='sysfs': - sysfs_mnt_point= sline[1] - return sysfs_mnt_point + return utils.find_sysfs_mount() except IOError, (errno, strerr): raise PciDeviceParseError(('Failed to locate sysfs mount: %s: %s (%d)'% (PROC_PCI_PATH, strerr, errno))) diff -r 22c89412fc8c tools/python/xen/util/utils.py --- a/tools/python/xen/util/utils.py Wed Oct 15 15:58:09 2008 +0100 +++ b/tools/python/xen/util/utils.py Thu Oct 16 11:39:27 2008 +0900 @@ -48,3 +48,29 @@ def daemonize(prog, args, stdin_tmpfile= os.waitpid(pid, 0) return daemon_pid +# Global variable to store the sysfs mount point +sysfs_mount_point = None + +PROC_MOUNTS_PATH = '/proc/mounts' + +def find_sysfs_mount(): + global sysfs_mount_point + + if not sysfs_mount_point is None: + return sysfs_mount_point + + try: + mounts_file = open(PROC_MOUNTS_PATH, 'r') + + for line in mounts_file: + sline = line.split() + if len(sline) < 3: + continue + if sline[2] == 'sysfs': + sysfs_mount_point= sline[1] + return sysfs_mount_point + except IOError, (errno, strerr): + raise + + return None + diff -r 22c89412fc8c tools/python/xen/util/vscsi_util.py --- a/tools/python/xen/util/vscsi_util.py Wed Oct 15 15:58:09 2008 +0100 +++ b/tools/python/xen/util/vscsi_util.py Thu Oct 16 11:39:59 2008 +0900 @@ -23,9 +23,18 @@ """Support for VSCSI Devices. """ import os +import os.path import sys import re import string +from xen.util import utils + +SYSFS_SCSI_PATH = "/bus/scsi/devices" +SYSFS_SCSI_DEV_VENDOR_PATH = '/vendor' +SYSFS_SCSI_DEV_MODEL_PATH = '/model' +SYSFS_SCSI_DEV_TYPEID_PATH = '/type' +SYSFS_SCSI_DEV_REVISION_PATH = '/rev' +SYSFS_SCSI_DEV_SCSILEVEL_PATH = '/scsi_level' def _vscsi_hctl_block(name, scsi_devices): """ block-device name is convert into hctl. (e.g., '/dev/sda', @@ -84,10 +93,10 @@ def vscsi_get_scsidevices(): def vscsi_get_scsidevices(): """ get all scsi devices""" - SERCH_SCSI_PATH = "/sys/bus/scsi/devices" devices = [] - - for dirpath, dirnames, files in os.walk(SERCH_SCSI_PATH): + sysfs_mnt = utils.find_sysfs_mount() + + for dirpath, dirnames, files in os.walk(sysfs_mnt + SYSFS_SCSI_PATH): for hctl in dirnames: paths = os.path.join(dirpath, hctl) block = "-" @@ -131,3 +140,101 @@ def vscsi_search_hctl_and_block(device): return (hctl, block) + +def get_scsi_vendor(pHCTL): + try: + sysfs_mnt = utils.find_sysfs_mount() + sysfs_scsi_dev_path = \ + os.path.join(sysfs_mnt + SYSFS_SCSI_PATH, pHCTL) + scsi_vendor = \ + os.popen('cat ' + sysfs_scsi_dev_path + \ + SYSFS_SCSI_DEV_VENDOR_PATH).read() + return scsi_vendor.splitlines()[0] + except: + return None + +def get_scsi_model(pHCTL): + try: + sysfs_mnt = utils.find_sysfs_mount() + sysfs_scsi_dev_path = \ + os.path.join(sysfs_mnt + SYSFS_SCSI_PATH, pHCTL) + scsi_model = \ + os.popen('cat ' + sysfs_scsi_dev_path + \ + SYSFS_SCSI_DEV_MODEL_PATH).read() + return scsi_model.splitlines()[0] + except: + return None + +def get_scsi_typeid(pHCTL): + try: + sysfs_mnt = utils.find_sysfs_mount() + sysfs_scsi_dev_path = \ + os.path.join(sysfs_mnt + SYSFS_SCSI_PATH, pHCTL) + scsi_typeid = \ + os.popen('cat ' + sysfs_scsi_dev_path + \ + SYSFS_SCSI_DEV_TYPEID_PATH).read() + return int(scsi_typeid.splitlines()[0]) + except: + return None + +def get_scsi_revision(pHCTL): + try: + sysfs_mnt = utils.find_sysfs_mount() + sysfs_scsi_dev_path = \ + os.path.join(sysfs_mnt + SYSFS_SCSI_PATH, pHCTL) + scsi_revision = \ + os.popen('cat ' + sysfs_scsi_dev_path + \ + SYSFS_SCSI_DEV_REVISION_PATH).read() + return scsi_revision.splitlines()[0] + except: + return None + +def get_scsi_scsilevel(pHCTL): + try: + sysfs_mnt = utils.find_sysfs_mount() + sysfs_scsi_dev_path = \ + os.path.join(sysfs_mnt + SYSFS_SCSI_PATH, pHCTL) + scsi_scsilevel = \ + os.popen('cat ' + sysfs_scsi_dev_path + \ + SYSFS_SCSI_DEV_SCSILEVEL_PATH).read() + return int(scsi_scsilevel.splitlines()[0]) + except: + return None + +def get_all_scsi_devices(): + + scsi_devs = [] + + 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] != '-': + scsi_dev['dev_name'] = scsi_info[1] + if scsi_info[3] != '-': + 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 ' + 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 +