[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

Re: [PATCH] Support cio_ignore functionality for zFCP devices (#533492)



Ack with minor correction to commit message

On 05/25/2010 10:28 PM, David Cantrell wrote:
> Honor FCP_* lines passed at boot time as well as runtime additions of
> zFCP devices by the user.  Call zfcp_cio_free to free the device from
> the cio_ignore facility and then set the remaining values necessary for
> the device as we used to do.  Record all devices freed during

"the device as we used to do.

Record all LUNs successfully activated during"

It's not just the devices (=HBA) we dynamically removed from cio_ignore.
It's the LUNs that we successfully activated that go into
/etc/zfcp.conf. Some of those LUNs could be on a device that was not
even in cio_ignore and hence did not need to be freed.

> installation in the /etc/zfcp.conf file and make sure that file is
> copied to the target system during installation.
> ---
>  loader/linuxrc.s390 |    4 +-
>  storage/zfcp.py     |   67 +++++++++++++++++++--------------------------------
>  2 files changed, 27 insertions(+), 44 deletions(-)
> 
> diff --git a/loader/linuxrc.s390 b/loader/linuxrc.s390
> index 814dd32..99e5192 100644
> --- a/loader/linuxrc.s390
> +++ b/loader/linuxrc.s390
> @@ -2962,9 +2962,9 @@ fi # testing
>  syntax_check_fcp
>  # currently we ignore failed syntax checks since FCP parms are non-interactive
>  for i in ${!FCP_*}; do
> -    echo "${!i}" >> /tmp/fcpconfig
> +    echo "${!i}" >> /etc/zfcp.conf
>  done
> -# cio_ignore handling for FCP should happen when the content of /tmp/fcpconfig
> +# cio_ignore handling for FCP should happen when the content of /etc/zfcp.conf
>  # will actually be processed which is in anaconda's zfcp.py ZFCP::readConfig()
> 
>  # TODO/FIXME: also need to pass IPv6 decision to loader/anaconda
> diff --git a/storage/zfcp.py b/storage/zfcp.py
> index 7692cad..3c315e8 100644
> --- a/storage/zfcp.py
> +++ b/storage/zfcp.py
> @@ -27,9 +27,9 @@ from udev import udev_settle
>  import gettext
>  _ = lambda x: gettext.ldgettext("anaconda", x)
> 
> +import iutil
>  import logging
>  log = logging.getLogger("anaconda")
> -import warnings
> 
>  def loggedWriteLineToFile(fn, value):
>      f = open(fn, "w")
> @@ -39,6 +39,7 @@ def loggedWriteLineToFile(fn, value):
> 
>  zfcpsysfs = "/sys/bus/ccw/drivers/zfcp"
>  scsidevsysfs = "/sys/bus/scsi/devices"
> +zfcpconf = "/etc/zfcp.conf"
> 
>  class ZFCPDevice:
>      def __init__(self, devnum, wwpn, fcplun):
> @@ -122,15 +123,10 @@ class ZFCPDevice:
>          unitdir = "%s/%s" %(portdir, self.fcplun)
>          failed = "%s/failed" %(unitdir)
> 
> -        try:
> -            if not os.path.exists(online):
> -                loggedWriteLineToFile("/proc/cio_ignore",
> -                                      "free %s" %(self.devnum,))
> -                udev_settle()
> -        except IOError as e:
> -            raise ValueError, _("Could not free zFCP device %(devnum)s from "
> -                                "device ignore list (%(e)s).") \
> -                              % {'devnum': self.devnum, 'e': e}
> +        if not os.path.exists(online):
> +            log.info("Freeing zFCP device %s" % (self.devnum,))
> +            iutil.execWithRedirect("zfcp_cio_free", ["-d", self.devnum],
> +                                   stdout="/dev/tty5", stderr="/dev/tty5")
> 
>          if not os.path.exists(online):
>              raise ValueError, _(
> @@ -143,8 +139,6 @@ class ZFCPDevice:
>              f.close()
>              if devonline != "1":
>                  loggedWriteLineToFile(online, "1")
> -            else:
> -                log.info("zFCP device %s already online." %(self.devnum,))
>          except IOError as e:
>              raise ValueError, _("Could not set zFCP device %(devnum)s "
>                                  "online (%(e)s).") \
> @@ -335,7 +329,7 @@ class ZFCP:
>      """
> 
>      def __init__(self):
> -        self.fcpdevs = []
> +        self.fcpdevs = set()
>          self.hasReadConfig = False
>          self.down = True
> 
> @@ -345,45 +339,34 @@ class ZFCP:
> 
>      def readConfig(self):
>          try:
> -            f = open("/tmp/fcpconfig", "r")
> +            f = open(zfcpconf, "r")
>          except IOError:
> -            log.info("no /tmp/fcpconfig; not configuring zfcp")
> +            log.info("no %s; not configuring zfcp" % (zfcpconf,))
>              return
> 
> -        lines = f.readlines()
> +        lines = map(lambda x: x.strip().lower(), f.readlines())
>          f.close()
> +
>          for line in lines:
> -            # each line is a string separated list of values to describe a dev
> -            # there are two valid formats for the line:
> -            #   devnum scsiid wwpn scsilun fcplun    (scsiid + scsilun ignored)
> -            #   devnum wwpn fcplun
> -            line = string.strip(line).lower()
> -            if line.startswith("#"):
> -                continue
> -            fcpconf = string.split(line)
> -            if len(fcpconf) == 3:
> -                devnum = fcpconf[0]
> -                wwpn = fcpconf[1]
> -                fcplun = fcpconf[2]
> -            elif len(fcpconf) == 5:
> -                warnings.warn("SCSI ID and SCSI LUN values for ZFCP devices are ignored and deprecated.", DeprecationWarning)
> -                devnum = fcpconf[0]
> -                wwpn = fcpconf[2]
> -                fcplun = fcpconf[4]
> -            else:
> -                log.warn("Invalid line found in /tmp/fcpconfig!")
> +            if line.startswith("#") or line == '':
>                  continue
> 
> -            try:
> -                self.addFCP(devnum, wwpn, fcplun)
> -            except ValueError, e:
> -                log.warn(str(e))
> +            fields = line.split()
> +
> +            if len(fields) == 3:
> +                self.addFCP(fields[0], fields[1], fields[2])
> +            elif len(fields) == 5:
> +                # support old syntax of:
> +                # devno scsiid wwpn scsilun fcplun
> +                self.addFCP(fields[0], fields[2], fields[4])
> +            else:
> +                log.warn("Invalid line found in %s: %s" % (zfcpconf, line,))
>                  continue
> 
>      def addFCP(self, devnum, wwpn, fcplun):
>          d = ZFCPDevice(devnum, wwpn, fcplun)
>          if d.onlineDevice():
> -            self.fcpdevs.append(d)
> +            self.fcpdevs.add(d)
> 
>      def shutdown(self):
>          if self.down:
> @@ -406,7 +389,7 @@ class ZFCP:
>              self.hasReadConfig = True
>              # readConfig calls addFCP which calls onlineDevice already
>              return
> -            
> +
>          if len(self.fcpdevs) == 0:
>              return
>          for d in self.fcpdevs:
> @@ -426,7 +409,7 @@ class ZFCP:
>      def write(self, instPath):
>          if len(self.fcpdevs) == 0:
>              return
> -        f = open(instPath + "/etc/zfcp.conf", "w")
> +        f = open(instPath + zfcpconf, "w")
>          for d in self.fcpdevs:
>              f.write("%s\n" %(d,))
>          f.close()

Steffen

Linux on System z Development

IBM Deutschland Research & Development GmbH
Vorsitzender des Aufsichtsrats: Martin Jetter
Geschäftsführung: Dirk Wittkopp
Sitz der Gesellschaft: Böblingen
Registergericht: Amtsgericht Stuttgart, HRB 243294



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]