[rhel7-branch][PATCH 2/3] Add a function to detect LDL DASDs. (#1170653)

Samantha N. Bueno sbueno+anaconda at redhat.com
Thu Jun 18 16:15:40 UTC 2015


Add an isys function to determine whether a given DASD is LDL
formatted or not.

Resolves: rhbz#1170653
---
 pyanaconda/isys/__init__.py |  8 +++++++
 pyanaconda/isys/isys.c      | 57 +++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 65 insertions(+)

diff --git a/pyanaconda/isys/__init__.py b/pyanaconda/isys/__init__.py
index 44f6144..8263212 100644
--- a/pyanaconda/isys/__init__.py
+++ b/pyanaconda/isys/__init__.py
@@ -180,4 +180,12 @@ def total_memory():
         log.error("MemTotal: line not found in /proc/meminfo")
         raise RuntimeError("MemTotal: line not found in /proc/meminfo")
 
+def isLdlDasd(devname):
+    """Check whether a device is an LDL DASD; this is s390x specific."""
+    ldl = _isys.isLdlDasd(devname)
+    if ldl:
+        log.info("%s is an LDL DASD, needs dasdfmt", devname)
+
+    return ldl
+
 handleSegv = _isys.handleSegv
diff --git a/pyanaconda/isys/isys.c b/pyanaconda/isys/isys.c
index 23fb77f..45fa993 100644
--- a/pyanaconda/isys/isys.c
+++ b/pyanaconda/isys/isys.c
@@ -28,15 +28,24 @@
 #include <signal.h>
 #include <execinfo.h>
 #include <stdlib.h>
+#include <sys/ioctl.h>
+#include <linux/fs.h>
+
+#if defined(__s390__) || defined(__s390x__)
+#include <s390utils/vtoc.h>
+#include <asm/dasd.h>
+#endif
 
 static PyObject * doSync(PyObject * s, PyObject * args);
 static PyObject * doSegvHandler(PyObject *s, PyObject *args);
 static PyObject * doSetSystemTime(PyObject *s, PyObject *args);
+static PyObject * isLdlDasd(PyObject *s, PyObject *args);
 
 static PyMethodDef isysModuleMethods[] = {
     { "sync", (PyCFunction) doSync, METH_VARARGS, NULL},
     { "handleSegv", (PyCFunction) doSegvHandler, METH_VARARGS, NULL },
     { "set_system_time", (PyCFunction) doSetSystemTime, METH_VARARGS, NULL},
+    { "isLdlDasd", (PyCFunction) isLdlDasd, METH_VARARGS, NULL},
     { NULL, NULL, 0, NULL }
 } ;
 
@@ -89,4 +98,52 @@ static PyObject * doSetSystemTime(PyObject *s, PyObject  *args) {
 }
 
 
+static PyObject * isLdlDasd(PyObject *s, PyObject  *args) {
+#if !defined(__s390__) && !defined(__s390x__)
+    return Py_BuildValue("i", 0);
+#else
+    char devname[16];
+    char *device = NULL;
+    int f = 0;
+    dasd_information2_t dasd_info;
+    int blksize = 0;
+
+    if (!PyArg_ParseTuple(args, "s", &(device))) {
+        return Py_BuildValue("i", 0);
+    }
+
+    memset(&dasd_info, 0, sizeof(dasd_info));
+    strcpy(devname, "/dev/");
+    strcat(devname, device);
+
+    if ((f = open(devname, O_RDONLY)) == -1) {
+        return Py_BuildValue("i", 0);
+    }
+
+    if (ioctl(f, BLKSSZGET, &blksize) != 0) {
+        close(f);
+        return Py_BuildValue("i", 0);
+    }
+
+    if (ioctl(f, BIODASDINFO2, &dasd_info) != 0) {
+        close(f);
+        return Py_BuildValue("i", 0);
+    }
+
+    close(f);
+
+    /* check we're not on an FBA DASD, since dasdfmt can't run on them */
+    if (strncmp(dasd_info.type, "FBA", 3) == 0)
+        return Py_BuildValue("i", 0);
+
+    /* check DASD volume label; "VOL1" is CDL formatted DASD, won't require formatting */
+    if (dasd_info.format == DASD_FORMAT_CDL) {
+        return Py_BuildValue("i", 0);
+    }
+    else {
+        return Py_BuildValue("i", 1);
+    }
+#endif
+}
+
 /* vim:set shiftwidth=4 softtabstop=4: */
-- 
2.4.0



More information about the anaconda-patches mailing list