Author: rmacklem
Date: Wed Oct 13 00:57:14 2010
New Revision: 213756
URL: http://svn.freebsd.org/changeset/base/213756

Log:
  Fix the krpc so that it can handle NFSv3,UDP mounts with a read/write
  data size greater than 8192. Since soreserve(so, 256*1024, 256*1024)
  would always fail for the default value of sb_max, modify clnt_dg.c
  so that it uses the calculated values and checks for an error return
  from soreserve(). Also, add a check for error return from soreserve()
  to clnt_vc.c and change __rpc_get_t_size() to use sb_max_adj instead of
  the bogus maxsize == 256*1024.
  
  PR:           kern/150910
  Reviewed by:  jhb
  MFC after:    2 weeks

Modified:
  head/sys/rpc/clnt_dg.c
  head/sys/rpc/clnt_vc.c
  head/sys/rpc/rpc_generic.c

Modified: head/sys/rpc/clnt_dg.c
==============================================================================
--- head/sys/rpc/clnt_dg.c      Wed Oct 13 00:21:53 2010        (r213755)
+++ head/sys/rpc/clnt_dg.c      Wed Oct 13 00:57:14 2010        (r213756)
@@ -193,6 +193,7 @@ clnt_dg_create(
        struct rpc_msg call_msg;
        struct __rpc_sockinfo si;
        XDR xdrs;
+       int error;
 
        if (svcaddr == NULL) {
                rpc_createerr.cf_stat = RPC_UNKNOWNADDR;
@@ -267,7 +268,12 @@ clnt_dg_create(
         */
        cu->cu_closeit = FALSE;
        cu->cu_socket = so;
-       soreserve(so, 256*1024, 256*1024);
+       error = soreserve(so, (u_long)sendsz, (u_long)recvsz);
+       if (error != 0) {
+               rpc_createerr.cf_stat = RPC_FAILED;
+               rpc_createerr.cf_error.re_errno = error;
+               goto err2;
+       }
 
        sb = &so->so_rcv;
        SOCKBUF_LOCK(&so->so_rcv);

Modified: head/sys/rpc/clnt_vc.c
==============================================================================
--- head/sys/rpc/clnt_vc.c      Wed Oct 13 00:21:53 2010        (r213755)
+++ head/sys/rpc/clnt_vc.c      Wed Oct 13 00:57:14 2010        (r213756)
@@ -288,13 +288,19 @@ clnt_vc_create(
         * Create a client handle which uses xdrrec for serialization
         * and authnone for authentication.
         */
+       sendsz = __rpc_get_t_size(si.si_af, si.si_proto, (int)sendsz);
+       recvsz = __rpc_get_t_size(si.si_af, si.si_proto, (int)recvsz);
+       error = soreserve(ct->ct_socket, sendsz, recvsz);
+       if (error != 0) {
+               if (ct->ct_closeit) {
+                       soclose(ct->ct_socket);
+               }
+               goto err;
+       }
        cl->cl_refs = 1;
        cl->cl_ops = &clnt_vc_ops;
        cl->cl_private = ct;
        cl->cl_auth = authnone_create();
-       sendsz = __rpc_get_t_size(si.si_af, si.si_proto, (int)sendsz);
-       recvsz = __rpc_get_t_size(si.si_af, si.si_proto, (int)recvsz);
-       soreserve(ct->ct_socket, sendsz, recvsz);
 
        SOCKBUF_LOCK(&ct->ct_socket->so_rcv);
        soupcall_set(ct->ct_socket, SO_RCV, clnt_vc_soupcall, ct);

Modified: head/sys/rpc/rpc_generic.c
==============================================================================
--- head/sys/rpc/rpc_generic.c  Wed Oct 13 00:21:53 2010        (r213755)
+++ head/sys/rpc/rpc_generic.c  Wed Oct 13 00:57:14 2010        (r213756)
@@ -63,6 +63,8 @@ __FBSDID("$FreeBSD$");
 
 #include <rpc/rpc_com.h>
 
+extern u_long sb_max_adj;      /* not defined in socketvar.h */
+
 #if __FreeBSD_version < 700000
 #define strrchr rindex
 #endif
@@ -113,9 +115,8 @@ u_int
 /*ARGSUSED*/
 __rpc_get_t_size(int af, int proto, int size)
 {
-       int maxsize, defsize;
+       int defsize;
 
-       maxsize = 256 * 1024;   /* XXX */
        switch (proto) {
        case IPPROTO_TCP:
                defsize = 64 * 1024;    /* XXX */
@@ -131,7 +132,7 @@ __rpc_get_t_size(int af, int proto, int 
                return defsize;
 
        /* Check whether the value is within the upper max limit */
-       return (size > maxsize ? (u_int)maxsize : (u_int)size);
+       return (size > sb_max_adj ? (u_int)sb_max_adj : (u_int)size);
 }
 
 /*
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to