]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
kclient: set mtime on writes
authorSage Weil <sage@newdream.net>
Mon, 23 Mar 2009 21:48:39 +0000 (14:48 -0700)
committerSage Weil <sage@newdream.net>
Mon, 23 Mar 2009 21:48:39 +0000 (14:48 -0700)
Since we don't track per-page dirty timestamps or anything like
that, we just use the inode mtime for writeback, and the current
time for sync writes.

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

index 90989c38c77b6803ef77b1b8b7f10f0251e847ac..116e0935200c13ac7f0177a638bfa739c8e3b0c6 100644 (file)
@@ -428,6 +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,
+                                  &inode->i_mtime,
                                   &page, 1, 0, 0);
        if (err < 0) {
                dout(20, "writepage setting page error %p\n", page);
@@ -737,7 +738,8 @@ get_more_pages:
                                                    CEPH_OSD_OP_ONDISK,
                                            snapc, do_sync,
                                            ci->i_truncate_seq,
-                                           ci->i_truncate_size);
+                                           ci->i_truncate_size,
+                                           &inode->i_mtime);
                                max_pages = req->r_num_pages;
 
                                rc = -ENOMEM;
index 52bcd1f2fd84518a199e210d8181976f1464142e..9bd5fa7a254ae8dbf0274a4e40f1a9af3ad8f842 100644 (file)
@@ -500,6 +500,7 @@ static ssize_t ceph_sync_write(struct file *file, const char __user *data,
        int flags;
        int do_sync = 0;
        int ret;
+       struct timespec mtime = CURRENT_TIME;
 
        if (ceph_snap(file->f_dentry->d_inode) != CEPH_NOSNAP)
                return -EROFS;
@@ -531,7 +532,8 @@ more:
                                    CEPH_OSD_OP_WRITE, flags,
                                    ci->i_snap_realm->cached_context,
                                    do_sync,
-                                   ci->i_truncate_seq, ci->i_truncate_size);
+                                   ci->i_truncate_seq, ci->i_truncate_size,
+                                   &mtime);
        if (IS_ERR(req))
                return PTR_ERR(req);
 
index 2932adbad3f64c9174579f28c0565f62a8055c07..7294b485a9d42344cf6f001916e831d1745e8b09 100644 (file)
@@ -90,7 +90,8 @@ struct ceph_osd_request *ceph_osdc_new_request(struct ceph_osd_client *osdc,
                                               struct ceph_snap_context *snapc,
                                               int do_sync,
                                               u32 truncate_seq,
-                                              u64 truncate_size)
+                                              u64 truncate_size,
+                                              struct timespec *mtime)
 {
        struct ceph_osd_request *req;
        struct ceph_msg *msg;
@@ -130,6 +131,8 @@ struct ceph_osd_request *ceph_osdc_new_request(struct ceph_osd_client *osdc,
 
        head->client_inc = cpu_to_le32(1); /* always, for now. */
        head->flags = cpu_to_le32(flags);
+       if (flags & CEPH_OSD_OP_MODIFY)
+               ceph_encode_timespec(&head->mtime, mtime);
        head->num_ops = cpu_to_le16(num_op);
        op->op = cpu_to_le16(opcode);
 
@@ -864,7 +867,7 @@ int ceph_osdc_readpages(struct ceph_osd_client *osdc,
             vino.snap, off, len);
        req = ceph_osdc_new_request(osdc, layout, vino, off, &len,
                                    CEPH_OSD_OP_READ, 0, NULL, 0,
-                                   truncate_seq, truncate_size);
+                                   truncate_seq, truncate_size, NULL);
        if (IS_ERR(req))
                return PTR_ERR(req);
 
@@ -928,6 +931,7 @@ int ceph_osdc_writepages(struct ceph_osd_client *osdc, struct ceph_vino vino,
                         struct ceph_snap_context *snapc,
                         u64 off, u64 len,
                         u32 truncate_seq, u64 truncate_size,
+                        struct timespec *mtime,
                         struct page **pages, int num_pages,
                         int flags, int do_sync)
 {
@@ -940,7 +944,7 @@ int ceph_osdc_writepages(struct ceph_osd_client *osdc, struct ceph_vino vino,
                                    flags | CEPH_OSD_OP_ONDISK |
                                    CEPH_OSD_OP_MODIFY,
                                    snapc, do_sync,
-                                   truncate_seq, truncate_size);
+                                   truncate_seq, truncate_size, mtime);
        if (IS_ERR(req))
                return PTR_ERR(req);
 
index 75d94aa0a7f95ce1071c1c3470cae22579c8885b..f0c34e1d2b412d761c06839b91018786097f1460 100644 (file)
@@ -114,7 +114,8 @@ extern struct ceph_osd_request *ceph_osdc_new_request(struct ceph_osd_client *,
                                      u64 offset, u64 *len, int op, int flags,
                                      struct ceph_snap_context *snapc,
                                      int do_sync, u32 truncate_seq,
-                                     u64 truncate_size);
+                                     u64 truncate_size,
+                                     struct timespec *mtime);
 
 static inline void ceph_osdc_get_request(struct ceph_osd_request *req)
 {
@@ -143,6 +144,7 @@ extern int ceph_osdc_writepages(struct ceph_osd_client *osdc,
                                struct ceph_snap_context *sc,
                                u64 off, u64 len,
                                u32 truncate_seq, u64 truncate_size,
+                               struct timespec *mtime,
                                struct page **pages, int nr_pages,
                                int flags, int do_sync);