From eeb4b175701bad9cc5d3f5d1675f124517a99605 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Mon, 23 Mar 2009 14:48:39 -0700 Subject: [PATCH] kclient: set mtime on writes 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 | 4 +++- src/kernel/file.c | 4 +++- src/kernel/osd_client.c | 10 +++++++--- src/kernel/osd_client.h | 4 +++- 4 files changed, 16 insertions(+), 6 deletions(-) diff --git a/src/kernel/addr.c b/src/kernel/addr.c index 90989c38c77b6..116e0935200c1 100644 --- a/src/kernel/addr.c +++ b/src/kernel/addr.c @@ -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; diff --git a/src/kernel/file.c b/src/kernel/file.c index 52bcd1f2fd845..9bd5fa7a254ae 100644 --- a/src/kernel/file.c +++ b/src/kernel/file.c @@ -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); diff --git a/src/kernel/osd_client.c b/src/kernel/osd_client.c index 2932adbad3f64..7294b485a9d42 100644 --- a/src/kernel/osd_client.c +++ b/src/kernel/osd_client.c @@ -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); diff --git a/src/kernel/osd_client.h b/src/kernel/osd_client.h index 75d94aa0a7f95..f0c34e1d2b412 100644 --- a/src/kernel/osd_client.h +++ b/src/kernel/osd_client.h @@ -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); -- 2.39.5