summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog3
-rw-r--r--isys/isys.c22
2 files changed, 24 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index 2ccc89239..64531f6ae 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,8 @@
2005-04-27 Jeremy Katz <katzj@redhat.com>
+ * isys/isys.c (doDevSpaceFree): Apply Jindrich Novy's patch to fix
+ space calculation on > 2 TB devices (#155709)
+
* cmdline.py (progressDisplay.setPackageStatus): Don't spam about
package downloads in cmdline mode (#155250)
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) {