Stefan Hajnoczi wrote:
On Tue, Nov 22, 2011 at 9:45 AM, supriya kannery <supri...@in.ibm.com> wrote:
supriya kannery wrote:
Stefan Hajnoczi wrote:
On Fri, Nov 11, 2011 at 6:48 AM, Supriya Kannery
<supri...@linux.vnet.ibm.com> wrote:
+ }
+ if ((flags & BDRV_O_NOCACHE)) {
+ raw_rs->reopen_state.reopen_flags |= O_DIRECT;
+ } else {
+ raw_rs->reopen_state.reopen_flags &= ~O_DIRECT;
+ }
+ ret = fcntl_setfl(raw_rs->reopen_fd,
raw_rs->reopen_state.reopen_flags);
I wonder if this works on Solaris, FreeBSD, etc?
Perhaps there needs to be a fallback to the missing "else" case below...
ok. Will look into whether this will work on Solaris, FreeBSD etc..
This should work for all non-win Oses.
I have tested only in x86.
#ifndef _WIN32
/* Sets a specific flag */
int fcntl_setfl(int fd, int flag)
{
int flags;
flags = fcntl(fd, F_GETFL);
Are you sure POSIX guarantees that O_DIRECT can be changed with
F_SETFL? I didn't find any statement in the specification. It is
possible that this code compiles but does not actually work on
non-Linux OSes. Did you run tests?
I don't have FreeBSD and Solaris systems to use.
Referred the following man page links to verify that O_DIRECT in these
OSes can be changed using fcntl.
http://fuse4bsd.creo.hu/localcgi/man-cgi.cgi?fcntl+2
http://man-wiki.net/index.php/2:fcntl
If anybody with these systems can confirm, that would be very helpful.
-thanks, Supriya
Stefan