Support for sync operations on an inode.
[bluesky.git] / nfs3 / nfs3.c
index 72ec9cb..1b7e594 100644 (file)
@@ -1074,5 +1074,22 @@ void nfsproc3_commit_3_svc(commit3args *argp, RPCRequest *req)
 
     result.status = NFS3ERR_NOTSUPP;
 
+    BlueSkyInode *inode = lookup_fh(req, &argp->file);
+    if (inode == NULL) {
+        result.status = NFS3ERR_STALE;
+        async_rpc_send_reply(req, &result);
+        return;
+    }
+
+    g_mutex_lock(inode->lock);
+    encode_pre_wcc(&result.commit3res_u.resok.file_wcc, inode);
+
+    bluesky_inode_do_sync(inode);
+
+    result.commit3res_u.resok.file_wcc.after.present = TRUE;
+    encode_fattr3(&result.commit3res_u.resok.file_wcc.after.post_op_attr_u.attributes, inode);
+
+    g_mutex_unlock(inode->lock);
+
     async_rpc_send_reply(req, &result);
 }