/* quota_sys.c 6.1 83/07/29 */
* The sys call that tells the system about a quota file.
} *uap
= (struct a
*)u
.u_ap
;
register struct mount
*mp
;
u
.u_error
= getmdev(&dev
);
u
.u_dirp
= (caddr_t
) uap
->fname
;
for (mp
= mount
; mp
< &mount
[NMOUNT
]; mp
++)
if (mp
->m_bufp
&& mp
->m_dev
== dev
) {
* Sys call to allow users to find out
* their current position wrt quota's
* and to allow super users to alter it.
} *uap
= (struct a
*)u
.u_ap
;
register struct quota
*q
;
if (uap
->uid
!= u
.u_ruid
&& uap
->uid
!= u
.u_quota
->q_uid
&& !suser())
if (uap
->cmd
!= Q_SYNC
&& uap
->cmd
!= Q_SETUID
) {
q
= getquota(uap
->uid
, uap
->cmd
== Q_DOWARN
, 0);
u
.u_error
= setdlim(q
, (dev_t
)uap
->arg
, uap
->addr
);
u
.u_error
= getdlim(q
, (dev_t
)uap
->arg
, uap
->addr
);
u
.u_error
= setduse(q
, (dev_t
)uap
->arg
, uap
->addr
);
u
.u_error
= setwarn(q
, (dev_t
)uap
->arg
, uap
->addr
);
u
.u_error
= dowarn(q
, (dev_t
)uap
->arg
);
u
.u_error
= qsync((dev_t
)uap
->arg
);
u
.u_error
= qsetuid(uap
->uid
, uap
->arg
);
* Q_SETDLIM - assign an entire dqblk structure.
register struct quota
*q
;
register struct inode
*ip
;
register struct dquot
*dq
, *odq
;
return (u
.u_error
); /* XXX */
if (index
< 0 || index
>= NMOUNT
)
dq
= dqalloc(q
->q_uid
, dev
);
if (dq
->dq_uid
!= q
->q_uid
)
while (dq
->dq_flags
& DQ_LOCK
) {
sleep((caddr_t
)dq
, PINOD
+1);
error
= copyin(addr
, (caddr_t
)&newlim
, sizeof (struct dqblk
));
if (dq
->dq_isoftlimit
== 0 && dq
->dq_bsoftlimit
== 0) {
q
->q_dq
[index
] = NODQUOT
;
if (dq
->dq_cnt
== 0) /* no files open using quota */
for (ip
= inode
; ip
< inodeNINODE
; ip
++)
if (ip
->i_uid
== q
->q_uid
&& ip
->i_dev
== dev
) {
* Q_GETDLIM - return current values in a dqblk structure.
register struct dquot
*dq
;
error
= copyout((caddr_t
)&dq
->dq_dqb
, addr
, sizeof (struct dqblk
));
* Q_SETDUSE - set current inode and disc block totals.
* Resets warnings and associated flags.
register struct quota
*q
;
register struct dquot
*dq
;
while (dq
->dq_flags
& DQ_LOCK
) {
sleep((caddr_t
)dq
, PINOD
+1);
if (dq
->dq_uid
!= q
->q_uid
)
error
= copyin(addr
, (caddr_t
)&usage
, sizeof (usage
));
dq
->dq_curinodes
= usage
.du_curinodes
;
dq
->dq_curblocks
= usage
.du_curblocks
;
if (dq
->dq_curinodes
< dq
->dq_isoftlimit
)
dq
->dq_iwarn
= MAX_IQ_WARN
;
if (dq
->dq_curblocks
< dq
->dq_bsoftlimit
)
dq
->dq_bwarn
= MAX_DQ_WARN
;
dq
->dq_flags
&= ~(DQ_INODS
| DQ_BLKS
);
* Q_SETWARN - set warning counters.
register struct quota
*q
;
register struct dquot
*dq
;
return (u
.u_error
); /* XXX */
while (dq
->dq_flags
& DQ_LOCK
) {
sleep((caddr_t
)dq
, PINOD
+1);
if (dq
->dq_uid
!= q
->q_uid
)
error
= copyin(addr
, (caddr_t
)&warn
, sizeof (warn
));
dq
->dq_iwarn
= warn
.dw_iwarn
;
dq
->dq_bwarn
= warn
.dw_bwarn
;
dq
->dq_flags
&= ~(DQ_INODS
| DQ_BLKS
);
* Q_DOWARN - force warning(s) to user(s).
register struct quota
*q
;
register struct dquot
*dq
, **dqq
;
if (!suser() || u
.u_ttyp
== NULL
)
return (u
.u_error
); /* XXX */
for (dqq
= q
->q_dq
; dqq
< &q
->q_dq
[NMOUNT
]; dqq
++) {
if (dq
!= NODQUOT
&& dq
!= LOSTDQUOT
)
* Q_SYNC - sync quota files to disc.
register struct quota
*q
;
register struct mount
*mp
;
return (u
.u_error
); /* XXX */
for (mp
= mount
, index
= 0; mp
< &mount
[NMOUNT
]; mp
++, index
++)
if (mp
->m_bufp
&& mp
->m_qinod
&&
(dev
== NODEV
|| dev
== mp
->m_dev
)) {
for (q
= quota
; q
< quotaNQUOTA
; q
++)
putdq(mp
, q
->q_dq
[index
], 0);
* Q_SETUID - change quota to a particular uid.
register struct quota
*q
;
if (uid
== u
.u_quota
->q_uid
)
return (u
.u_error
); /* XXX */
q
= getquota(uid
, 0, noquota
? Q_NDQ
: 0);