diff options
author | Yehuda Sadeh <yehuda@hq.newdream.net> | 2009-02-19 09:43:28 -0800 |
---|---|---|
committer | Yehuda Sadeh <yehuda@hq.newdream.net> | 2009-02-19 11:52:10 -0800 |
commit | 0c46645be30c2845128ad9a92e97f73a3ca1837f (patch) | |
tree | e6564333b392b184850fdd030c9f1faef5873f98 | |
parent | 2d17b3a0d2cea27858d0970ed67d857b1d6f3259 (diff) | |
download | ceph-0c46645be30c2845128ad9a92e97f73a3ca1837f.tar.gz |
kclient: sync writeout when not pdflush
-rw-r--r-- | src/kernel/addr.c | 3 | ||||
-rw-r--r-- | src/kernel/file.c | 10 | ||||
-rw-r--r-- | src/kernel/inode.c | 1 | ||||
-rw-r--r-- | src/kernel/super.h | 2 |
4 files changed, 3 insertions, 13 deletions
diff --git a/src/kernel/addr.c b/src/kernel/addr.c index ad2e46d8363..baa99a00e50 100644 --- a/src/kernel/addr.c +++ b/src/kernel/addr.c @@ -548,7 +548,7 @@ static int ceph_writepages_start(struct address_space *mapping, int rc = 0; unsigned wsize = 1 << inode->i_blkbits; struct ceph_osd_request *req = NULL; - int do_sync = atomic_read(&ci->i_want_sync_writeout); + int do_sync = !current_is_pdflush(); if (ceph_caps_revoking(ci) & CEPH_CAP_FILE_WRBUFFER) do_sync = 1; @@ -712,6 +712,7 @@ get_more_pages: snapc, do_sync, ci->i_truncate_seq, ci->i_truncate_size); + dout(1, "do_sync(2)=%d\n", do_sync); max_pages = req->r_num_pages; pages = req->r_pages; req->r_callback = writepages_finish; diff --git a/src/kernel/file.c b/src/kernel/file.c index 41bfff5ddb4..16aa67cbf2d 100644 --- a/src/kernel/file.c +++ b/src/kernel/file.c @@ -372,7 +372,6 @@ static ssize_t ceph_aio_write(struct kiocb *iocb, const struct iovec *iov, loff_t endoff = pos + iov->iov_len; int got = 0; int ret; - int do_sync = (file->f_flags & O_SYNC) || IS_SYNC(inode); if (ceph_snap(inode) != CEPH_NOSNAP) return -EROFS; @@ -399,16 +398,12 @@ retry_snap: ret = ceph_sync_write(file, iov->iov_base, iov->iov_len, &iocb->ki_pos); } else { - if (do_sync) - atomic_inc(&ci->i_want_sync_writeout); ret = generic_file_aio_write(iocb, iov, nr_segs, pos); if (ret >= 0 && ceph_osdmap_flag(osdc->osdmap, CEPH_OSDMAP_NEARFULL)) { ret = sync_page_range(inode, mapping, pos, ret); } - if (do_sync) - atomic_dec(&ci->i_want_sync_writeout); } if (ret >= 0) ci->i_dirty_caps |= CEPH_CAP_FILE_WR; @@ -430,13 +425,10 @@ out: static int ceph_fsync(struct file *file, struct dentry *dentry, int datasync) { struct inode *inode = dentry->d_inode; - struct ceph_inode_info *ci = ceph_inode(inode); int ret; dout(10, "fsync on inode %p\n", inode); - atomic_inc(&ci->i_want_sync_writeout); - ret = write_inode_now(inode, 1); - atomic_dec(&ci->i_want_sync_writeout); + ret = filemap_write_and_wait(inode->i_mapping); if (ret < 0) return ret; /* diff --git a/src/kernel/inode.c b/src/kernel/inode.c index f0ac9d87e51..dc1a9949c3c 100644 --- a/src/kernel/inode.c +++ b/src/kernel/inode.c @@ -287,7 +287,6 @@ struct inode *ceph_alloc_inode(struct super_block *sb) ci->i_wrbuffer_ref_head = 0; ci->i_rdcache_gen = 0; ci->i_rdcache_revoking = 0; - atomic_set(&ci->i_want_sync_writeout, 0); ci->i_snap_realm = NULL; INIT_LIST_HEAD(&ci->i_snap_realm_item); diff --git a/src/kernel/super.h b/src/kernel/super.h index a7c9cf3b524..8251811dd7f 100644 --- a/src/kernel/super.h +++ b/src/kernel/super.h @@ -279,8 +279,6 @@ struct ceph_inode_info { pages. */ u32 i_rdcache_revoking; /* RDCACHE gen to async invalidate, if any */ - atomic_t i_want_sync_writeout; /* non-zero if writepages should sync */ - struct ceph_snap_realm *i_snap_realm; /* snap realm (if caps) */ struct list_head i_snap_realm_item; struct list_head i_snap_flush_item; |