9p: Add datasync to client side TFSYNC/RFSYNC for dotl
authorVenkateswararao Jujjuri (JV) <jvrao@linux.vnet.ibm.com>
Fri, 22 Oct 2010 17:13:12 +0000 (10:13 -0700)
committerEric Van Hensbergen <ericvh@gmail.com>
Thu, 28 Oct 2010 14:08:49 +0000 (09:08 -0500)
SYNOPSIS
    size[4] Tfsync tag[2] fid[4] datasync[4]

    size[4] Rfsync tag[2]

DESCRIPTION

    The Tfsync transaction transfers ("flushes") all modified in-core data of
    file identified by fid to the disk device (or other  permanent  storage
    device)  where that  file  resides.

    If datasync flag is specified data will be fleshed but does not flush
    modified metadata unless  that  metadata  is  needed  in order to allow a
    subsequent data retrieval to be correctly handled.

Signed-off-by: Venkateswararao Jujjuri <jvrao@linux.vnet.ibm.com>
Signed-off-by: Eric Van Hensbergen <ericvh@gmail.com>
fs/9p/v9fs_vfs.h
fs/9p/vfs_dir.c
fs/9p/vfs_file.c
include/net/9p/client.h
net/9p/client.c

index d26db1932f7a44a8ce5cbb0185c72af6143112e0..bab0eac873f4075ca1f3fceb89db58e20ba550be 100644 (file)
@@ -65,5 +65,6 @@ int v9fs_uflags2omode(int uflags, int extended);
 ssize_t v9fs_file_readn(struct file *, char *, char __user *, u32, u64);
 void v9fs_blank_wstat(struct p9_wstat *wstat);
 int v9fs_vfs_setattr_dotl(struct dentry *, struct iattr *);
+int v9fs_file_fsync_dotl(struct file *filp, int datasync);
 
 #define P9_LOCK_TIMEOUT (30*HZ)
index 170f5bb8ebe08a361cd3aa241c87abb8934e5755..b84ebe8cefeda6127a59881ed6fef24863f1a5fb 100644 (file)
@@ -315,4 +315,5 @@ const struct file_operations v9fs_dir_operations_dotl = {
        .readdir = v9fs_dir_readdir_dotl,
        .open = v9fs_file_open,
        .release = v9fs_dir_release,
+        .fsync = v9fs_file_fsync_dotl,
 };
index 3a4352f23a984d3656420523fe34f2642c232e78..240c306743961d000909254f6e1278fa542d3e1e 100644 (file)
@@ -491,7 +491,7 @@ static int v9fs_file_fsync(struct file *filp, int datasync)
        return retval;
 }
 
-static int v9fs_file_fsync_dotl(struct file *filp, int datasync)
+int v9fs_file_fsync_dotl(struct file *filp, int datasync)
 {
        struct p9_fid *fid;
        int retval;
@@ -501,7 +501,7 @@ static int v9fs_file_fsync_dotl(struct file *filp, int datasync)
 
        fid = filp->private_data;
 
-       retval = p9_client_fsync(fid);
+       retval = p9_client_fsync(fid, datasync);
        return retval;
 }
 
index 335b088e767221f4e3469e95ce77b7d5e5397467..83ba6a4d58a3843f0e342747cc7c7eeedac134ba 100644 (file)
@@ -229,7 +229,7 @@ int p9_client_symlink(struct p9_fid *fid, char *name, char *symname, gid_t gid,
 int p9_client_create_dotl(struct p9_fid *ofid, char *name, u32 flags, u32 mode,
                gid_t gid, struct p9_qid *qid);
 int p9_client_clunk(struct p9_fid *fid);
-int p9_client_fsync(struct p9_fid *fid);
+int p9_client_fsync(struct p9_fid *fid, int datasync);
 int p9_client_remove(struct p9_fid *fid);
 int p9_client_read(struct p9_fid *fid, char *data, char __user *udata,
                                                        u64 offset, u32 count);
index e3cfdff373273944f3e0abac1a8798ab0ef1154a..8df80fb86f23631d2c79706b408bbcdd53aee105 100644 (file)
@@ -1165,17 +1165,18 @@ int p9_client_link(struct p9_fid *dfid, struct p9_fid *oldfid, char *newname)
 }
 EXPORT_SYMBOL(p9_client_link);
 
-int p9_client_fsync(struct p9_fid *fid)
+int p9_client_fsync(struct p9_fid *fid, int datasync)
 {
        int err;
        struct p9_client *clnt;
        struct p9_req_t *req;
 
-       P9_DPRINTK(P9_DEBUG_9P, ">>> TFSYNC fid %d\n", fid->fid);
+       P9_DPRINTK(P9_DEBUG_9P, ">>> TFSYNC fid %d datasync:%d\n",
+                       fid->fid, datasync);
        err = 0;
        clnt = fid->clnt;
 
-       req = p9_client_rpc(clnt, P9_TFSYNC, "d", fid->fid);
+       req = p9_client_rpc(clnt, P9_TFSYNC, "dd", fid->fid, datasync);
        if (IS_ERR(req)) {
                err = PTR_ERR(req);
                goto error;