summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYehuda Sadeh <yehuda@hq.newdream.net>2009-02-19 09:43:28 -0800
committerYehuda Sadeh <yehuda@hq.newdream.net>2009-02-19 11:52:10 -0800
commit0c46645be30c2845128ad9a92e97f73a3ca1837f (patch)
treee6564333b392b184850fdd030c9f1faef5873f98
parent2d17b3a0d2cea27858d0970ed67d857b1d6f3259 (diff)
downloadceph-0c46645be30c2845128ad9a92e97f73a3ca1837f.tar.gz
kclient: sync writeout when not pdflush
-rw-r--r--src/kernel/addr.c3
-rw-r--r--src/kernel/file.c10
-rw-r--r--src/kernel/inode.c1
-rw-r--r--src/kernel/super.h2
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;