From 1405a6440d646524d41adfed4fc1344948e2871f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A1draig=20Brady?= Date: Fri, 23 Nov 2012 11:24:44 +0000 Subject: [PATCH] use O_DIRECT when copying from /dev/zero too We need to avoid trying O_DIRECT with virtual devices like /dev/zero and /dev/urandom etc. as it's not supported there, which because of our later check, would cause O_DIRECT to be not applied to the output device either. Related to bug 937694 Possibly related to bug 1023755 Change-Id: I034d8345c3d00689c1f1fffcc2c110735c49ee01 --- cinder/volume/driver.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/cinder/volume/driver.py b/cinder/volume/driver.py index 35af0993534..0dacacfcd01 100644 --- a/cinder/volume/driver.py +++ b/cinder/volume/driver.py @@ -22,6 +22,7 @@ import os import re +import stat import time from cinder import exception @@ -105,7 +106,15 @@ def _create_volume(self, volume_name, sizestr): def _copy_volume(self, srcstr, deststr, size_in_g): # Use O_DIRECT to avoid thrashing the system buffer cache - direct_flags = ('iflag=direct', 'oflag=direct') + direct_flags = ['oflag=direct'] + try: + # Avoid trying O_DIRECT on virtual inputs like /dev/zero + # as it's not supported with such devices. + if not stat.S_ISCHR(os.stat(srcstr).st_mode): + direct_flags += ['iflag=direct'] + except OSError: + # Deal with any access issues below + pass # Check whether O_DIRECT is supported try: