diff options
author | 2009-03-30 19:58:50 +0000 | |
---|---|---|
committer | 2009-03-30 19:58:50 +0000 | |
commit | 895d09cc12cdf17fde18f77b28c7aa782b71333c (patch) | |
tree | 12fa39a3bfd0c7a9f97dcec0cf22de09883020b4 /sys/nfs | |
parent | Switch sk(4) over to using MCLGETI when allocating mbufs for the RX ring. (diff) | |
download | wireguard-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.c | 22 | ||||
-rw-r--r-- | sys/nfs/nfs_subs.c | 68 | ||||
-rw-r--r-- | sys/nfs/nfs_var.h | 3 | ||||
-rw-r--r-- | sys/nfs/nfsm_subs.h | 46 |
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 |