Skip to content

Commit

Permalink
use O_DIRECT when copying from /dev/zero too
Browse files Browse the repository at this point in the history
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
  • Loading branch information
Pádraig Brady committed Nov 23, 2012
1 parent 5023fb5 commit 1405a64
Showing 1 changed file with 10 additions and 1 deletion.
11 changes: 10 additions & 1 deletion cinder/volume/driver.py
Expand Up @@ -22,6 +22,7 @@

import os
import re
import stat
import time

from cinder import exception
Expand Down Expand Up @@ -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:
Expand Down

0 comments on commit 1405a64

Please sign in to comment.