Pārlūkot izejas kodu

fix bug with O_DIRECT flags and mkostemp

Chiheb Sakka 8 gadi atpakaļ
vecāks
revīzija
6261092f16
1 mainītis faili ar 16 papildinājumiem un 2 dzēšanām
  1. 16 2
      src/common/utils.c

+ 16 - 2
src/common/utils.c

@@ -157,7 +157,7 @@ char *_starpu_mktemp(const char *directory, int flags, int *fd)
 #elif defined (HAVE_MKOSTEMP)
 	*fd = mkostemp(baseCpy, flags);
 #else
-	STARPU_ASSERT(flags == (O_RDWR | O_BINARY));
+	STARPU_ASSERT(flags == (O_RDWR | O_BINARY) || flags == (O_RDWR | O_BINARY | O_DIRECT));
 	*fd = mkstemp(baseCpy);
 #endif
 
@@ -165,12 +165,26 @@ char *_starpu_mktemp(const char *directory, int flags, int *fd)
 	if (*fd < 0)
 	{
 		int err = errno;
-		_STARPU_DISP("Could not create temporary file in directory '%s', mskostemp failed with error '%s'\n", directory, strerror(errno));
+		_STARPU_DISP("Could not create temporary file directory '%s', mskostemp failed with error '%s'\n", directory, strerror(errno));
 		free(baseCpy);
 		errno = err;
 		return NULL;
 	}
 
+#if !defined(STARPU_HAVE_WINDOWS) && !defined (HAVE_MKOSTEMP)
+	if ((flags & O_DIRECT) != 0)
+	{
+		if (fcntl(*fd, F_SETFL, O_DIRECT) < 0)
+		{
+			int err = errno;
+			_STARPU_DISP("Could set O_DIRECT on the temporary file  directory '%s', fcntl failed with error '%s'\n", directory, strerror(errno));
+			free(baseCpy);
+			errno = err;
+			return NULL;
+		}		
+	}
+#endif
+
 	return baseCpy;
 }