Add UDP transport support to the NFS server.
[bluesky.git] / nfs3 / nfs3.c
index 42ac46c..818cd4b 100644 (file)
@@ -9,6 +9,9 @@
 
 extern BlueSkyFS *fs;
 
+#define NFS_BLOCKSIZE 32768
+#define NFS_MAXSIZE (1 << 20)
+
 /* Check that a string is a valid file name.  We require that it be valid
  * UTF-8, that it not be empty, and that it not contain embedded forward
  * slashes.  Also checks that the length of the string is not more than the
@@ -243,10 +246,14 @@ void nfsproc3_lookup_3_svc(diropargs3 *argp, RPCRequest *req)
         async_rpc_send_reply(req, &result);
         return;
     }
+
+    result.lookup3res_u.resok.dir_attributes.present = TRUE;
+    encode_fattr3(&result.lookup3res_u.resok.dir_attributes.post_op_attr_u.attributes, dir);
+    g_mutex_unlock(dir->lock);
+
     BlueSkyInode *inode = bluesky_get_inode(fs, inum);
     if (inode == NULL) {
         result.status = NFS3ERR_NOENT;
-        g_mutex_unlock(dir->lock);
         async_rpc_send_reply(req, &result);
         return;
     }
@@ -254,8 +261,6 @@ void nfsproc3_lookup_3_svc(diropargs3 *argp, RPCRequest *req)
     schedule_inode_unref(req, inode);
 
     result.status = NFS3_OK;
-    result.lookup3res_u.resok.dir_attributes.present = TRUE;
-    encode_fattr3(&result.lookup3res_u.resok.dir_attributes.post_op_attr_u.attributes, dir);
     result.lookup3res_u.resok.obj_attributes.present = TRUE;
     encode_fattr3(&result.lookup3res_u.resok.obj_attributes.post_op_attr_u.attributes, inode);
 
@@ -265,7 +270,6 @@ void nfsproc3_lookup_3_svc(diropargs3 *argp, RPCRequest *req)
     result.lookup3res_u.resok.object.data.data_val = (char *)&fh_bytes;
 
     g_mutex_unlock(inode->lock);
-    g_mutex_unlock(dir->lock);
     async_rpc_send_reply(req, &result);
 }
 
@@ -322,7 +326,7 @@ void nfsproc3_read_3_svc(read3args *argp, RPCRequest *req)
 {
     read3res result;
     memset(&result, 0, sizeof(result));
-    char buf[32768];
+    char buf[NFS_MAXSIZE];
 
     BlueSkyInode *inode = lookup_fh(req, &argp->file);
     if (inode == NULL) {
@@ -339,6 +343,7 @@ void nfsproc3_read_3_svc(read3args *argp, RPCRequest *req)
         count = 0;
         result.read3res_u.resok.eof = TRUE;
     } else {
+        count = MIN(count, NFS_MAXSIZE);
         count = MIN(count, inode->size - argp->offset);
         if (argp->offset + count == inode->size)
             result.read3res_u.resok.eof = TRUE;
@@ -1047,13 +1052,13 @@ void nfsproc3_fsinfo_3_svc(nfs_fh3 *argp, RPCRequest *req)
     result.status = NFS3_OK;
     result.fsinfo3res_u.resok.obj_attributes.present = TRUE;
     encode_fattr3(&result.fsinfo3res_u.resok.obj_attributes.post_op_attr_u.attributes, inode);
-    result.fsinfo3res_u.resok.rtmax = 32768;
-    result.fsinfo3res_u.resok.rtpref = 32768;
-    result.fsinfo3res_u.resok.rtmult = 4096;
-    result.fsinfo3res_u.resok.wtmax = 32768;
-    result.fsinfo3res_u.resok.wtpref = 32768;
-    result.fsinfo3res_u.resok.wtmult = 4096;
-    result.fsinfo3res_u.resok.dtpref = 4096;
+    result.fsinfo3res_u.resok.rtmax = NFS_MAXSIZE;
+    result.fsinfo3res_u.resok.rtpref = NFS_MAXSIZE;
+    result.fsinfo3res_u.resok.rtmult = NFS_BLOCKSIZE;
+    result.fsinfo3res_u.resok.wtmax = NFS_MAXSIZE;
+    result.fsinfo3res_u.resok.wtpref = NFS_MAXSIZE;
+    result.fsinfo3res_u.resok.wtmult = NFS_BLOCKSIZE;
+    result.fsinfo3res_u.resok.dtpref = NFS_BLOCKSIZE;
     result.fsinfo3res_u.resok.maxfilesize = 0x7fffffffffffffffULL;
     result.fsinfo3res_u.resok.time_delta.seconds = 0;
     result.fsinfo3res_u.resok.time_delta.nseconds = 1000;