1*d51593aaSriastradh /* $NetBSD: quota1_subr.c,v 1.8 2023/02/22 21:49:45 riastradh Exp $ */
20367ea04Sbouyer /*-
30367ea04Sbouyer * Copyright (c) 2010 Manuel Bouyer
40367ea04Sbouyer * All rights reserved.
50367ea04Sbouyer *
60367ea04Sbouyer * Redistribution and use in source and binary forms, with or without
70367ea04Sbouyer * modification, are permitted provided that the following conditions
80367ea04Sbouyer * are met:
90367ea04Sbouyer * 1. Redistributions of source code must retain the above copyright
100367ea04Sbouyer * notice, this list of conditions and the following disclaimer.
110367ea04Sbouyer * 2. Redistributions in binary form must reproduce the above copyright
120367ea04Sbouyer * notice, this list of conditions and the following disclaimer in the
130367ea04Sbouyer * documentation and/or other materials provided with the distribution.
140367ea04Sbouyer *
150367ea04Sbouyer * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
160367ea04Sbouyer * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
170367ea04Sbouyer * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
180367ea04Sbouyer * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
190367ea04Sbouyer * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
200367ea04Sbouyer * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
210367ea04Sbouyer * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
220367ea04Sbouyer * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
230367ea04Sbouyer * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
240367ea04Sbouyer * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
250367ea04Sbouyer * POSSIBILITY OF SUCH DAMAGE.
260367ea04Sbouyer */
270367ea04Sbouyer
280367ea04Sbouyer #include <sys/cdefs.h>
29*d51593aaSriastradh __KERNEL_RCSID(0, "$NetBSD: quota1_subr.c,v 1.8 2023/02/22 21:49:45 riastradh Exp $");
300367ea04Sbouyer
310367ea04Sbouyer #include <sys/types.h>
320367ea04Sbouyer #include <machine/limits.h>
330367ea04Sbouyer
340c036249Sdholland #include <sys/quota.h>
350367ea04Sbouyer #include <ufs/ufs/quota1.h>
360367ea04Sbouyer
370367ea04Sbouyer static uint64_t
dqblk2q2e_limit(uint32_t lim)380367ea04Sbouyer dqblk2q2e_limit(uint32_t lim)
390367ea04Sbouyer {
400367ea04Sbouyer if (lim == 0)
410367ea04Sbouyer return UQUAD_MAX;
420367ea04Sbouyer else
430367ea04Sbouyer return (lim - 1);
440367ea04Sbouyer }
450367ea04Sbouyer
460367ea04Sbouyer static uint32_t
q2e2dqblk_limit(uint64_t lim)470367ea04Sbouyer q2e2dqblk_limit(uint64_t lim)
480367ea04Sbouyer {
490367ea04Sbouyer if (lim == UQUAD_MAX)
500367ea04Sbouyer return 0;
510367ea04Sbouyer else
520367ea04Sbouyer return (lim + 1);
530367ea04Sbouyer }
540367ea04Sbouyer
550367ea04Sbouyer void
dqblk_to_quotavals(const struct dqblk * dqblk,struct quotaval * blocks,struct quotaval * files)566d4304b9Sdholland dqblk_to_quotavals(const struct dqblk *dqblk,
576d4304b9Sdholland struct quotaval *blocks, struct quotaval *files)
580367ea04Sbouyer {
596f6767e2Sdholland /* XXX is qv_grace getting handled correctly? */
600367ea04Sbouyer
616d4304b9Sdholland blocks->qv_hardlimit = dqblk2q2e_limit(dqblk->dqb_bhardlimit);
626d4304b9Sdholland blocks->qv_softlimit = dqblk2q2e_limit(dqblk->dqb_bsoftlimit);
636d4304b9Sdholland blocks->qv_usage = dqblk->dqb_curblocks;
646d4304b9Sdholland blocks->qv_expiretime = dqblk->dqb_btime;
656f6767e2Sdholland
666d4304b9Sdholland files->qv_hardlimit = dqblk2q2e_limit(dqblk->dqb_ihardlimit);
676d4304b9Sdholland files->qv_softlimit = dqblk2q2e_limit(dqblk->dqb_isoftlimit);
686d4304b9Sdholland files->qv_usage = dqblk->dqb_curinodes;
696d4304b9Sdholland files->qv_expiretime = dqblk->dqb_itime;
700367ea04Sbouyer }
710367ea04Sbouyer
720367ea04Sbouyer void
quotavals_to_dqblk(const struct quotaval * blocks,const struct quotaval * files,struct dqblk * dqblk)736d4304b9Sdholland quotavals_to_dqblk(const struct quotaval *blocks, const struct quotaval *files,
746d4304b9Sdholland struct dqblk *dqblk)
750367ea04Sbouyer {
766f6767e2Sdholland /* XXX is qv_grace getting handled correctly? */
776f6767e2Sdholland
786d4304b9Sdholland dqblk->dqb_bhardlimit = q2e2dqblk_limit(blocks->qv_hardlimit);
796d4304b9Sdholland dqblk->dqb_bsoftlimit = q2e2dqblk_limit(blocks->qv_softlimit);
806d4304b9Sdholland dqblk->dqb_curblocks = blocks->qv_usage;
816d4304b9Sdholland dqblk->dqb_btime = blocks->qv_expiretime;
820367ea04Sbouyer
836d4304b9Sdholland dqblk->dqb_ihardlimit = q2e2dqblk_limit(files->qv_hardlimit);
846d4304b9Sdholland dqblk->dqb_isoftlimit = q2e2dqblk_limit(files->qv_softlimit);
856d4304b9Sdholland dqblk->dqb_curinodes = files->qv_usage;
866d4304b9Sdholland dqblk->dqb_itime = files->qv_expiretime;
870367ea04Sbouyer }
88