From 1d49dcb4af158993f15eebf7f57e79b4f7414c6c Mon Sep 17 00:00:00 2001 From: Jeremy Katz Date: Wed, 27 Apr 2005 19:16:32 +0000 Subject: 2005-04-27 Jeremy Katz * isys/isys.c (doDevSpaceFree): Apply Jindrich Novy's patch to fix space calculation on > 2 TB devices (#155709) --- isys/isys.c | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) (limited to 'isys') diff --git a/isys/isys.c b/isys/isys.c index 1d8f5def3..ec0d4f818 100644 --- a/isys/isys.c +++ b/isys/isys.c @@ -881,9 +881,23 @@ static PyObject * doGetRaidChunkSize(PyObject * s, PyObject * args) { return Py_BuildValue("i", sb.chunk_size / 1024); } +static int get_bits(unsigned long long v) { + int b = 0; + + if ( v & 0xffffffff00000000LLU ) { b += 32; v >>= 32; } + if ( v & 0xffff0000LLU ) { b += 16; v >>= 16; } + if ( v & 0xff00LLU ) { b += 8; v >>= 8; } + if ( v & 0xf0LLU ) { b += 4; v >>= 4; } + if ( v & 0xcLLU ) { b += 2; v >>= 2; } + if ( v & 0x2LLU ) b++; + + return v ? b + 1 : b; +} + static PyObject * doDevSpaceFree(PyObject * s, PyObject * args) { char * path; struct statfs sb; + unsigned long long size; if (!PyArg_ParseTuple(args, "s", &path)) return NULL; @@ -892,7 +906,13 @@ static PyObject * doDevSpaceFree(PyObject * s, PyObject * args) { return NULL; } - return Py_BuildValue("l", (long) sb.f_bfree * (sb.f_bsize / 1024) / (1024)); + /* Calculate a saturated addition to prevent oveflow. */ + if ( get_bits(sb.f_bfree) + get_bits(sb.f_bsize) <= 64 ) + size = (unsigned long long)sb.f_bfree * sb.f_bsize; + else + size = ~0LLU; + + return PyLong_FromUnsignedLongLong(size>>20); } static PyObject * doRaidStop(PyObject * s, PyObject * args) { -- cgit