From: Pádraig Brady Date: Fri, 23 Nov 2012 11:24:44 +0000 (+0000) Subject: use O_DIRECT when copying from /dev/zero too X-Git-Url: https://review.fuel-infra.org/gitweb?a=commitdiff_plain;h=1405a6440d646524d41adfed4fc1344948e2871f;p=openstack-build%2Fcinder-build.git 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 --- diff --git a/cinder/volume/driver.py b/cinder/volume/driver.py index 35af09935..0dacacfcd 100644 --- a/cinder/volume/driver.py +++ b/cinder/volume/driver.py @@ -22,6 +22,7 @@ Drivers for volumes. import os import re +import stat import time from cinder import exception @@ -105,7 +106,15 @@ class VolumeDriver(object): 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: