[Sheepdog] [PATCH 2/2] O_DIRECT is not a replacement for O_DSYNC

Christoph Hellwig hch at infradead.org
Thu Nov 10 22:56:10 CET 2011


Even if a file is opened with O_DIRECT we still need O_DSYNC / fdatasync
to make sure all metadata required to find the data made it to disk.

Also clean up the flags handling in ob_open a bit.

Signed-off-by: Christoph Hellwig <hch at lst.de>

Index: sheepdog/sheep/store.c
===================================================================
--- sheepdog.orig/sheep/store.c	2011-11-10 21:25:28.385296608 +0100
+++ sheepdog/sheep/store.c	2011-11-10 21:26:58.527796616 +0100
@@ -158,7 +158,7 @@ out:
 	return res;
 }
 
-static int ob_open(uint32_t epoch, uint64_t oid, int aflags, int *ret);
+static int ob_open(uint32_t epoch, uint64_t oid, int flags, int *ret);
 
 static int read_from_one(struct request *req, uint32_t epoch, uint64_t oid,
 			 unsigned *ori_rlen, void *buf, uint64_t offset)
@@ -430,16 +430,14 @@ out:
 	return ret;
 }
 
-static int ob_open(uint32_t epoch, uint64_t oid, int aflags, int *ret)
+static int ob_open(uint32_t epoch, uint64_t oid, int flags, int *ret)
 {
 	char path[1024];
-	int flags;
 	int fd;
 
+	flags |= O_DSYNC | O_RDWR;
 	if (sys->use_directio && is_data_obj(oid))
-		flags = O_DIRECT | O_RDWR | aflags;
-	else
-		flags = O_DSYNC | O_RDWR | aflags;
+		flags |= O_DIRECT;
 
 	snprintf(path, sizeof(path), "%s%08u/%016" PRIx64, obj_path, epoch, oid);
 



More information about the sheepdog mailing list