summaryrefslogtreecommitdiffstats
path: root/isys/isys.c
diff options
context:
space:
mode:
authorJeremy Katz <katzj@redhat.com>2003-10-16 23:38:19 +0000
committerJeremy Katz <katzj@redhat.com>2003-10-16 23:38:19 +0000
commit86e86f87a2bd23851019d21a982925776da2409b (patch)
treeb21c8266a1ecb1406556adfe8f5acc76bd50f74b /isys/isys.c
parent04a378fbc46ece5c4f87c07b06f02f4ec34f1cd2 (diff)
downloadanaconda-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/isys.c')
-rw-r--r--isys/isys.c35
1 files changed, 35 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;