]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
kclient: set osd op sync flag on O_SYNC|O_DIRECT sync writes
authorSage Weil <sage@newdream.net>
Fri, 13 Mar 2009 20:58:12 +0000 (13:58 -0700)
committerSage Weil <sage@newdream.net>
Fri, 13 Mar 2009 20:58:12 +0000 (13:58 -0700)
Otherwise they will have a high latency from the OSD.

src/kernel/addr.c
src/kernel/file.c
src/kernel/osd_client.c
src/kernel/osd_client.h

index 9d667d76d51f6d7a315c09a953fc316acf9d5651..b02944b3bb0391999a99e4cd466b4b475e879e13 100644 (file)
@@ -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);
index 3d439a3fd35ee69f34111ee24766e28ebbea5ef5..f4c3eeede339ba72c8542b79a83d2d4b97c3a01c 100644 (file)
@@ -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;
index 241addb42f9e68823ea1775aa55e8ca6620ea091..96e58893f5d926182c58a15c3612668070ed9299 100644 (file)
@@ -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);
index 74ed43b7fe166692db9422be564599b4bd5d25d0..ea66bd021d408e43a8214b04d53b13c08fc7ac61 100644 (file)
@@ -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,