From 0fa04fc198c02bdd75f638bed51207130c424657 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Fri, 13 Mar 2009 13:58:12 -0700 Subject: [PATCH] kclient: set osd op sync flag on O_SYNC|O_DIRECT sync writes Otherwise they will have a high latency from the OSD. --- src/kernel/addr.c | 2 +- src/kernel/file.c | 5 ++++- src/kernel/osd_client.c | 4 ++-- src/kernel/osd_client.h | 2 +- 4 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/kernel/addr.c b/src/kernel/addr.c index 9d667d76d51f6..b02944b3bb039 100644 --- a/src/kernel/addr.c +++ b/src/kernel/addr.c @@ -428,7 +428,7 @@ static int writepage_nounlock(struct page *page, struct writeback_control *wbc) &ci->i_layout, snapc, page_off, len, ci->i_truncate_seq, ci->i_truncate_size, - &page, 1, 0); + &page, 1, 0, 0); if (err < 0) { dout(20, "writepage setting page error %p\n", page); SetPageError(page); diff --git a/src/kernel/file.c b/src/kernel/file.c index 3d439a3fd35ee..f4c3eeede339b 100644 --- a/src/kernel/file.c +++ b/src/kernel/file.c @@ -402,6 +402,7 @@ static ssize_t ceph_sync_write(struct file *file, const char __user *data, long long unsigned pos; int written = 0; int flags; + int do_sync = 0; int ret; if (ceph_snap(file->f_dentry->d_inode) != CEPH_NOSNAP) @@ -432,6 +433,8 @@ static ssize_t ceph_sync_write(struct file *file, const char __user *data, flags = CEPH_OSD_OP_ORDERSNAP; if ((file->f_flags & (O_SYNC|O_DIRECT)) == 0) flags |= CEPH_OSD_OP_ACK; + else + do_sync = 1; /* * we may need to do multiple writes here if we span an object @@ -447,7 +450,7 @@ more: pos, left, ci->i_truncate_seq, ci->i_truncate_size, page_pos, pages_left, - flags); + flags, do_sync); if (ret > 0) { int didpages = ((pos & ~PAGE_CACHE_MASK) + ret) >> PAGE_CACHE_SHIFT; diff --git a/src/kernel/osd_client.c b/src/kernel/osd_client.c index 241addb42f9e6..96e58893f5d92 100644 --- a/src/kernel/osd_client.c +++ b/src/kernel/osd_client.c @@ -848,7 +848,7 @@ int ceph_osdc_writepages(struct ceph_osd_client *osdc, struct ceph_vino vino, u64 off, u64 len, u32 truncate_seq, u64 truncate_size, struct page **pages, int num_pages, - int flags) + int flags, int do_sync) { struct ceph_msg *reqm; struct ceph_osd_request *req; @@ -859,7 +859,7 @@ int ceph_osdc_writepages(struct ceph_osd_client *osdc, struct ceph_vino vino, CEPH_OSD_OP_WRITE, flags | CEPH_OSD_OP_ONDISK | CEPH_OSD_OP_MODIFY, - snapc, 0, + snapc, do_sync, truncate_seq, truncate_size); if (IS_ERR(req)) return PTR_ERR(req); diff --git a/src/kernel/osd_client.h b/src/kernel/osd_client.h index 74ed43b7fe166..ea66bd021d408 100644 --- a/src/kernel/osd_client.h +++ b/src/kernel/osd_client.h @@ -127,7 +127,7 @@ extern int ceph_osdc_writepages(struct ceph_osd_client *osdc, u64 off, u64 len, u32 truncate_seq, u64 truncate_size, struct page **pages, int nr_pages, - int flags); + int flags, int do_sync); extern int ceph_osdc_writepages_start(struct ceph_osd_client *osdc, struct ceph_osd_request *req, u64 len, -- 2.47.3