summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndy Grover <agrover@redhat.com>2013-12-02 12:24:01 -0800
committerAndy Grover <agrover@redhat.com>2013-12-02 12:24:01 -0800
commitbf6151d41ae6518bf2fb87e6c82f0c703ee70f23 (patch)
treebc97dcd7d7cfc8bc697398d28a34a6a9ff459102
parent84d796c1eba3515cca726284f69842dc19472c16 (diff)
parent3bd4d8ef7c9b154c53e8b8dd863a570bce7f5c2c (diff)
downloadtargetcli-bf6151d41ae6518bf2fb87e6c82f0c703ee70f23.tar.gz
Merge pull request #37 from cvubrugier/master
Fix issue #23: use fallocate() to create fileio backstores
-rw-r--r--targetcli/ui_backstore.py23
1 files changed, 16 insertions, 7 deletions
diff --git a/targetcli/ui_backstore.py b/targetcli/ui_backstore.py
index 2e978d0..467ab0e 100644
--- a/targetcli/ui_backstore.py
+++ b/targetcli/ui_backstore.py
@@ -258,21 +258,30 @@ class UIFileIOBackstore(UIBackstore):
UIBackstore.__init__(self, 'fileio', parent)
def _create_file(self, filename, size, sparse=True):
- f = open(filename, "w+")
+ try:
+ f = open(filename, "w+")
+ except (OSError, IOError):
+ raise ExecutionError("Could not open %s" % filename)
try:
if sparse:
- os.ftruncate(f.fileno(), size)
+ try:
+ os.posix_fallocate(f.fileno(), 0, size)
+ except AttributeError:
+ # Prior to version 3.3, Python does not provide fallocate
+ os.ftruncate(f.fileno(), size)
else:
- self.shell.log.info("Writing %s bytes" % size)
+ self.shell.log.info("Writing %d bytes" % size)
while size > 0:
write_size = min(size, 1024)
f.write("\0" * write_size)
size -= write_size
- except IOError:
- f.close()
+ except (OSError, IOError):
os.remove(filename)
- raise ExecutionError("Could not expand file to size")
- f.close()
+ raise ExecutionError("Could not expand file to %d bytes" % size)
+ except OverflowError:
+ raise ExecutionError("The file size is too large (%d bytes)" % size)
+ finally:
+ f.close()
def ui_command_create(self, name, file_or_dev, size=None, write_back=None,
sparse=None):