diff options
author | Jeremy Katz <katzj@redhat.com> | 2003-10-16 23:38:19 +0000 |
---|---|---|
committer | Jeremy Katz <katzj@redhat.com> | 2003-10-16 23:38:19 +0000 |
commit | 86e86f87a2bd23851019d21a982925776da2409b (patch) | |
tree | b21c8266a1ecb1406556adfe8f5acc76bd50f74b /isys | |
parent | 04a378fbc46ece5c4f87c07b06f02f4ec34f1cd2 (diff) | |
download | anaconda-86e86f87a2bd23851019d21a982925776da2409b.tar.gz anaconda-86e86f87a2bd23851019d21a982925776da2409b.tar.xz anaconda-86e86f87a2bd23851019d21a982925776da2409b.zip |
read the chunk size of preexisting raid devices and reuse it (#101518)
Diffstat (limited to 'isys')
-rw-r--r-- | isys/isys.c | 35 | ||||
-rw-r--r-- | isys/isys.py | 9 |
2 files changed, 44 insertions, 0 deletions
diff --git a/isys/isys.c b/isys/isys.c index 234115fb1..46c717628 100644 --- a/isys/isys.c +++ b/isys/isys.c @@ -75,6 +75,7 @@ static PyObject * doUnLoSetup(PyObject * s, PyObject * args); static PyObject * doLoChangeFd(PyObject * s, PyObject * args); static PyObject * doDdFile(PyObject * s, PyObject * args); static PyObject * doGetRaidSuperblock(PyObject * s, PyObject * args); +static PyObject * doGetRaidChunkSize(PyObject * s, PyObject * args); static PyObject * doDevSpaceFree(PyObject * s, PyObject * args); static PyObject * doRaidStart(PyObject * s, PyObject * args); static PyObject * doRaidStop(PyObject * s, PyObject * args); @@ -118,6 +119,7 @@ static PyMethodDef isysModuleMethods[] = { { "raidstop", (PyCFunction) doRaidStop, METH_VARARGS, NULL }, { "raidstart", (PyCFunction) doRaidStart, METH_VARARGS, NULL }, { "getraidsb", (PyCFunction) doGetRaidSuperblock, METH_VARARGS, NULL }, + { "getraidchunk", (PyCFunction) doGetRaidChunkSize, METH_VARARGS, NULL }, { "lochangefd", (PyCFunction) doLoChangeFd, METH_VARARGS, NULL }, { "losetup", (PyCFunction) doLoSetup, METH_VARARGS, NULL }, { "unlosetup", (PyCFunction) doUnLoSetup, METH_VARARGS, NULL }, @@ -962,6 +964,39 @@ static PyObject * doGetRaidSuperblock(PyObject * s, PyObject * args) { sb.raid_disks, sb.md_minor); } +static PyObject * doGetRaidChunkSize(PyObject * s, PyObject * args) { + int fd; + unsigned long size; + struct md_superblock_s sb; + + if (!PyArg_ParseTuple(args, "i", &fd)) return NULL; + + if (ioctl(fd, BLKGETSIZE, &size)) { + PyErr_SetFromErrno(PyExc_SystemError); + return NULL; + } + + /* put the size in 1k blocks */ + size >>= 1; + + if (lseek64(fd, ((off64_t) 1024) * (off64_t) MD_NEW_SIZE_BLOCKS(size), SEEK_SET) < 0) { + PyErr_SetFromErrno(PyExc_SystemError); + return NULL; + } + + if (read(fd, &sb, sizeof(sb)) != sizeof(sb)) { + PyErr_SetFromErrno(PyExc_SystemError); + return NULL; + } + + if (sb.md_magic != MD_SB_MAGIC) { + PyErr_SetString(PyExc_ValueError, "bad md magic on device"); + return NULL; + } + + return Py_BuildValue("i", sb.chunk_size / 1024); +} + static PyObject * doDevSpaceFree(PyObject * s, PyObject * args) { char * path; struct statfs sb; diff --git a/isys/isys.py b/isys/isys.py index 8961a0072..e1adf8246 100644 --- a/isys/isys.py +++ b/isys/isys.py @@ -87,6 +87,15 @@ def raidsbFromDevice(device): os.close(fd) return rc +def getRaidChunkFromDevice(device): + fd = os.open(device, os.O_RDONLY) + rc = 64 + try: + rc = _isys.getraidchunk(fd) + finally: + os.close(fd) + return rc + def losetup(device, file, readOnly = 0): if readOnly: mode = os.O_RDONLY |