rlimit: deduplicate code in chg* functions
This commit is contained in:
parent
67076e4d58
commit
7150ce743a
@ -1371,6 +1371,24 @@ ui_racct_foreach(void (*callback)(struct racct *racct,
|
||||
}
|
||||
#endif
|
||||
|
||||
static inline int
|
||||
chglimit(struct uidinfo *uip, long *limit, int diff, rlim_t max, const char *name)
|
||||
{
|
||||
|
||||
/* Don't allow them to exceed max, but allow subtraction. */
|
||||
if (diff > 0 && max != 0) {
|
||||
if (atomic_fetchadd_long(limit, (long)diff) + diff > max) {
|
||||
atomic_subtract_long(limit, (long)diff);
|
||||
return (0);
|
||||
}
|
||||
} else {
|
||||
atomic_add_long(limit, (long)diff);
|
||||
if (*limit < 0)
|
||||
printf("negative %s for uid = %d\n", name, uip->ui_uid);
|
||||
}
|
||||
return (1);
|
||||
}
|
||||
|
||||
/*
|
||||
* Change the count associated with number of processes
|
||||
* a given user is using. When 'max' is 0, don't enforce a limit
|
||||
@ -1379,18 +1397,7 @@ int
|
||||
chgproccnt(struct uidinfo *uip, int diff, rlim_t max)
|
||||
{
|
||||
|
||||
/* Don't allow them to exceed max, but allow subtraction. */
|
||||
if (diff > 0 && max != 0) {
|
||||
if (atomic_fetchadd_long(&uip->ui_proccnt, (long)diff) + diff > max) {
|
||||
atomic_subtract_long(&uip->ui_proccnt, (long)diff);
|
||||
return (0);
|
||||
}
|
||||
} else {
|
||||
atomic_add_long(&uip->ui_proccnt, (long)diff);
|
||||
if (uip->ui_proccnt < 0)
|
||||
printf("negative proccnt for uid = %d\n", uip->ui_uid);
|
||||
}
|
||||
return (1);
|
||||
return (chglimit(uip, &uip->ui_proccnt, diff, max, "proccnt"));
|
||||
}
|
||||
|
||||
/*
|
||||
@ -1399,21 +1406,17 @@ chgproccnt(struct uidinfo *uip, int diff, rlim_t max)
|
||||
int
|
||||
chgsbsize(struct uidinfo *uip, u_int *hiwat, u_int to, rlim_t max)
|
||||
{
|
||||
int diff;
|
||||
int diff, rv;
|
||||
|
||||
diff = to - *hiwat;
|
||||
if (diff > 0) {
|
||||
if (atomic_fetchadd_long(&uip->ui_sbsize, (long)diff) + diff > max) {
|
||||
atomic_subtract_long(&uip->ui_sbsize, (long)diff);
|
||||
return (0);
|
||||
}
|
||||
if (diff > 0 && max == 0) {
|
||||
rv = 0;
|
||||
} else {
|
||||
atomic_add_long(&uip->ui_sbsize, (long)diff);
|
||||
if (uip->ui_sbsize < 0)
|
||||
printf("negative sbsize for uid = %d\n", uip->ui_uid);
|
||||
rv = chglimit(uip, &uip->ui_sbsize, diff, max, "sbsize");
|
||||
if (rv != 0)
|
||||
*hiwat = to;
|
||||
}
|
||||
*hiwat = to;
|
||||
return (1);
|
||||
return (rv);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -1424,36 +1427,14 @@ int
|
||||
chgptscnt(struct uidinfo *uip, int diff, rlim_t max)
|
||||
{
|
||||
|
||||
/* Don't allow them to exceed max, but allow subtraction. */
|
||||
if (diff > 0 && max != 0) {
|
||||
if (atomic_fetchadd_long(&uip->ui_ptscnt, (long)diff) + diff > max) {
|
||||
atomic_subtract_long(&uip->ui_ptscnt, (long)diff);
|
||||
return (0);
|
||||
}
|
||||
} else {
|
||||
atomic_add_long(&uip->ui_ptscnt, (long)diff);
|
||||
if (uip->ui_ptscnt < 0)
|
||||
printf("negative ptscnt for uid = %d\n", uip->ui_uid);
|
||||
}
|
||||
return (1);
|
||||
return (chglimit(uip, &uip->ui_ptscnt, diff, max, "ptscnt"));
|
||||
}
|
||||
|
||||
int
|
||||
chgkqcnt(struct uidinfo *uip, int diff, rlim_t max)
|
||||
{
|
||||
|
||||
if (diff > 0 && max != 0) {
|
||||
if (atomic_fetchadd_long(&uip->ui_kqcnt, (long)diff) +
|
||||
diff > max) {
|
||||
atomic_subtract_long(&uip->ui_kqcnt, (long)diff);
|
||||
return (0);
|
||||
}
|
||||
} else {
|
||||
atomic_add_long(&uip->ui_kqcnt, (long)diff);
|
||||
if (uip->ui_kqcnt < 0)
|
||||
printf("negative kqcnt for uid = %d\n", uip->ui_uid);
|
||||
}
|
||||
return (1);
|
||||
return (chglimit(uip, &uip->ui_kqcnt, diff, max, "kqcnt"));
|
||||
}
|
||||
|
||||
void
|
||||
|
Loading…
x
Reference in New Issue
Block a user