summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sys/kern/kern_prot.c22
-rw-r--r--sys/kern/vfs_export.c5
-rw-r--r--sys/nfsserver/nfs_srvsock.c8
-rw-r--r--sys/nfsserver/nfs_srvsubs.c3
-rw-r--r--sys/sys/ucred.h1
-rw-r--r--sys/ufs/ufs/ufs_vnops.c5
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;
OpenPOWER on IntegriCloud