xref: /netbsd/sys/ufs/ufs/quota1_subr.c (revision d51593aa)
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