|
|
1.1 ! root 1: /* quota_subr.c 6.1 83/07/29 */ ! 2: ! 3: #ifdef QUOTA ! 4: /* ! 5: * MELBOURNE QUOTAS ! 6: * ! 7: * Miscellaneous subroutines. ! 8: */ ! 9: #include "../h/param.h" ! 10: #include "../h/systm.h" ! 11: #include "../h/dir.h" ! 12: #include "../h/user.h" ! 13: #include "../h/proc.h" ! 14: #include "../h/inode.h" ! 15: #include "../h/quota.h" ! 16: #include "../h/mount.h" ! 17: #include "../h/fs.h" ! 18: #include "../h/uio.h" ! 19: #include "../h/nami.h" ! 20: ! 21: struct dquot * ! 22: dqp(q, dev) ! 23: struct quota *q; ! 24: dev_t dev; ! 25: { ! 26: register struct dquot **dqq; ! 27: register i; ! 28: ! 29: if (q == NOQUOTA || q->q_flags & Q_NDQ) ! 30: return (NODQUOT); ! 31: i = getfsx(dev); ! 32: if (i < 0 || i >= NMOUNT) ! 33: return (NODQUOT); ! 34: dqq = &q->q_dq[i]; ! 35: if (*dqq == LOSTDQUOT) { ! 36: *dqq = discquota(q->q_uid, mount[i].m_qinod); ! 37: if (*dqq != NODQUOT) ! 38: (*dqq)->dq_own = q; ! 39: } ! 40: if (*dqq != NODQUOT) ! 41: (*dqq)->dq_cnt++; ! 42: return (*dqq); ! 43: } ! 44: ! 45: /* ! 46: * Quota cleanup at process exit, or when ! 47: * switching to another user. ! 48: */ ! 49: qclean() ! 50: { ! 51: register struct proc *p = u.u_procp; ! 52: register struct quota *q = p->p_quota; ! 53: ! 54: if (q == NOQUOTA) ! 55: return; ! 56: /* ! 57: * Before we rid ourselves of this quota, we must be sure that ! 58: * we no longer reference it (otherwise clock might do nasties). ! 59: * But we have to have some quota (or clock will get upset). ! 60: * (Who is this clock anyway ??). So we will give ourselves ! 61: * root's quota for a short while, without counting this as ! 62: * a reference in the ref count (as either this proc is just ! 63: * about to die, in which case it refers to nothing, or it is ! 64: * about to be given a new quota, which will just overwrite this ! 65: * one). ! 66: */ ! 67: p->p_quota = quota; ! 68: u.u_quota = quota; ! 69: delquota(q); ! 70: } ! 71: ! 72: qstart(q) ! 73: register struct quota *q; ! 74: { ! 75: ! 76: u.u_quota = q; ! 77: u.u_procp->p_quota = q; ! 78: } ! 79: ! 80: qwarn(dq) ! 81: register struct dquot *dq; ! 82: { ! 83: register struct fs *fs = NULL; ! 84: ! 85: if (dq->dq_isoftlimit && dq->dq_curinodes >= dq->dq_isoftlimit) { ! 86: dq->dq_flags |= DQ_MOD; ! 87: fs = getfs(dq->dq_dev); ! 88: if (dq->dq_iwarn && --dq->dq_iwarn) ! 89: uprintf( ! 90: "Warning: too many files on %s, %d warning%s left\n" ! 91: , fs->fs_fsmnt ! 92: , dq->dq_iwarn ! 93: , dq->dq_iwarn > 1 ? "s" : "" ! 94: ); ! 95: else ! 96: uprintf( ! 97: "WARNING: too many files on %s, NO MORE!!\n" ! 98: , fs->fs_fsmnt ! 99: ); ! 100: } else ! 101: dq->dq_iwarn = MAX_IQ_WARN; ! 102: ! 103: if (dq->dq_bsoftlimit && dq->dq_curblocks >= dq->dq_bsoftlimit) { ! 104: dq->dq_flags |= DQ_MOD; ! 105: if (fs == NULL) ! 106: fs = getfs(dq->dq_dev); ! 107: if (dq->dq_bwarn && --dq->dq_bwarn) ! 108: uprintf( ! 109: "Warning: too much disc space on %s, %d warning%s left\n" ! 110: , fs->fs_fsmnt ! 111: , dq->dq_bwarn ! 112: , dq->dq_bwarn > 1 ? "s" : "" ! 113: ); ! 114: else ! 115: uprintf( ! 116: "WARNING: too much disc space on %s, NO MORE!!\n" ! 117: , fs->fs_fsmnt ! 118: ); ! 119: } else ! 120: dq->dq_bwarn = MAX_DQ_WARN; ! 121: } ! 122: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.