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? Stefan