From 8f7ca9e346a8a10eaa212c0ef2ba29a3ccced0d7 Mon Sep 17 00:00:00 2001 From: "Yan, Zheng" Date: Wed, 4 Nov 2015 22:27:06 +0800 Subject: [PATCH] client: bypass objectcacher for direct IO Fixes: #13569 Signed-off-by: Yan, Zheng --- src/client/Client.cc | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/client/Client.cc b/src/client/Client.cc index 3c1acf9c94d6..9a6b2b5af97e 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -122,7 +122,9 @@ using namespace std; #define O_RSYNC 0x0 #endif - +#ifndef O_DIRECT +#define O_DIRECT 0x0 +#endif void client_flush_set_callback(void *p, ObjectCacher::ObjectSet *oset) { @@ -7416,6 +7418,9 @@ retry: if (r < 0) return r; + if (f->flags & O_DIRECT) + have &= ~CEPH_CAP_FILE_CACHE; + Mutex uninline_flock("Clinet::_read_uninline_data flock"); Cond uninline_cond; bool uninline_done = false; @@ -7461,6 +7466,9 @@ retry: if (r < 0) goto done; } else { + if (f->flags & O_DIRECT) + _flush_range(in, offset, size); + bool checkeof = false; r = _read_sync(f, offset, size, bl, &checkeof); if (r < 0) @@ -7842,6 +7850,9 @@ int Client::_write(Fh *f, int64_t offset, uint64_t size, const char *buf, if (r < 0) return r; + if (f->flags & O_DIRECT) + have &= ~CEPH_CAP_FILE_BUFFER; + ldout(cct, 10) << " snaprealm " << *in->snaprealm << dendl; Mutex uninline_flock("Clinet::_write_uninline_data flock"); @@ -7903,6 +7914,9 @@ int Client::_write(Fh *f, int64_t offset, uint64_t size, const char *buf, _flush_range(in, offset, size); } } else { + if (f->flags & O_DIRECT) + _flush_range(in, offset, size); + // simple, non-atomic sync write Mutex flock("Client::_write flock"); Cond cond; -- 2.47.3