Hi Yehuda,

Thanks for the info on the fix. I'll incorporate it into the code and rerun the 
experiments.
It also seems that the code at that location became a bit more complex - new 
#if occurred:

#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 32)

And consequently the code under #else should be fixed as well.

Thanks,

Roman

From: Yehuda Sadeh Weinraub [mailto:yehud...@gmail.com]
Sent: Tuesday, February 23, 2010 8:11 PM
To: Talyansky, Roman
Cc: Sage Weil; ceph-devel@lists.sourceforge.net
Subject: Re: [ceph-devel] Write operation is stuck


On Tue, Feb 23, 2010 at 6:11 AM, Talyansky, Roman 
<roman.talyan...@sap.com<mailto:roman.talyan...@sap.com>> wrote:
Hi Sage,

As you advised us, we switched to the release 0.19 of ceph and ran into another 
bug in the ceph client. When writing to a file with the O_SYNC flag,  "0" is 
always returned although the data is written to disk.
This poses a problem in our benchmark which uses the return value as number of 
bytes written. Also it seems that such behavior infringes the POSIX write() 
contract.

Yeah, thanks. A fix was pushed to the unstable branch. We will probably start 
maintaining a stable version that will contain such fixes, but you can apply 
this in the mean time:

diff --git a/fs/ceph/file.c b/fs/ceph/file.c
index 2c4ae44..88932c9 100644
--- a/fs/ceph/file.c
+++ b/fs/ceph/file.c
@@ -807,7 +807,7 @@ static ssize_t ceph_aio_write(struct kiocb *iocb, const 
struct iovec *iov,
        struct ceph_osd_client *osdc = &ceph_client(inode->i_sb)->osdc;
        loff_t endoff = pos + iov->iov_len;
        int got = 0;
-       int ret;
+       int ret, err;

        if (ceph_snap(inode) != CEPH_NOSNAP)
                return -EROFS;
@@ -838,9 +838,12 @@ retry_snap:

                if ((ret >= 0 || ret == -EIOCBQUEUED) &&
                    ((file->f_flags & O_SYNC) || IS_SYNC(file->f_mapping->host)
-                    || ceph_osdmap_flag(osdc->osdmap, CEPH_OSDMAP_NEARFULL)))
-                       ret = vfs_fsync_range(file, file->f_path.dentry,
+                    || ceph_osdmap_flag(osdc->osdmap, CEPH_OSDMAP_NEARFULL))) {
+                       err = vfs_fsync_range(file, file->f_path.dentry,
                                              pos, pos + ret - 1, 1);
+                       if (err < 0)
+                               ret = err;
+               }
        }
        if (ret >= 0) {
                spin_lock(&inode->i_lock);



Yehuda
------------------------------------------------------------------------------
Download Intel&#174; Parallel Studio Eval
Try the new software tools for yourself. Speed compiling, find bugs
proactively, and fine-tune applications for parallel performance.
See why Intel Parallel Studio got high marks during beta.
http://p.sf.net/sfu/intel-sw-dev
_______________________________________________
Ceph-devel mailing list
Ceph-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/ceph-devel

Reply via email to