aboutsummaryrefslogtreecommitdiffstats
path: root/fs/ceph/file.c
diff options
context:
space:
mode:
authorSage Weil <sage@newdream.net>2010-05-26 17:31:27 -0400
committerSage Weil <sage@newdream.net>2010-08-01 23:11:39 -0400
commit33caad324b88f75f42d836735d86feaafb3b40cf (patch)
tree57e50ce5bdc181ea296191784c4d57999c51207e /fs/ceph/file.c
parent8c6e9229fc1989cf263a6fcd4ff406d7f473f966 (diff)
ceph: perform lazy writes when file mode and caps permit
If we have marked a file as "lazy" (using the ceph ioctl), perform buffered writes when the MDS caps allow it. Signed-off-by: Sage Weil <sage@newdream.net>
Diffstat (limited to 'fs/ceph/file.c')
-rw-r--r--fs/ceph/file.c12
1 files changed, 8 insertions, 4 deletions
diff --git a/fs/ceph/file.c b/fs/ceph/file.c
index 7c08698fad3e..85c86ed5f4c0 100644
--- a/fs/ceph/file.c
+++ b/fs/ceph/file.c
@@ -807,11 +807,12 @@ static ssize_t ceph_aio_write(struct kiocb *iocb, const struct iovec *iov,
807 unsigned long nr_segs, loff_t pos) 807 unsigned long nr_segs, loff_t pos)
808{ 808{
809 struct file *file = iocb->ki_filp; 809 struct file *file = iocb->ki_filp;
810 struct ceph_file_info *fi = file->private_data;
810 struct inode *inode = file->f_dentry->d_inode; 811 struct inode *inode = file->f_dentry->d_inode;
811 struct ceph_inode_info *ci = ceph_inode(inode); 812 struct ceph_inode_info *ci = ceph_inode(inode);
812 struct ceph_osd_client *osdc = &ceph_sb_to_client(inode->i_sb)->osdc; 813 struct ceph_osd_client *osdc = &ceph_sb_to_client(inode->i_sb)->osdc;
813 loff_t endoff = pos + iov->iov_len; 814 loff_t endoff = pos + iov->iov_len;
814 int got = 0; 815 int want, got = 0;
815 int ret, err; 816 int ret, err;
816 817
817 if (ceph_snap(inode) != CEPH_NOSNAP) 818 if (ceph_snap(inode) != CEPH_NOSNAP)
@@ -824,8 +825,11 @@ retry_snap:
824 dout("aio_write %p %llx.%llx %llu~%u getting caps. i_size %llu\n", 825 dout("aio_write %p %llx.%llx %llu~%u getting caps. i_size %llu\n",
825 inode, ceph_vinop(inode), pos, (unsigned)iov->iov_len, 826 inode, ceph_vinop(inode), pos, (unsigned)iov->iov_len,
826 inode->i_size); 827 inode->i_size);
827 ret = ceph_get_caps(ci, CEPH_CAP_FILE_WR, CEPH_CAP_FILE_BUFFER, 828 if (fi->fmode & CEPH_FILE_MODE_LAZY)
828 &got, endoff); 829 want = CEPH_CAP_FILE_BUFFER | CEPH_CAP_FILE_LAZYIO;
830 else
831 want = CEPH_CAP_FILE_BUFFER;
832 ret = ceph_get_caps(ci, CEPH_CAP_FILE_WR, want, &got, endoff);
829 if (ret < 0) 833 if (ret < 0)
830 goto out; 834 goto out;
831 835
@@ -833,7 +837,7 @@ retry_snap:
833 inode, ceph_vinop(inode), pos, (unsigned)iov->iov_len, 837 inode, ceph_vinop(inode), pos, (unsigned)iov->iov_len,
834 ceph_cap_string(got)); 838 ceph_cap_string(got));
835 839
836 if ((got & CEPH_CAP_FILE_BUFFER) == 0 || 840 if ((got & (CEPH_CAP_FILE_BUFFER|CEPH_CAP_FILE_LAZYIO)) == 0 ||
837 (iocb->ki_filp->f_flags & O_DIRECT) || 841 (iocb->ki_filp->f_flags & O_DIRECT) ||
838 (inode->i_sb->s_flags & MS_SYNCHRONOUS)) { 842 (inode->i_sb->s_flags & MS_SYNCHRONOUS)) {
839 ret = ceph_sync_write(file, iov->iov_base, iov->iov_len, 843 ret = ceph_sync_write(file, iov->iov_base, iov->iov_len,