2.11BSD/sys/sys/quota_subr.c
/*
* Copyright (c) 1982, 1986 Regents of the University of California.
* All rights reserved. The Berkeley software License Agreement
* specifies the terms and conditions for redistribution.
*
* @(#)quota_subr.c 7.1 (Berkeley) 6/5/86
*/
/*
* MELBOURNE QUOTAS
*
* Miscellaneous subroutines.
*/
#include "param.h"
#ifdef QUOTA
#include "systm.h"
#include "user.h"
#include "proc.h"
#include "inode.h"
#include "quota.h"
#include "fs.h"
#include "mount.h"
#include "uio.h"
struct dquot *
dqp(q, dev)
struct quota *q;
dev_t dev;
{
register struct dquot **dqq;
register i;
if (q == NOQUOTA || q->q_flags & Q_NDQ)
return (NODQUOT);
i = getfsx(dev);
if (i < 0 || i >= NMOUNT)
return (NODQUOT);
dqq = &q->q_dq[i];
if (*dqq == LOSTDQUOT) {
*dqq = discquota(q->q_uid, mount[i].m_qinod);
if (*dqq != NODQUOT)
(*dqq)->dq_own = q;
}
if (*dqq != NODQUOT)
(*dqq)->dq_cnt++;
return (*dqq);
}
/*
* Quota cleanup at process exit, or when
* switching to another user.
*/
qclean()
{
register struct quota *q = u.u_quota;
if (q == NOQUOTA)
return;
/*
* Before we rid ourselves of this quota, we must be sure that
* we no longer reference it (otherwise clock might do nasties).
* But we have to have some quota (or clock will get upset).
* (Who is this clock anyway ??). So we will give ourselves
* root's quota for a short while, without counting this as
* a reference in the ref count (as either this proc is just
* about to die, in which case it refers to nothing, or it is
* about to be given a new quota, which will just overwrite this
* one).
*/
u.u_quota = quota;
delquota(q);
}
qstart(q)
register struct quota *q;
{
u.u_quota = q;
}
qwarn(dq)
register struct dquot *dq;
{
register struct fs *fs = NULL;
if (dq->dq_isoftlimit && dq->dq_curinodes >= dq->dq_isoftlimit) {
dq->dq_flags |= DQ_MOD;
fs = getfs(dq->dq_dev);
if (dq->dq_iwarn && --dq->dq_iwarn)
uprintf(
"Warning: too many files on %s, %d warning%s left\n"
, fs->fs_fsmnt
, dq->dq_iwarn
, dq->dq_iwarn > 1 ? "s" : ""
);
else
uprintf(
"WARNING: too many files on %s, NO MORE!!\n"
, fs->fs_fsmnt
);
} else
dq->dq_iwarn = MAX_IQ_WARN;
if (dq->dq_bsoftlimit && dq->dq_curblocks >= dq->dq_bsoftlimit) {
dq->dq_flags |= DQ_MOD;
if (fs == NULL)
fs = getfs(dq->dq_dev);
if (dq->dq_bwarn && --dq->dq_bwarn)
uprintf(
"Warning: too much disc space on %s, %d warning%s left\n"
, fs->fs_fsmnt
, dq->dq_bwarn
, dq->dq_bwarn > 1 ? "s" : ""
);
else
uprintf(
"WARNING: too much disc space on %s, NO MORE!!\n"
, fs->fs_fsmnt
);
} else
dq->dq_bwarn = MAX_DQ_WARN;
}
#endif