Cleanup the ui*() API in preparation for the addition of variant-symlink
authorMatthew Dillon <dillon@dragonflybsd.org>
Wed, 5 Nov 2003 20:24:38 +0000 (20:24 +0000)
committerMatthew Dillon <dillon@dragonflybsd.org>
Wed, 5 Nov 2003 20:24:38 +0000 (20:24 +0000)
support.

sys/kern/kern_prot.c
sys/kern/kern_resource.c
sys/sys/resourcevar.h

index 7263699..d8fb01d 100644 (file)
@@ -37,7 +37,7 @@
  *
  *     @(#)kern_prot.c 8.6 (Berkeley) 1/21/94
  * $FreeBSD: src/sys/kern/kern_prot.c,v 1.53.2.9 2002/03/09 05:20:26 dd Exp $
- * $DragonFly: src/sys/kern/kern_prot.c,v 1.11 2003/11/04 22:13:22 drhodus Exp $
+ * $DragonFly: src/sys/kern/kern_prot.c,v 1.12 2003/11/05 20:24:37 dillon Exp $
  */
 
 /*
@@ -903,10 +903,14 @@ crfree(struct ucred *cr)
                 * allocate a temporary credential, but don't
                 * allocate a uidinfo structure.
                 */
-               if (cr->cr_uidinfo != NULL)
-                       uifree(cr->cr_uidinfo);
-               if (cr->cr_ruidinfo != NULL)
-                       uifree(cr->cr_ruidinfo);
+               if (cr->cr_uidinfo != NULL) {
+                       uidrop(cr->cr_uidinfo);
+                       cr->cr_uidinfo = NULL;
+               }
+               if (cr->cr_ruidinfo != NULL) {
+                       uidrop(cr->cr_ruidinfo);
+                       cr->cr_ruidinfo = NULL;
+               }
 
                /*
                 * Destroy empty prisons
@@ -1070,15 +1074,11 @@ change_euid(uid_t euid)
 {
        struct  proc *p = curproc;
        struct  ucred *cr;
-       struct  uidinfo *uip;
 
        KKASSERT(p != NULL);
-
        cr = cratom(&p->p_ucred);
-       uip = cr->cr_uidinfo;
        cr->cr_uid = euid;
-       cr->cr_uidinfo = uifind(euid);
-       uifree(uip);
+       uireplace(&cr->cr_uidinfo, uifind(euid));
 }
 
 /*
@@ -1092,16 +1092,13 @@ change_ruid(uid_t ruid)
 {
        struct  proc *p = curproc;
        struct  ucred *cr;
-       struct  uidinfo *uip;
 
        KKASSERT(p != NULL);
 
        cr = cratom(&p->p_ucred);
        (void)chgproccnt(cr->cr_ruidinfo, -1, 0);
-       uip = cr->cr_ruidinfo;
        /* It is assumed that pcred is not shared between processes */
        cr->cr_ruid = ruid;
-       cr->cr_ruidinfo = uifind(ruid);
+       uireplace(&cr->cr_ruidinfo, uifind(ruid));
        (void)chgproccnt(cr->cr_ruidinfo, 1, 0);
-       uifree(uip);
 }
index 29ab313..926f887 100644 (file)
@@ -37,7 +37,7 @@
  *
  *     @(#)kern_resource.c     8.5 (Berkeley) 1/21/94
  * $FreeBSD: src/sys/kern/kern_resource.c,v 1.55.2.5 2001/11/03 01:41:08 ps Exp $
- * $DragonFly: src/sys/kern/kern_resource.c,v 1.15 2003/11/03 15:57:33 daver Exp $
+ * $DragonFly: src/sys/kern/kern_resource.c,v 1.16 2003/11/05 20:24:37 dillon Exp $
  */
 
 #include "opt_compat.h"
@@ -429,11 +429,8 @@ getrlimit(struct __getrlimit_args *uap)
  * expected to measure fine grained deltas.
  */
 void
-calcru(p, up, sp, ip)
-       struct proc *p;
-       struct timeval *up;
-       struct timeval *sp;
-       struct timeval *ip;
+calcru(struct proc *p, struct timeval *up, struct timeval *sp,
+       struct timeval *ip)
 {
        struct thread *td = p->p_thread;
        int s;
@@ -481,8 +478,7 @@ getrusage(struct getrusage_args *uap)
 }
 
 void
-ruadd(ru, ru2)
-       struct rusage *ru, *ru2;
+ruadd(struct rusage *ru, struct rusage *ru2)
 {
        long *ip, *ip2;
        int i;
@@ -502,8 +498,7 @@ ruadd(ru, ru2)
  * and copy when a limit is changed.
  */
 struct plimit *
-limcopy(lim)
-       struct plimit *lim;
+limcopy(struct plimit *lim)
 {
        struct plimit *copy;
 
@@ -521,29 +516,27 @@ limcopy(lim)
  * size, etc.) for the uid and impose limits.
  */
 void
-uihashinit()
+uihashinit(void)
 {
        uihashtbl = hashinit(maxproc / 16, M_UIDINFO, &uihash);
 }
 
 static struct uidinfo *
-uilookup(uid)
-       uid_t uid;
+uilookup(uid_t uid)
 {
        struct  uihashhead *uipp;
        struct  uidinfo *uip;
 
        uipp = UIHASH(uid);
-       LIST_FOREACH(uip, uipp, ui_hash)
+       LIST_FOREACH(uip, uipp, ui_hash) {
                if (uip->ui_uid == uid)
                        break;
-
+       }
        return (uip);
 }
 
 static struct uidinfo *
-uicreate(uid)
-       uid_t uid;
+uicreate(uid_t uid)
 {
        struct  uidinfo *uip, *norace;
 
@@ -569,8 +562,7 @@ uicreate(uid)
 }
 
 struct uidinfo *
-uifind(uid)
-       uid_t uid;
+uifind(uid_t uid)
 {
        struct  uidinfo *uip;
 
@@ -581,24 +573,40 @@ uifind(uid)
        return (uip);
 }
 
-int
-uifree(uip)
-       struct  uidinfo *uip;
+static __inline void
+uifree(struct uidinfo *uip)
 {
+       if (uip->ui_sbsize != 0)
+               /* XXX no %qd in kernel.  Truncate. */
+               printf("freeing uidinfo: uid = %d, sbsize = %ld\n",
+                   uip->ui_uid, (long)uip->ui_sbsize);
+       if (uip->ui_proccnt != 0)
+               printf("freeing uidinfo: uid = %d, proccnt = %ld\n",
+                   uip->ui_uid, uip->ui_proccnt);
+       LIST_REMOVE(uip, ui_hash);
+       FREE(uip, M_UIDINFO);
+}
 
-       if (--uip->ui_ref == 0) {
-               if (uip->ui_sbsize != 0)
-                       /* XXX no %qd in kernel.  Truncate. */
-                       printf("freeing uidinfo: uid = %d, sbsize = %ld\n",
-                           uip->ui_uid, (long)uip->ui_sbsize);
-               if (uip->ui_proccnt != 0)
-                       printf("freeing uidinfo: uid = %d, proccnt = %ld\n",
-                           uip->ui_uid, uip->ui_proccnt);
-               LIST_REMOVE(uip, ui_hash);
-               FREE(uip, M_UIDINFO);
-               return (1);
-       }
-       return (0);
+void
+uihold(struct uidinfo *uip)
+{
+       ++uip->ui_ref;
+       KKASSERT(uip->ui_ref > 0);
+}
+
+void
+uidrop(struct uidinfo *uip)
+{
+       KKASSERT(uip->ui_ref > 0);
+       if (--uip->ui_ref == 0)
+               uifree(uip);
+}
+
+void
+uireplace(struct uidinfo **puip, struct uidinfo *nuip)
+{
+       uidrop(*puip);
+       *puip = nuip;
 }
 
 /*
@@ -606,10 +614,7 @@ uifree(uip)
  * a given user is using.  When 'max' is 0, don't enforce a limit
  */
 int
-chgproccnt(uip, diff, max)
-       struct  uidinfo *uip;
-       int     diff;
-       int     max;
+chgproccnt(struct uidinfo *uip, int diff, int max)
 {
        /* don't allow them to exceed max, but allow subtraction */
        if (diff > 0 && uip->ui_proccnt + diff > max && max != 0)
@@ -624,11 +629,7 @@ chgproccnt(uip, diff, max)
  * Change the total socket buffer size a user has used.
  */
 int
-chgsbsize(uip, hiwat, to, max)
-       struct  uidinfo *uip;
-       u_long *hiwat;
-       u_long  to;
-       rlim_t  max;
+chgsbsize(struct uidinfo *uip, u_long *hiwat, u_long to, rlim_t max)
 {
        rlim_t new;
        int s;
@@ -647,3 +648,4 @@ chgsbsize(uip, hiwat, to, max)
        splx(s);
        return (1);
 }
+
index 8a1623a..495a8ce 100644 (file)
@@ -32,7 +32,7 @@
  *
  *     @(#)resourcevar.h       8.4 (Berkeley) 1/9/95
  * $FreeBSD: src/sys/sys/resourcevar.h,v 1.16.2.1 2000/09/07 19:13:55 truckman Exp $
- * $DragonFly: src/sys/sys/resourcevar.h,v 1.4 2003/11/05 20:07:19 dillon Exp $
+ * $DragonFly: src/sys/sys/resourcevar.h,v 1.5 2003/11/05 20:24:38 dillon Exp $
  */
 
 #ifndef        _SYS_RESOURCEVAR_H_
@@ -94,24 +94,23 @@ struct uidinfo {
 };
 
 #ifdef _KERNEL
-#define uihold(uip)    (uip)->ui_ref++
+
 struct proc;
 
-void    addupc_intr (struct proc *p, u_long pc, u_int ticks);
-void    addupc_task (struct proc *p, u_long pc, u_int ticks);
-void    calcru (struct proc *p, struct timeval *up, struct timeval *sp,
+void   addupc_intr (struct proc *p, u_long pc, u_int ticks);
+void   addupc_task (struct proc *p, u_long pc, u_int ticks);
+void   calcru (struct proc *p, struct timeval *up, struct timeval *sp,
            struct timeval *ip);
-int     chgproccnt (struct uidinfo *uip, int diff, int max);
-int     chgsbsize (struct uidinfo *uip, u_long *hiwat, u_long to,
-           rlim_t max);
-int     fuswintr (void *base);
-struct plimit
-       *limcopy (struct plimit *lim);
-void    ruadd (struct rusage *ru, struct rusage *ru2);
-int     suswintr (void *base, int word);
-struct uidinfo
-       *uifind (uid_t uid);
-int     uifree (struct uidinfo *uip);
+int    chgproccnt (struct uidinfo *uip, int diff, int max);
+int    chgsbsize (struct uidinfo *uip, u_long *hiwat, u_long to, rlim_t max);
+int    fuswintr (void *base);
+struct plimit *limcopy (struct plimit *lim);
+void   ruadd (struct rusage *ru, struct rusage *ru2);
+int    suswintr (void *base, int word);
+struct uidinfo *uifind (uid_t uid);
+void   uihold (struct uidinfo *uip);
+void   uidrop (struct uidinfo *uip);
+void   uireplace (struct uidinfo **puip, struct uidinfo *nuip);
 void   uihashinit (void);
 #endif