diff --git a/mx_util.c b/mx_util.c
index 0dd65101..b686ba11 100644
--- a/mx_util.c
+++ b/mx_util.c
@@ -13,6 +13,7 @@
 
 #include <sys/types.h>
 #include <sys/stat.h>
+#include <sys/vfs.h>
 #include <fcntl.h>
 
 #include "mx_log.h"
@@ -1331,3 +1332,14 @@ void _mx_sort_linked_list (void **list,  int (*cmp)(void *o1,void *o2), void **
     }
     *list=sorted;
 }
+
+unsigned long mx_df(const char *path) {
+    int res;
+    struct statfs s;
+
+    res=statfs(path, &s);
+    if (res<0) {
+        return 0;
+    }
+    return s.f_bavail*s.f_frsize;
+}
diff --git a/mx_util.h b/mx_util.h
index 46107414..bf31f4ee 100644
--- a/mx_util.h
+++ b/mx_util.h
@@ -169,5 +169,6 @@ int mx_daemon(int nochdir, int noclose);
 void _mx_sort_linked_list(void **list, int (*cmp)(void *o1,void *o2), void ** (*getnextptr)(void *o));
 #define mx_sort_linked_list(list,cmp,getnextptr) _mx_sort_linked_list((void **)(list),(int (*)(void *,void *))(cmp),(void ** (*)(void *))(getnextptr)) 
 
+unsigned long mx_df(const char *path);
 
 #endif
diff --git a/test_mx_util.c b/test_mx_util.c
index 4d4c4f38..54ba7e03 100644
--- a/test_mx_util.c
+++ b/test_mx_util.c
@@ -530,6 +530,10 @@ static void test_listsort(void)
     assert(o[9].next==NULL);
 }
 
+static void test_mx_df() {
+    assert(mx_df("/") > 0);
+}
+
 int main(int argc, char *argv[])
 {
     test_mx_strskipwhitespaces();
@@ -550,5 +554,6 @@ int main(int argc, char *argv[])
     test_mx_strcat();
     test_mx_cpuset();
     test_listsort();
+    test_mx_df();
     return 0;
 }