diff --git a/lib/utils/io.py b/lib/utils/io.py
index 4c1df6c17b02b5d183c2e35c6e07b9870226875f..413a119c7049c1b4d8016d3b26013079022c60a0 100644
--- a/lib/utils/io.py
+++ b/lib/utils/io.py
@@ -38,17 +38,22 @@ from ganeti.utils import filelock
 _RANDOM_UUID_FILE = "/proc/sys/kernel/random/uuid"
 
 
-def ReadFile(file_name, size=-1):
+def ReadFile(file_name, size=-1, preread=None):
   """Reads a file.
 
   @type size: int
   @param size: Read at most size bytes (if negative, entire file)
+  @type preread: callable receiving file handle as single parameter
+  @param preread: Function called before file is read
   @rtype: str
   @return: the (possibly partial) content of the file
 
   """
   f = open(file_name, "r")
   try:
+    if preread:
+      preread(f)
+
     return f.read(size)
   finally:
     f.close()
diff --git a/test/ganeti.utils.io_unittest.py b/test/ganeti.utils.io_unittest.py
index ed67f6898840a64fa1e5ebbb59b168ce286fa413..be1b4abb65c1460f8b62332616502c1bcf167e51 100755
--- a/test/ganeti.utils.io_unittest.py
+++ b/test/ganeti.utils.io_unittest.py
@@ -55,6 +55,12 @@ class TestReadFile(testutils.GanetiTestCase):
     h.update(data)
     self.assertEqual(h.hexdigest(), "893772354e4e690b9efd073eed433ce7")
 
+  def testCallback(self):
+    def _Cb(fh):
+      self.assertEqual(fh.tell(), 0)
+    data = utils.ReadFile(self._TestDataFilename("cert1.pem"), preread=_Cb)
+    self.assertEqual(len(data), 814)
+
   def testError(self):
     self.assertRaises(EnvironmentError, utils.ReadFile,
                       "/dev/null/does-not-exist")