[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