Dump some statistics when the cleaner runs
[bluesky.git] / nfs3 / nfs3.c
index 2a5b789..918da63 100644 (file)
@@ -428,9 +428,15 @@ void nfsproc3_write_3_svc(write3args *argp, RPCRequest *req)
     encode_fattr3(&wcc.after.post_op_attr_u.attributes, inode);
     result.write3res_u.resok.file_wcc = wcc;
     result.write3res_u.resok.count = argp->count;
-    result.write3res_u.resok.committed = FILE_SYNC;
+    result.write3res_u.resok.committed = UNSTABLE;
+    memcpy(result.write3res_u.resok.verf,
+           nfsd_instance_verf_cookie, NFS3_WRITEVERFSIZE);
+
+    if (argp->stable != UNSTABLE) {
+        bluesky_inode_do_sync(inode);
+        result.write3res_u.resok.committed = FILE_SYNC;
+    }
 
-    bluesky_inode_do_sync(inode);
     g_mutex_unlock(inode->lock);
 
     async_rpc_send_reply(req, &result);
@@ -489,6 +495,7 @@ void nfsproc3_create_3_svc(create3args *argp, RPCRequest *req)
     bluesky_directory_insert(dir, argp->where.name, file->inum);
 
     bluesky_inode_update_ctime(dir, TRUE);
+    bluesky_inode_update_ctime(file, FALSE);
 
     wcc.after.present = TRUE;
     encode_fattr3(&wcc.after.post_op_attr_u.attributes, dir);
@@ -564,6 +571,7 @@ void nfsproc3_mkdir_3_svc(mkdir3args *argp, RPCRequest *req)
     set_attributes(file, &argp->attributes);
 
     bluesky_inode_update_ctime(dir, TRUE);
+    bluesky_inode_update_ctime(file, FALSE);
 
     wcc.after.present = TRUE;
     encode_fattr3(&wcc.after.post_op_attr_u.attributes, dir);
@@ -637,6 +645,7 @@ void nfsproc3_symlink_3_svc(symlink3args *argp, RPCRequest *req)
     bluesky_directory_insert(dir, argp->where.name, file->inum);
 
     bluesky_inode_update_ctime(dir, TRUE);
+    bluesky_inode_update_ctime(file, FALSE);
 
     wcc.after.present = TRUE;
     encode_fattr3(&wcc.after.post_op_attr_u.attributes, dir);
@@ -1003,9 +1012,7 @@ void nfsproc3_readdirplus_3_svc(readdirplus3args *argp, RPCRequest *req)
            && dircount + attrcount <= argp->maxcount)
     {
         BlueSkyDirent *d = g_sequence_get(i);
-        BlueSkyInode *inode = bluesky_get_inode(fs, d->inum);
-        if (inode != NULL)
-            bluesky_inode_unref(inode);
+        bluesky_inode_prefetch(fs, d->inum);
         dircount += 24 + ((strlen(d->name) + 3) & ~3);
         attrcount += 88 + 8 + 8;
         i = g_sequence_iter_next(i);
@@ -1160,6 +1167,8 @@ void nfsproc3_commit_3_svc(commit3args *argp, RPCRequest *req)
 
     result.commit3res_u.resok.file_wcc.after.present = TRUE;
     encode_fattr3(&result.commit3res_u.resok.file_wcc.after.post_op_attr_u.attributes, inode);
+    memcpy(result.commit3res_u.resok.verf,
+           nfsd_instance_verf_cookie, NFS3_WRITEVERFSIZE);
 
     g_mutex_unlock(inode->lock);