New submission from Eduardo Aguiar <agu...@users.sourceforge.net>:

At posixmodule.c (line 6306)

static PyObject *
posix_read(PyObject *self, PyObject *args)
{
        int fd, size, n;
        PyObject *buffer;
        if (!PyArg_ParseTuple(args, "ii:read", &fd, &size))
                return NULL;
        if (size < 0) {
                errno = EINVAL;
                return posix_error();
        }
        buffer = PyString_FromStringAndSize((char *)NULL, size);
        if (buffer == NULL)
                return NULL;
        Py_BEGIN_ALLOW_THREADS
        n = read(fd, PyString_AsString(buffer), size);
        Py_END_ALLOW_THREADS
        if (n < 0) {
                Py_DECREF(buffer);
                return posix_error();
        }
        if (n != size)
                _PyString_Resize(&buffer, n);
        return buffer;
}

os.read does not work with O_DIRECT flag. It fails with errno = EINVAL.

>From read(2) man page:

       EINVAL fd  is attached to an object which is unsuitable for
reading; or
              the file was opened with  the  O_DIRECT  flag,  and 
either  the
              address  specified  in buf, the value specified in count,
or the
              current file offset is not suitably aligned.

if os.open is called with O_DIRECT flag enabled, the buffer used in
"read" must be page aligned and "size" must be multiple of pagesize also.

----------
components: Library (Lib)
messages: 82938
nosy: aguiar
severity: normal
status: open
title: os.read not handling O_DIRECT flag
type: behavior
versions: Python 2.6

_______________________________________
Python tracker <rep...@bugs.python.org>
<http://bugs.python.org/issue5396>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to