diff options
-rw-r--r-- | sys/kern/kern_prot.c | 22 | ||||
-rw-r--r-- | sys/kern/vfs_export.c | 5 | ||||
-rw-r--r-- | sys/nfsserver/nfs_srvsock.c | 8 | ||||
-rw-r--r-- | sys/nfsserver/nfs_srvsubs.c | 3 | ||||
-rw-r--r-- | sys/sys/ucred.h | 1 | ||||
-rw-r--r-- | sys/ufs/ufs/ufs_vnops.c | 5 |
6 files changed, 18 insertions, 26 deletions
diff --git a/sys/kern/kern_prot.c b/sys/kern/kern_prot.c index ebe4b18..e84825c 100644 --- a/sys/kern/kern_prot.c +++ b/sys/kern/kern_prot.c @@ -54,6 +54,7 @@ __FBSDID("$FreeBSD$"); #include <sys/mac.h> #include <sys/malloc.h> #include <sys/mutex.h> +#include <sys/refcount.h> #include <sys/sx.h> #include <sys/proc.h> #include <sys/sysproto.h> @@ -1841,8 +1842,7 @@ crget(void) register struct ucred *cr; MALLOC(cr, struct ucred *, sizeof(*cr), M_CRED, M_WAITOK | M_ZERO); - cr->cr_ref = 1; - cr->cr_mtxp = mtx_pool_find(mtxpool_sleep, cr); + refcount_init(&cr->cr_ref, 1); #ifdef MAC mac_init_cred(cr); #endif @@ -1857,9 +1857,7 @@ struct ucred * crhold(struct ucred *cr) { - mtx_lock(cr->cr_mtxp); - cr->cr_ref++; - mtx_unlock(cr->cr_mtxp); + refcount_acquire(&cr->cr_ref); return (cr); } @@ -1871,12 +1869,10 @@ crhold(struct ucred *cr) void crfree(struct ucred *cr) { - struct mtx *mtxp = cr->cr_mtxp; - mtx_lock(mtxp); KASSERT(cr->cr_ref > 0, ("bad ucred refcount: %d", cr->cr_ref)); - if (--cr->cr_ref == 0) { - mtx_unlock(mtxp); + KASSERT(cr->cr_ref != 0xdeadc0de, ("dangling reference to ucred")); + if (refcount_release(&cr->cr_ref)) { /* * Some callers of crget(), such as nfs_statfs(), * allocate a temporary credential, but don't @@ -1895,8 +1891,6 @@ crfree(struct ucred *cr) mac_destroy_cred(cr); #endif FREE(cr, M_CRED); - } else { - mtx_unlock(mtxp); } } @@ -1907,12 +1901,8 @@ crfree(struct ucred *cr) int crshared(struct ucred *cr) { - int shared; - mtx_lock(cr->cr_mtxp); - shared = (cr->cr_ref > 1); - mtx_unlock(cr->cr_mtxp); - return (shared); + return (cr->cr_ref > 1); } /* diff --git a/sys/kern/vfs_export.c b/sys/kern/vfs_export.c index d77cd82..05e0f45 100644 --- a/sys/kern/vfs_export.c +++ b/sys/kern/vfs_export.c @@ -46,6 +46,7 @@ __FBSDID("$FreeBSD$"); #include <sys/mbuf.h> #include <sys/mount.h> #include <sys/mutex.h> +#include <sys/refcount.h> #include <sys/socket.h> #include <sys/systm.h> #include <sys/vnode.h> @@ -115,7 +116,7 @@ vfs_hang_addrlist(mp, nep, argp) np->netc_anon.cr_ngroups = argp->ex_anon.cr_ngroups; bcopy(argp->ex_anon.cr_groups, np->netc_anon.cr_groups, sizeof(np->netc_anon.cr_groups)); - np->netc_anon.cr_ref = 1; + refcount_init(&np->netc_anon.cr_ref, 1); mp->mnt_flag |= MNT_DEFEXPORTED; return (0); } @@ -174,7 +175,7 @@ vfs_hang_addrlist(mp, nep, argp) np->netc_anon.cr_ngroups = argp->ex_anon.cr_ngroups; bcopy(argp->ex_anon.cr_groups, np->netc_anon.cr_groups, sizeof(np->netc_anon.cr_groups)); - np->netc_anon.cr_ref = 1; + refcount_init(&np->netc_anon.cr_ref, 1); return (0); out: free(np, M_NETADDR); diff --git a/sys/nfsserver/nfs_srvsock.c b/sys/nfsserver/nfs_srvsock.c index 22c7feb..55eeb0a 100644 --- a/sys/nfsserver/nfs_srvsock.c +++ b/sys/nfsserver/nfs_srvsock.c @@ -49,6 +49,7 @@ __FBSDID("$FreeBSD$"); #include <sys/mutex.h> #include <sys/proc.h> #include <sys/protosw.h> +#include <sys/refcount.h> #include <sys/signalvar.h> #include <sys/socket.h> #include <sys/socketvar.h> @@ -364,12 +365,11 @@ nfs_getreq(struct nfsrv_descript *nd, struct nfsd *nfsd, int has_header) /* * XXX: This credential should be managed using crget(9) * and related calls. Right now, this tramples on any - * extensible data in the ucred, fails to initialize the - * mutex, and worse. This must be fixed before FreeBSD - * 5.3-RELEASE. + * extensible data in the ucred, and worse. This wasn't + * fixed before FreeBSD 5.3-RELEASE. */ bzero((caddr_t)&nd->nd_cr, sizeof (struct ucred)); - nd->nd_cr.cr_ref = 1; + refcount_init(&nd->nd_cr.cr_ref, 1); nd->nd_cr.cr_uid = fxdr_unsigned(uid_t, *tl++); nd->nd_cr.cr_gid = fxdr_unsigned(gid_t, *tl++); len = fxdr_unsigned(int, *tl); diff --git a/sys/nfsserver/nfs_srvsubs.c b/sys/nfsserver/nfs_srvsubs.c index 912b5a7..437dd63 100644 --- a/sys/nfsserver/nfs_srvsubs.c +++ b/sys/nfsserver/nfs_srvsubs.c @@ -53,6 +53,7 @@ __FBSDID("$FreeBSD$"); #include <sys/vnode.h> #include <sys/namei.h> #include <sys/mbuf.h> +#include <sys/refcount.h> #include <sys/socket.h> #include <sys/stat.h> #include <sys/malloc.h> @@ -1257,7 +1258,7 @@ nfsrv_setcred(struct ucred *incred, struct ucred *outcred) NFSD_LOCK_DONTCARE(); bzero((caddr_t)outcred, sizeof (struct ucred)); - outcred->cr_ref = 1; + refcount_init(&outcred->cr_ref, 1); outcred->cr_uid = incred->cr_uid; outcred->cr_ngroups = incred->cr_ngroups; for (i = 0; i < incred->cr_ngroups; i++) diff --git a/sys/sys/ucred.h b/sys/sys/ucred.h index b115136..aca849b 100644 --- a/sys/sys/ucred.h +++ b/sys/sys/ucred.h @@ -55,7 +55,6 @@ struct ucred { struct prison *cr_prison; /* jail(2) */ #define cr_endcopy cr_label struct label *cr_label; /* MAC label */ - struct mtx *cr_mtxp; /* protect refcount */ }; #define NOCRED ((struct ucred *)0) /* no credential available */ #define FSCRED ((struct ucred *)-1) /* filesystem credential */ diff --git a/sys/ufs/ufs/ufs_vnops.c b/sys/ufs/ufs/ufs_vnops.c index 3c7d401..9a04787 100644 --- a/sys/ufs/ufs/ufs_vnops.c +++ b/sys/ufs/ufs/ufs_vnops.c @@ -53,6 +53,7 @@ __FBSDID("$FreeBSD$"); #include <sys/bio.h> #include <sys/buf.h> #include <sys/mount.h> +#include <sys/refcount.h> #include <sys/unistd.h> #include <sys/vnode.h> #include <sys/dirent.h> @@ -1364,7 +1365,7 @@ ufs_mkdir(ap) * XXX This seems to never be accessed out of * our context so a stack variable is ok. */ - ucred.cr_ref = 1; + refcount_init(&ucred.cr_ref, 1); ucred.cr_uid = ip->i_uid; ucred.cr_ngroups = 1; ucred.cr_groups[0] = dp->i_gid; @@ -2195,7 +2196,7 @@ ufs_makeinode(mode, dvp, vpp, cnp) * XXX This seems to never be accessed out of our * context so a stack variable is ok. */ - ucred.cr_ref = 1; + refcount_init(&ucred.cr_ref, 1); ucred.cr_uid = ip->i_uid; ucred.cr_ngroups = 1; ucred.cr_groups[0] = pdir->i_gid; |