Bring in a copy of ffs_quota2_mount() for reference.

Add stuff to struct lfs that it needs to initialize.
Clear these fields in mount as there's no on-disk support for quota2;
but this increases the chances of being able to add it (or something
like it) in the future.
This commit is contained in:
dholland 2013-07-28 01:22:55 +00:00
parent d3cfc0d3d4
commit 8848af09e1
4 changed files with 94 additions and 6 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: lfs.h,v 1.159 2013/07/28 01:10:49 dholland Exp $ */
/* $NetBSD: lfs.h,v 1.160 2013/07/28 01:22:55 dholland Exp $ */
/* from NetBSD: dinode.h,v 1.22 2013/01/22 09:39:18 dholland Exp */
/* from NetBSD: dir.h,v 1.21 2009/07/22 04:49:19 dholland Exp */
@ -1006,6 +1006,12 @@ struct lfs {
int um_maxsymlinklen;
int um_dirblksiz;
u_int64_t um_maxfilesize;
/* Stuff used by quota2 code, not currently operable */
unsigned lfs_use_quota2 : 1;
uint32_t lfs_quota_magic;
uint8_t lfs_quota_flags;
uint64_t lfs_quotaino[2];
#endif
};

View File

@ -1,4 +1,4 @@
/* $NetBSD: lfs_vfsops.c,v 1.310 2013/07/28 01:10:49 dholland Exp $ */
/* $NetBSD: lfs_vfsops.c,v 1.311 2013/07/28 01:22:55 dholland Exp $ */
/*-
* Copyright (c) 1999, 2000, 2001, 2002, 2003, 2007, 2007
@ -61,7 +61,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: lfs_vfsops.c,v 1.310 2013/07/28 01:10:49 dholland Exp $");
__KERNEL_RCSID(0, "$NetBSD: lfs_vfsops.c,v 1.311 2013/07/28 01:22:55 dholland Exp $");
#if defined(_KERNEL_OPT)
#include "opt_lfs.h"
@ -1003,6 +1003,14 @@ lfs_mountfs(struct vnode *devvp, struct mount *mp, struct lwp *l)
fs->um_dirblksiz = LFS_DIRBLKSIZ;
fs->um_maxfilesize = fs->lfs_maxfilesize;
/* quota stuff */
/* XXX: these need to come from the on-disk superblock to be used */
fs->lfs_use_quota2 = 0;
fs->lfs_quota_magic = 0;
fs->lfs_quota_flags = 0;
fs->lfs_quotaino[0] = 0;
fs->lfs_quotaino[1] = 0;
/* Initialize the mount structure. */
dev = devvp->v_rdev;
mp->mnt_data = ump;

View File

@ -1,4 +1,4 @@
/* $NetBSD: ulfs_extern.h,v 1.9 2013/07/28 01:10:49 dholland Exp $ */
/* $NetBSD: ulfs_extern.h,v 1.10 2013/07/28 01:22:55 dholland Exp $ */
/* from NetBSD: ufs_extern.h,v 1.72 2012/05/09 00:21:18 riastradh Exp */
/*-
@ -158,6 +158,7 @@ int lfsquota1_umount(struct mount *, int);
/* ulfs_quota2.c */
int lfsquota2_umount(struct mount *, int);
int lfs_quota2_mount(struct mount *);
/* ulfs_vfsops.c */
void ulfs_init(void);

View File

@ -1,5 +1,6 @@
/* $NetBSD: ulfs_quota2.c,v 1.9 2013/07/28 01:10:49 dholland Exp $ */
/* $NetBSD: ulfs_quota2.c,v 1.10 2013/07/28 01:22:55 dholland Exp $ */
/* from NetBSD: ufs_quota2.c,v 1.35 2012/09/27 07:47:56 bouyer Exp */
/* from NetBSD: ffs_quota2.c,v 1.4 2011/06/12 03:36:00 rmind Exp */
/*-
* Copyright (c) 2010 Manuel Bouyer
@ -28,7 +29,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: ulfs_quota2.c,v 1.9 2013/07/28 01:10:49 dholland Exp $");
__KERNEL_RCSID(0, "$NetBSD: ulfs_quota2.c,v 1.10 2013/07/28 01:22:55 dholland Exp $");
#include <sys/buf.h>
#include <sys/param.h>
@ -1560,3 +1561,75 @@ lfs_dq2sync(struct vnode *vp, struct dquot *dq)
{
return 0;
}
int
lfs_quota2_mount(struct mount *mp)
{
struct ulfsmount *ump = VFSTOULFS(mp);
struct lfs *fs = ump->um_lfs;
int error = 0;
struct vnode *vp;
struct lwp *l = curlwp;
if ((fs->lfs_use_quota2) == 0)
return 0;
fs->um_flags |= ULFS_QUOTA2;
ump->umq2_bsize = fs->lfs_bsize;
ump->umq2_bmask = fs->lfs_bmask;
if (fs->lfs_quota_magic != Q2_HEAD_MAGIC) {
printf("%s: Invalid quota magic number\n",
mp->mnt_stat.f_mntonname);
return EINVAL;
}
if ((fs->lfs_quota_flags & FS_Q2_DO_TYPE(ULFS_USRQUOTA)) &&
fs->lfs_quotaino[ULFS_USRQUOTA] == 0) {
printf("%s: no user quota inode\n",
mp->mnt_stat.f_mntonname);
error = EINVAL;
}
if ((fs->lfs_quota_flags & FS_Q2_DO_TYPE(ULFS_GRPQUOTA)) &&
fs->lfs_quotaino[ULFS_GRPQUOTA] == 0) {
printf("%s: no group quota inode\n",
mp->mnt_stat.f_mntonname);
error = EINVAL;
}
if (error)
return error;
if (fs->lfs_quota_flags & FS_Q2_DO_TYPE(ULFS_USRQUOTA) &&
ump->um_quotas[ULFS_USRQUOTA] == NULLVP) {
error = VFS_VGET(mp, fs->lfs_quotaino[ULFS_USRQUOTA], &vp);
if (error) {
printf("%s: can't vget() user quota inode: %d\n",
mp->mnt_stat.f_mntonname, error);
return error;
}
ump->um_quotas[ULFS_USRQUOTA] = vp;
ump->um_cred[ULFS_USRQUOTA] = l->l_cred;
mutex_enter(vp->v_interlock);
vp->v_writecount++;
mutex_exit(vp->v_interlock);
VOP_UNLOCK(vp);
}
if (fs->lfs_quota_flags & FS_Q2_DO_TYPE(ULFS_GRPQUOTA) &&
ump->um_quotas[ULFS_GRPQUOTA] == NULLVP) {
error = VFS_VGET(mp, fs->lfs_quotaino[ULFS_GRPQUOTA], &vp);
if (error) {
vn_close(ump->um_quotas[ULFS_USRQUOTA],
FREAD|FWRITE, l->l_cred);
printf("%s: can't vget() group quota inode: %d\n",
mp->mnt_stat.f_mntonname, error);
return error;
}
ump->um_quotas[ULFS_GRPQUOTA] = vp;
ump->um_cred[ULFS_GRPQUOTA] = l->l_cred;
mutex_enter(vp->v_interlock);
vp->v_vflag |= VV_SYSTEM;
vp->v_writecount++;
mutex_exit(vp->v_interlock);
VOP_UNLOCK(vp);
}
mp->mnt_flag |= MNT_QUOTA;
return 0;
}