fs/9p: Open writeback fid in O_SYNC mode
Aneesh Kumar K.V [Tue, 8 Mar 2011 11:09:49 +0000 (16:09 +0530)]
Older version of protocol don't support tsyncfs operation.
So for them force a O_SYNC flag on the server

Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
Signed-off-by: Venkateswararao Jujjuri <jvrao@linux.vnet.ibm.com>
Signed-off-by: Eric Van Hensbergen <ericvh@gmail.com>

fs/9p/fid.c

index cd63e00..99a1a7b 100644 (file)
@@ -286,9 +286,11 @@ static struct p9_fid *v9fs_fid_clone_with_uid(struct dentry *dentry, uid_t uid)
 
 struct p9_fid *v9fs_writeback_fid(struct dentry *dentry)
 {
-       int err;
+       int err, flags;
        struct p9_fid *fid;
+       struct v9fs_session_info *v9ses;
 
+       v9ses = v9fs_inode2v9ses(dentry->d_inode);
        fid = v9fs_fid_clone_with_uid(dentry, 0);
        if (IS_ERR(fid))
                goto error_out;
@@ -297,8 +299,17 @@ struct p9_fid *v9fs_writeback_fid(struct dentry *dentry)
         * dirty pages. We always request for the open fid in read-write
         * mode so that a partial page write which result in page
         * read can work.
+        *
+        * we don't have a tsyncfs operation for older version
+        * of protocol. So make sure the write back fid is
+        * opened in O_SYNC mode.
         */
-       err = p9_client_open(fid, O_RDWR);
+       if (!v9fs_proto_dotl(v9ses))
+               flags = O_RDWR | O_SYNC;
+       else
+               flags = O_RDWR;
+
+       err = p9_client_open(fid, flags);
        if (err < 0) {
                p9_client_clunk(fid);
                fid = ERR_PTR(err);