Commit fb70ee38 authored by unknown's avatar unknown
Browse files

ndb -

  handle open(O_DIRECT) -> EINVAL
  remove need for NDB_NO_ODIRECT


storage/ndb/src/kernel/blocks/ndbfs/AsyncFile.cpp:
  handle open(O_DIRECT) -> EINVAL
parent 1671f0ff
Loading
Loading
Loading
Loading
+42 −19
Original line number Diff line number Diff line
@@ -312,7 +312,8 @@ void AsyncFile::openReq(Request* request)
  Uint32 new_flags = 0;

  // Convert file open flags from Solaris to Liux
  if(flags & FsOpenReq::OM_CREATE){
  if (flags & FsOpenReq::OM_CREATE)
  {
    new_flags |= O_CREAT;
  }
  
@@ -341,14 +342,14 @@ void AsyncFile::openReq(Request* request)
#endif
  }
  
#ifndef NDB_NO_O_DIRECT  /* to allow tmpfs */
//#ifndef NDB_NO_O_DIRECT  /* to allow tmpfs */
#ifdef O_DIRECT
  if (flags & FsOpenReq::OM_DIRECT) 
  {
    new_flags |= O_DIRECT;
  }
#endif
#endif
//#endif
  
  switch(flags & 0x3){
  case FsOpenReq::OM_READONLY:
@@ -370,8 +371,14 @@ void AsyncFile::openReq(Request* request)
  const int mode = S_IRUSR | S_IWUSR |
	           S_IRGRP | S_IWGRP |
		   S_IROTH | S_IWOTH;
  if(flags & FsOpenReq::OM_CREATE_IF_NONE){
    if((theFd = ::open(theFileName.c_str(), new_flags, mode)) != -1) {
  if (flags & FsOpenReq::OM_CREATE_IF_NONE)
  {
    Uint32 tmp_flags = new_flags;
#ifdef O_DIRECT
    tmp_flags &= ~O_DIRECT;
#endif
    if ((theFd = ::open(theFileName.c_str(), tmp_flags, mode)) != -1) 
    {
      close(theFd);
      request->error = FsRef::fsErrFileExists;      
      return;
@@ -379,16 +386,29 @@ void AsyncFile::openReq(Request* request)
    new_flags |= O_CREAT;
  }
  
  if (-1 == (theFd = ::open(theFileName.c_str(), new_flags, mode))) {
no_odirect:
  if (-1 == (theFd = ::open(theFileName.c_str(), new_flags, mode))) 
  {
    PRINT_ERRORANDFLAGS(new_flags);
    if( (errno == ENOENT ) && (new_flags & O_CREAT ) ) {
    if ((errno == ENOENT ) && (new_flags & O_CREAT)) 
    {
      createDirectories();
      if (-1 == (theFd = ::open(theFileName.c_str(), new_flags, mode))) {
      if (-1 == (theFd = ::open(theFileName.c_str(), new_flags, mode))) 
      {
        PRINT_ERRORANDFLAGS(new_flags);
        request->error = errno;
	return;
      }
    } else {
    }
#ifdef O_DIRECT
    else if (new_flags & O_DIRECT)
    {
      new_flags &= ~O_DIRECT;
      goto no_odirect;
    }
#endif
    else
    {
      request->error = errno;
      return;
    }
@@ -400,14 +420,17 @@ void AsyncFile::openReq(Request* request)
    if ((fstat(theFd, &buf) == -1))
    {
      request->error = errno;
    } else if(buf.st_size != request->par.open.file_size){
    } 
    else if(buf.st_size != request->par.open.file_size)
    {
      request->error = FsRef::fsErrInvalidFileSize;
    }
    if (request->error)
      return;
  }
  
  if(flags & FsOpenReq::OM_INIT){
  if (flags & FsOpenReq::OM_INIT)
  {
    off_t off = 0;
    const off_t sz = request->par.open.file_size;
    Uint32 tmp[sizeof(SignalHeader)+25];