Module Name: src Committed By: bouyer Date: Tue Feb 8 20:00:54 UTC 2011
Modified Files: src/sys/ufs/ffs [bouyer-quota2]: ffs_vfsops.c src/sys/ufs/ufs [bouyer-quota2]: ufs_extern.h ufs_quota.c ufs_quota.h ufs_quota1.c ufs_quota2.c Log Message: Minimal hacking to make 'options QUOTA' compile again. To generate a diff of this commit: cvs rdiff -u -r1.263.4.1 -r1.263.4.2 src/sys/ufs/ffs/ffs_vfsops.c cvs rdiff -u -r1.62.8.1 -r1.62.8.2 src/sys/ufs/ufs/ufs_extern.h cvs rdiff -u -r1.68.4.8 -r1.68.4.9 src/sys/ufs/ufs/ufs_quota.c cvs rdiff -u -r1.1.2.5 -r1.1.2.6 src/sys/ufs/ufs/ufs_quota.h cvs rdiff -u -r1.1.2.2 -r1.1.2.3 src/sys/ufs/ufs/ufs_quota1.c cvs rdiff -u -r1.1.2.9 -r1.1.2.10 src/sys/ufs/ufs/ufs_quota2.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/ufs/ffs/ffs_vfsops.c diff -u src/sys/ufs/ffs/ffs_vfsops.c:1.263.4.1 src/sys/ufs/ffs/ffs_vfsops.c:1.263.4.2 --- src/sys/ufs/ffs/ffs_vfsops.c:1.263.4.1 Thu Jan 20 14:25:02 2011 +++ src/sys/ufs/ffs/ffs_vfsops.c Tue Feb 8 20:00:53 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: ffs_vfsops.c,v 1.263.4.1 2011/01/20 14:25:02 bouyer Exp $ */ +/* $NetBSD: ffs_vfsops.c,v 1.263.4.2 2011/02/08 20:00:53 bouyer Exp $ */ /*- * Copyright (c) 2008, 2009 The NetBSD Foundation, Inc. @@ -61,7 +61,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: ffs_vfsops.c,v 1.263.4.1 2011/01/20 14:25:02 bouyer Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ffs_vfsops.c,v 1.263.4.2 2011/02/08 20:00:53 bouyer Exp $"); #if defined(_KERNEL_OPT) #include "opt_ffs.h" @@ -1474,23 +1474,12 @@ flags &= ~FORCECLOSE; ump = VFSTOUFS(mp); #ifdef QUOTA - if (mp->mnt_flag & MNT_QUOTA) { - int i; - if ((error = vflush(mp, NULLVP, SKIPSYSTEM | flags)) != 0) - return (error); - for (i = 0; i < MAXQUOTAS; i++) { - if (ump->um_quotas[i] == NULLVP) - continue; - quotaoff(l, mp, i); - } - /* - * Here we fall through to vflush again to ensure - * that we have gotten rid of all the system vnodes. - */ - } + if ((error = quota1_umount(mp, flags)) != 0) + return (error); #endif #ifdef QUOTA2 - quota2_umount(mp); + if ((error = quota2_umount(mp, flags)) != 0) + return (error); #endif if ((error = vflush(mp, 0, SKIPSYSTEM | flags)) != 0) return (error); Index: src/sys/ufs/ufs/ufs_extern.h diff -u src/sys/ufs/ufs/ufs_extern.h:1.62.8.1 src/sys/ufs/ufs/ufs_extern.h:1.62.8.2 --- src/sys/ufs/ufs/ufs_extern.h:1.62.8.1 Thu Jan 20 14:25:03 2011 +++ src/sys/ufs/ufs/ufs_extern.h Tue Feb 8 20:00:53 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: ufs_extern.h,v 1.62.8.1 2011/01/20 14:25:03 bouyer Exp $ */ +/* $NetBSD: ufs_extern.h,v 1.62.8.2 2011/02/08 20:00:53 bouyer Exp $ */ /*- * Copyright (c) 1991, 1993, 1994 @@ -144,8 +144,11 @@ int quota_handle_cmd(struct mount *, struct lwp *, prop_dictionary_t); int qsync(struct mount *); +/* ufs_quota1.c */ +int quota1_umount(struct mount *, int); + /* ufs_quota2.c */ -void quota2_umount(struct mount *); +int quota2_umount(struct mount *, int); /* ufs_vfsops.c */ void ufs_init(void); Index: src/sys/ufs/ufs/ufs_quota.c diff -u src/sys/ufs/ufs/ufs_quota.c:1.68.4.8 src/sys/ufs/ufs/ufs_quota.c:1.68.4.9 --- src/sys/ufs/ufs/ufs_quota.c:1.68.4.8 Mon Feb 7 20:30:39 2011 +++ src/sys/ufs/ufs/ufs_quota.c Tue Feb 8 20:00:53 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: ufs_quota.c,v 1.68.4.8 2011/02/07 20:30:39 bouyer Exp $ */ +/* $NetBSD: ufs_quota.c,v 1.68.4.9 2011/02/08 20:00:53 bouyer Exp $ */ /* * Copyright (c) 1982, 1986, 1990, 1993, 1995 @@ -35,7 +35,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: ufs_quota.c,v 1.68.4.8 2011/02/07 20:30:39 bouyer Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ufs_quota.c,v 1.68.4.9 2011/02/08 20:00:53 bouyer Exp $"); #if defined(_KERNEL_OPT) #include "opt_quota.h" @@ -284,7 +284,8 @@ } #ifdef QUOTA if (ump->um_flags & UFS_QUOTA) - error = quota1_handle_cmd_get(ump, type, id, replies) + error = quota1_handle_cmd_get(ump, type, id, defaultq, + replies); else #endif #ifdef QUOTA2 @@ -352,7 +353,8 @@ } #ifdef QUOTA if (ump->um_flags & UFS_QUOTA) - error = quota1_handle_cmd_get(ump, type, id, data); + error = quota1_handle_cmd_set(ump, type, id, defaultq, + data); else #endif #ifdef QUOTA2 Index: src/sys/ufs/ufs/ufs_quota.h diff -u src/sys/ufs/ufs/ufs_quota.h:1.1.2.5 src/sys/ufs/ufs/ufs_quota.h:1.1.2.6 --- src/sys/ufs/ufs/ufs_quota.h:1.1.2.5 Mon Feb 7 20:30:39 2011 +++ src/sys/ufs/ufs/ufs_quota.h Tue Feb 8 20:00:53 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: ufs_quota.h,v 1.1.2.5 2011/02/07 20:30:39 bouyer Exp $ */ +/* $NetBSD: ufs_quota.h,v 1.1.2.6 2011/02/08 20:00:53 bouyer Exp $ */ /* * Copyright (c) 1982, 1986, 1990, 1993, 1995 @@ -83,8 +83,8 @@ #define dq_ihardlimit dq_un.dq1_dqb.dqb_ihardlimit #define dq_isoftlimit dq_un.dq1_dqb.dqb_isoftlimit #define dq_curinodes dq_un.dq1_dqb.dqb_curinodes -#define dq_btime dq_un.dq_dqb.dqb_btime -#define dq_itime dq_un.dq_dqb.dqb_itime +#define dq_btime dq_un.dq1_dqb.dqb_btime +#define dq_itime dq_un.dq1_dqb.dqb_itime #define dq2_lblkno dq_un.dq2_desc.dq2_lblkno #define dq2_blkoff dq_un.dq2_desc.dq2_blkoff @@ -124,6 +124,8 @@ int q1sync(struct mount *); int dq1get(struct vnode *, u_long, struct ufsmount *, int, struct dquot *); int dq1sync(struct vnode *, struct dquot *); +int quota1_handle_cmd_get(struct ufsmount *, int, int, int, prop_array_t); +int quota1_handle_cmd_set(struct ufsmount *, int, int, int, prop_dictionary_t); int chkdq2(struct inode *, int64_t, kauth_cred_t, int); int chkiq2(struct inode *, int32_t, kauth_cred_t, int); Index: src/sys/ufs/ufs/ufs_quota1.c diff -u src/sys/ufs/ufs/ufs_quota1.c:1.1.2.2 src/sys/ufs/ufs/ufs_quota1.c:1.1.2.3 --- src/sys/ufs/ufs/ufs_quota1.c:1.1.2.2 Mon Jan 31 15:24:10 2011 +++ src/sys/ufs/ufs/ufs_quota1.c Tue Feb 8 20:00:53 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: ufs_quota1.c,v 1.1.2.2 2011/01/31 15:24:10 bouyer Exp $ */ +/* $NetBSD: ufs_quota1.c,v 1.1.2.3 2011/02/08 20:00:53 bouyer Exp $ */ /* * Copyright (c) 1982, 1986, 1990, 1993, 1995 @@ -35,7 +35,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: ufs_quota1.c,v 1.1.2.2 2011/01/31 15:24:10 bouyer Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ufs_quota1.c,v 1.1.2.3 2011/02/08 20:00:53 bouyer Exp $"); #include <sys/param.h> #include <sys/kernel.h> @@ -47,16 +47,15 @@ #include <sys/mount.h> #include <sys/kauth.h> -#include <ufs/ufs/quota.h> -#include <ufs/ufs/ufs_quota.h> +#include <ufs/ufs/quota1.h> #include <ufs/ufs/inode.h> #include <ufs/ufs/ufsmount.h> #include <ufs/ufs/ufs_extern.h> +#include <ufs/ufs/ufs_quota.h> static int chkdqchg(struct inode *, int64_t, kauth_cred_t, int); static int chkiqchg(struct inode *, int32_t, kauth_cred_t, int); -static void dqref(struct dquot *); -static void dqrele(struct vnode *, struct dquot *); +static int quotaoff(struct lwp *, struct mount *, int); /* * Update disk usage, and take corrective action. @@ -82,7 +81,7 @@ dq->dq_curblocks = ncurblocks; else dq->dq_curblocks = 0; - dq->dq_flags &= ~DQ_BLKS; + dq->dq_flags &= ~DQ_WARN(QL_BLOCK); dq->dq_flags |= DQ_MOD; mutex_exit(&dq->dq_interlock); } @@ -128,12 +127,12 @@ * If user would exceed their hard limit, disallow space allocation. */ if (ncurblocks >= dq->dq_bhardlimit && dq->dq_bhardlimit) { - if ((dq->dq_flags & DQ_BLKS) == 0 && + if ((dq->dq_flags & DQ_WARN(QL_BLOCK)) == 0 && ip->i_uid == kauth_cred_geteuid(cred)) { uprintf("\n%s: write failed, %s disk limit reached\n", ITOV(ip)->v_mount->mnt_stat.f_mntonname, quotatypes[type]); - dq->dq_flags |= DQ_BLKS; + dq->dq_flags |= DQ_WARN(QL_BLOCK); } return (EDQUOT); } @@ -152,13 +151,13 @@ return (0); } if (time_second > dq->dq_btime) { - if ((dq->dq_flags & DQ_BLKS) == 0 && + if ((dq->dq_flags & DQ_WARN(QL_BLOCK)) == 0 && ip->i_uid == kauth_cred_geteuid(cred)) { uprintf("\n%s: write failed, %s %s\n", ITOV(ip)->v_mount->mnt_stat.f_mntonname, quotatypes[type], "disk quota exceeded for too long"); - dq->dq_flags |= DQ_BLKS; + dq->dq_flags |= DQ_WARN(QL_BLOCK); } return (EDQUOT); } @@ -190,7 +189,7 @@ dq->dq_curinodes = ncurinodes; else dq->dq_curinodes = 0; - dq->dq_flags &= ~DQ_INODS; + dq->dq_flags &= ~DQ_WARN(QL_FILE); dq->dq_flags |= DQ_MOD; mutex_exit(&dq->dq_interlock); } @@ -235,12 +234,12 @@ * If user would exceed their hard limit, disallow inode allocation. */ if (ncurinodes >= dq->dq_ihardlimit && dq->dq_ihardlimit) { - if ((dq->dq_flags & DQ_INODS) == 0 && + if ((dq->dq_flags & DQ_WARN(QL_FILE)) == 0 && ip->i_uid == kauth_cred_geteuid(cred)) { uprintf("\n%s: write failed, %s inode limit reached\n", ITOV(ip)->v_mount->mnt_stat.f_mntonname, quotatypes[type]); - dq->dq_flags |= DQ_INODS; + dq->dq_flags |= DQ_WARN(QL_FILE); } return (EDQUOT); } @@ -259,13 +258,13 @@ return (0); } if (time_second > dq->dq_itime) { - if ((dq->dq_flags & DQ_INODS) == 0 && + if ((dq->dq_flags & DQ_WARN(QL_FILE)) == 0 && ip->i_uid == kauth_cred_geteuid(cred)) { uprintf("\n%s: write failed, %s %s\n", ITOV(ip)->v_mount->mnt_stat.f_mntonname, quotatypes[type], "inode quota exceeded for too long"); - dq->dq_flags |= DQ_INODS; + dq->dq_flags |= DQ_WARN(QL_FILE); } return (EDQUOT); } @@ -273,14 +272,36 @@ return (0); } +int +quota1_umount(struct mount *mp, int flags) +{ + int i, error; + struct ufsmount *ump = VFSTOUFS(mp); + struct lwp *l = curlwp; + + if ((ump->um_flags & UFS_QUOTA) == 0) + return 0; + + if ((error = vflush(mp, NULLVP, SKIPSYSTEM | flags)) != 0) + return (error); + + for (i = 0; i < MAXQUOTAS; i++) { + if (ump->um_quotas[i] != NULLVP) { + quotaoff(l, mp, i); + } + } + return 0; +} + /* * Code to process quotactl commands. */ +#if 0 /* - * Q_QUOTAON - set up a quota file for a particular file system. + * set up a quota file for a particular file system. */ -int +static int quotaon(struct lwp *l, struct mount *mp, int type, void *fname) { struct ufsmount *ump = VFSTOUFS(mp); @@ -396,11 +417,12 @@ quotaoff(l, mp, type); return (error); } +#endif /* - * Q_QUOTAOFF - turn off disk quotas for a filesystem. + * turn off disk quotas for a filesystem. */ -int +static int quotaoff(struct lwp *l, struct mount *mp, int type) { struct vnode *vp; @@ -476,6 +498,22 @@ return (error); } +int +quota1_handle_cmd_get(struct ufsmount *ump, int type, int id, + int defaultq, prop_array_t replies) +{ + return EOPNOTSUPP; +} + +int +quota1_handle_cmd_set(struct ufsmount *ump, int type, int id, + int defaultq, prop_dictionary_t data) +{ + return EOPNOTSUPP; +} + + +#if 0 /* * Q_GETQUOTA - return current values in a dqblk structure. */ @@ -487,7 +525,7 @@ if ((error = dqget(NULLVP, id, VFSTOUFS(mp), type, &dq)) != 0) return (error); - memcpy(dqb, (void *)&dq->dq_dqb, sizeof (struct dqblk)); + memcpy(dqb, (void *)&dq->dq_un.dq1_dqb, sizeof (struct dqblk)); dqrele(NULLVP, dq); return (error); } @@ -526,11 +564,11 @@ dq->dq_curinodes >= dqb->dqb_isoftlimit && (dq->dq_isoftlimit == 0 || dq->dq_curinodes < dq->dq_isoftlimit)) dqb->dqb_itime = time_second + ump->umq1_itime[type]; - dq->dq_dqb = *dqb; + dq->dq_un.dq1_dqb = *dqb; if (dq->dq_curblocks < dq->dq_bsoftlimit) - dq->dq_flags &= ~DQ_BLKS; + dq->dq_flags &= ~DQ_WARN(QL_BLOCK); if (dq->dq_curinodes < dq->dq_isoftlimit) - dq->dq_flags &= ~DQ_INODS; + dq->dq_flags &= ~DQ_WARN(QL_FILE); if (dq->dq_isoftlimit == 0 && dq->dq_bsoftlimit == 0 && dq->dq_ihardlimit == 0 && dq->dq_bhardlimit == 0) dq->dq_flags |= DQ_FAKE; @@ -574,14 +612,15 @@ dq->dq_curblocks = usage.dqb_curblocks; dq->dq_curinodes = usage.dqb_curinodes; if (dq->dq_curblocks < dq->dq_bsoftlimit) - dq->dq_flags &= ~DQ_BLKS; + dq->dq_flags &= ~DQ_WARN(QL_BLOCK); if (dq->dq_curinodes < dq->dq_isoftlimit) - dq->dq_flags &= ~DQ_INODS; + dq->dq_flags &= ~DQ_WARN(QL_FILE); dq->dq_flags |= DQ_MOD; mutex_exit(&dq->dq_interlock); dqrele(NULLVP, dq); return (0); } +#endif /* * Q_SYNC - sync quota files to disk. @@ -655,18 +694,18 @@ * reading the information from the file if necessary. */ int -dq1get(struct vnode *dqvp, , u_long id, struct ufsmount *ump, int type, +dq1get(struct vnode *dqvp, u_long id, struct ufsmount *ump, int type, struct dquot *dq) { struct iovec aiov; struct uio auio; int error; - KASSERT(mutex_locked(&dq->dq_interlock); + KASSERT(mutex_locked(&dq->dq_interlock)); vn_lock(dqvp, LK_EXCLUSIVE | LK_RETRY); auio.uio_iov = &aiov; auio.uio_iovcnt = 1; - aiov.iov_base = (void *)&dq->dq_dqb; + aiov.iov_base = (void *)&dq->dq_un.dq1_dqb; aiov.iov_len = sizeof (struct dqblk); auio.uio_resid = sizeof (struct dqblk); auio.uio_offset = (off_t)(id * sizeof (struct dqblk)); @@ -674,7 +713,7 @@ UIO_SETUP_SYSSPACE(&auio); error = VOP_READ(dqvp, &auio, 0, ump->um_cred[type]); if (auio.uio_resid == sizeof(struct dqblk) && error == 0) - memset((void *)&dq->dq_dqb, 0, sizeof(struct dqblk)); + memset((void *)&dq->dq_un.dq1_dqb, 0, sizeof(struct dqblk)); VOP_UNLOCK(dqvp); /* * I/O error in reading quota file, release @@ -720,7 +759,7 @@ vn_lock(dqvp, LK_EXCLUSIVE | LK_RETRY); auio.uio_iov = &aiov; auio.uio_iovcnt = 1; - aiov.iov_base = (void *)&dq->dq_dqb; + aiov.iov_base = (void *)&dq->dq_un.dq1_dqb; aiov.iov_len = sizeof (struct dqblk); auio.uio_resid = sizeof (struct dqblk); auio.uio_offset = (off_t)(dq->dq_id * sizeof (struct dqblk)); Index: src/sys/ufs/ufs/ufs_quota2.c diff -u src/sys/ufs/ufs/ufs_quota2.c:1.1.2.9 src/sys/ufs/ufs/ufs_quota2.c:1.1.2.10 --- src/sys/ufs/ufs/ufs_quota2.c:1.1.2.9 Mon Feb 7 20:30:39 2011 +++ src/sys/ufs/ufs/ufs_quota2.c Tue Feb 8 20:00:53 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: ufs_quota2.c,v 1.1.2.9 2011/02/07 20:30:39 bouyer Exp $ */ +/* $NetBSD: ufs_quota2.c,v 1.1.2.10 2011/02/08 20:00:53 bouyer Exp $ */ /*- * Copyright (c) 2010 Manuel Bouyer * All rights reserved. @@ -28,7 +28,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: ufs_quota2.c,v 1.1.2.9 2011/02/07 20:30:39 bouyer Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ufs_quota2.c,v 1.1.2.10 2011/02/08 20:00:53 bouyer Exp $"); #include <sys/buf.h> #include <sys/param.h> @@ -199,12 +199,15 @@ return ret; } -void -quota2_umount(struct mount *mp) +int +quota2_umount(struct mount *mp, int flags) { int i, error; struct ufsmount *ump = VFSTOUFS(mp); + if ((ump->um_flags & UFS_QUOTA2) == 0) + return 0; + for (i = 0; i < MAXQUOTAS; i++) { if (ump->um_quotas[i]) { error = vn_close(ump->um_quotas[i], FREAD|FWRITE, @@ -212,9 +215,11 @@ if (error) { printf("quota2_umount failed: close(%p) %d\n", ump->um_quotas[i], error); + return error; } } } + return 0; } static int @@ -322,13 +327,12 @@ } /* now get the corresponding quota entry */ for (i = 0; i < MAXQUOTAS; i++) { - struct vnode *dqvp = ump->um_quotas[i]; bpp[i] = NULL; q2ep[i] = NULL; dq = ip->i_dquot[i]; if (dq == NODQUOT) continue; - KASSERT(dqvp != NULL); + KASSERT(ump->um_quotas[i] != NULL); if ((dq->dq2_lblkno | dq->dq2_blkoff) == 0) { if (alloc == 0) {