summaryrefslogtreecommitdiffstats
path: root/sys/nfs
diff options
context:
space:
mode:
authorblambert <blambert@openbsd.org>2009-03-30 19:58:50 +0000
committerblambert <blambert@openbsd.org>2009-03-30 19:58:50 +0000
commit895d09cc12cdf17fde18f77b28c7aa782b71333c (patch)
tree12fa39a3bfd0c7a9f97dcec0cf22de09883020b4 /sys/nfs
parentSwitch sk(4) over to using MCLGETI when allocating mbufs for the RX ring. (diff)
downloadwireguard-openbsd-895d09cc12cdf17fde18f77b28c7aa782b71333c.tar.xz
wireguard-openbsd-895d09cc12cdf17fde18f77b28c7aa782b71333c.zip
Convert a sizeable macro to a much-leaner function. Saves (IIRC) 5k on i386.
In snaps for a while.
Diffstat (limited to 'sys/nfs')
-rw-r--r--sys/nfs/nfs_serv.c22
-rw-r--r--sys/nfs/nfs_subs.c68
-rw-r--r--sys/nfs/nfs_var.h3
-rw-r--r--sys/nfs/nfsm_subs.h46
4 files changed, 86 insertions, 53 deletions
diff --git a/sys/nfs/nfs_serv.c b/sys/nfs/nfs_serv.c
index d733f06fc08..ebe10a1561f 100644
--- a/sys/nfs/nfs_serv.c
+++ b/sys/nfs/nfs_serv.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: nfs_serv.c,v 1.64 2009/03/15 19:40:41 miod Exp $ */
+/* $OpenBSD: nfs_serv.c,v 1.65 2009/03/30 19:58:50 blambert Exp $ */
/* $NetBSD: nfs_serv.c,v 1.34 1997/05/12 23:37:12 fvdl Exp $ */
/*
@@ -233,7 +233,9 @@ nfsrv_setattr(nfsd, slp, procp, mrq)
VATTR_NULL(&va);
if (v3) {
va.va_vaflags |= VA_UTIMES_NULL;
- nfsm_srvsattr(&va);
+ error = nfsm_srvsattr(&md, &va, mrep, &dpos);
+ if (error)
+ goto nfsmout;
nfsm_dissect(tl, u_int32_t *, NFSX_UNSIGNED);
gcheck = fxdr_unsigned(int, *tl);
if (gcheck) {
@@ -1283,7 +1285,9 @@ nfsrv_create(nfsd, slp, procp, mrq)
break;
}
case NFSV3CREATE_UNCHECKED:
- nfsm_srvsattr(&va);
+ error = nfsm_srvsattr(&md, &va, mrep, &dpos);
+ if (error)
+ goto nfsmout;
break;
case NFSV3CREATE_EXCLUSIVE:
nfsm_dissect(cp, caddr_t, NFSX_V3CREATEVERF);
@@ -1510,7 +1514,9 @@ nfsrv_mknod(nfsd, slp, procp, mrq)
goto out;
}
VATTR_NULL(&va);
- nfsm_srvsattr(&va);
+ error = nfsm_srvsattr(&md, &va, mrep, &dpos);
+ if (error)
+ goto nfsmout;
if (vtyp == VCHR || vtyp == VBLK) {
nfsm_dissect(tl, u_int32_t *, 2 * NFSX_UNSIGNED);
major = fxdr_unsigned(u_int32_t, *tl++);
@@ -2007,7 +2013,9 @@ nfsrv_symlink(nfsd, slp, procp, mrq)
goto out;
VATTR_NULL(&va);
if (v3)
- nfsm_srvsattr(&va);
+ error = nfsm_srvsattr(&md, &va, mrep, &dpos);
+ if (error)
+ goto nfsmout;
nfsm_strsiz(len2, NFS_MAXPATHLEN);
pathcp = malloc(len2 + 1, M_TEMP, M_WAITOK);
iv.iov_base = pathcp;
@@ -2150,7 +2158,9 @@ nfsrv_mkdir(nfsd, slp, procp, mrq)
}
VATTR_NULL(&va);
if (v3) {
- nfsm_srvsattr(&va);
+ error = nfsm_srvsattr(&md, &va, mrep, &dpos);
+ if (error)
+ goto nfsmout;
} else {
nfsm_dissect(tl, u_int32_t *, NFSX_UNSIGNED);
va.va_mode = nfstov_mode(*tl++);
diff --git a/sys/nfs/nfs_subs.c b/sys/nfs/nfs_subs.c
index 3e493518f5c..c71113db558 100644
--- a/sys/nfs/nfs_subs.c
+++ b/sys/nfs/nfs_subs.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: nfs_subs.c,v 1.92 2009/01/24 23:30:42 thib Exp $ */
+/* $OpenBSD: nfs_subs.c,v 1.93 2009/03/30 19:58:50 blambert Exp $ */
/* $NetBSD: nfs_subs.c,v 1.27.4.3 1996/07/08 20:34:24 jtc Exp $ */
/*
@@ -1948,3 +1948,69 @@ nfsm_build(struct mbuf **mp, u_int len)
return (bpos);
}
+
+int
+nfsm_srvsattr(struct mbuf **mp, struct vattr *va, struct mbuf *mrep,
+ caddr_t *dposp)
+{
+ struct mbuf *md;
+ uint32_t *tl, t1;
+ caddr_t dpos, cp2;
+ int error = 0;
+
+ md = *mp;
+ dpos = *dposp;
+
+ nfsm_dissect(tl, u_int32_t *, NFSX_UNSIGNED);
+ if (*tl == nfs_true) {
+ nfsm_dissect(tl, u_int32_t *, NFSX_UNSIGNED);
+ va->va_mode = nfstov_mode(*tl);
+ }
+
+ nfsm_dissect(tl, u_int32_t *, NFSX_UNSIGNED);
+ if (*tl == nfs_true) {
+ nfsm_dissect(tl, u_int32_t *, NFSX_UNSIGNED);
+ va->va_uid = fxdr_unsigned(uid_t, *tl);
+ }
+
+ nfsm_dissect(tl, u_int32_t *, NFSX_UNSIGNED);
+ if (*tl == nfs_true) {
+ nfsm_dissect(tl, u_int32_t *, NFSX_UNSIGNED);
+ va->va_gid = fxdr_unsigned(gid_t, *tl);
+ }
+
+ nfsm_dissect(tl, u_int32_t *, NFSX_UNSIGNED);
+ if (*tl == nfs_true) {
+ nfsm_dissect(tl, u_int32_t *, 2 * NFSX_UNSIGNED);
+ va->va_size = fxdr_hyper(tl);
+ }
+
+ nfsm_dissect(tl, u_int32_t *, NFSX_UNSIGNED);
+ switch (fxdr_unsigned(int, *tl)) {
+ case NFSV3SATTRTIME_TOCLIENT:
+ va->va_vaflags &= ~VA_UTIMES_NULL;
+ nfsm_dissect(tl, u_int32_t *, 2 * NFSX_UNSIGNED);
+ fxdr_nfsv3time(tl, &va->va_atime);
+ break;
+ case NFSV3SATTRTIME_TOSERVER:
+ getnanotime(&va->va_atime);
+ break;
+ };
+
+ nfsm_dissect(tl, u_int32_t *, NFSX_UNSIGNED);
+ switch (fxdr_unsigned(int, *tl)) {
+ case NFSV3SATTRTIME_TOCLIENT:
+ va->va_vaflags &= ~VA_UTIMES_NULL;
+ nfsm_dissect(tl, u_int32_t *, 2 * NFSX_UNSIGNED);
+ fxdr_nfsv3time(tl, &va->va_mtime);
+ break;
+ case NFSV3SATTRTIME_TOSERVER:
+ getnanotime(&va->va_mtime);
+ break;
+ };
+
+ *dposp = dpos;
+ *mp = md;
+nfsmout:
+ return (error);
+}
diff --git a/sys/nfs/nfs_var.h b/sys/nfs/nfs_var.h
index 6ebd5314ceb..4f8d0d80ecb 100644
--- a/sys/nfs/nfs_var.h
+++ b/sys/nfs/nfs_var.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: nfs_var.h,v 1.48 2009/01/20 18:03:33 blambert Exp $ */
+/* $OpenBSD: nfs_var.h,v 1.49 2009/03/30 19:58:50 blambert Exp $ */
/* $NetBSD: nfs_var.h,v 1.3 1996/02/18 11:53:54 fvdl Exp $ */
/*
@@ -254,6 +254,7 @@ void nfs_merge_commit_ranges(struct vnode *);
int nfsrv_errmap(struct nfsrv_descript *, int);
void nfsrvw_sort(gid_t *, int);
void nfsrv_setcred(struct ucred *, struct ucred *);
+int nfsm_srvsattr(struct mbuf **, struct vattr *, struct mbuf *, caddr_t *);
/* nfs_syscalls.c */
int sys_nfssvc(struct proc *, void *, register_t *);
diff --git a/sys/nfs/nfsm_subs.h b/sys/nfs/nfsm_subs.h
index 7015b6278eb..bd31482aded 100644
--- a/sys/nfs/nfsm_subs.h
+++ b/sys/nfs/nfsm_subs.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: nfsm_subs.h,v 1.33 2009/01/24 23:30:42 thib Exp $ */
+/* $OpenBSD: nfsm_subs.h,v 1.34 2009/03/30 19:58:50 blambert Exp $ */
/* $NetBSD: nfsm_subs.h,v 1.10 1996/03/20 21:59:56 fvdl Exp $ */
/*
@@ -290,48 +290,4 @@
nfsm_adv(NFSX_V2FH - NFSX_V3FH); \
}
-#define nfsm_srvsattr(a) \
- { nfsm_dissect(tl, u_int32_t *, NFSX_UNSIGNED); \
- if (*tl == nfs_true) { \
- nfsm_dissect(tl, u_int32_t *, NFSX_UNSIGNED); \
- (a)->va_mode = nfstov_mode(*tl); \
- } \
- nfsm_dissect(tl, u_int32_t *, NFSX_UNSIGNED); \
- if (*tl == nfs_true) { \
- nfsm_dissect(tl, u_int32_t *, NFSX_UNSIGNED); \
- (a)->va_uid = fxdr_unsigned(uid_t, *tl); \
- } \
- nfsm_dissect(tl, u_int32_t *, NFSX_UNSIGNED); \
- if (*tl == nfs_true) { \
- nfsm_dissect(tl, u_int32_t *, NFSX_UNSIGNED); \
- (a)->va_gid = fxdr_unsigned(gid_t, *tl); \
- } \
- nfsm_dissect(tl, u_int32_t *, NFSX_UNSIGNED); \
- if (*tl == nfs_true) { \
- nfsm_dissect(tl, u_int32_t *, 2 * NFSX_UNSIGNED); \
- (a)->va_size = fxdr_hyper(tl); \
- } \
- nfsm_dissect(tl, u_int32_t *, NFSX_UNSIGNED); \
- switch (fxdr_unsigned(int, *tl)) { \
- case NFSV3SATTRTIME_TOCLIENT: \
- (a)->va_vaflags &= ~VA_UTIMES_NULL; \
- nfsm_dissect(tl, u_int32_t *, 2 * NFSX_UNSIGNED); \
- fxdr_nfsv3time(tl, &(a)->va_atime); \
- break; \
- case NFSV3SATTRTIME_TOSERVER: \
- getnanotime(&(a)->va_atime); \
- break; \
- }; \
- nfsm_dissect(tl, u_int32_t *, NFSX_UNSIGNED); \
- switch (fxdr_unsigned(int, *tl)) { \
- case NFSV3SATTRTIME_TOCLIENT: \
- (a)->va_vaflags &= ~VA_UTIMES_NULL; \
- nfsm_dissect(tl, u_int32_t *, 2 * NFSX_UNSIGNED); \
- fxdr_nfsv3time(tl, &(a)->va_mtime); \
- break; \
- case NFSV3SATTRTIME_TOSERVER: \
- getnanotime(&(a)->va_mtime); \
- break; \
- }; }
-
#endif