Module Name:    src
Committed By:   dholland
Date:           Sun Jul 28 01:22:55 UTC 2013

Modified Files:
        src/sys/ufs/lfs: lfs.h lfs_vfsops.c ulfs_extern.h ulfs_quota2.c

Log Message:
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.


To generate a diff of this commit:
cvs rdiff -u -r1.159 -r1.160 src/sys/ufs/lfs/lfs.h
cvs rdiff -u -r1.310 -r1.311 src/sys/ufs/lfs/lfs_vfsops.c
cvs rdiff -u -r1.9 -r1.10 src/sys/ufs/lfs/ulfs_extern.h \
    src/sys/ufs/lfs/ulfs_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/lfs/lfs.h
diff -u src/sys/ufs/lfs/lfs.h:1.159 src/sys/ufs/lfs/lfs.h:1.160
--- src/sys/ufs/lfs/lfs.h:1.159	Sun Jul 28 01:10:49 2013
+++ src/sys/ufs/lfs/lfs.h	Sun Jul 28 01:22:55 2013
@@ -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
 };
 

Index: src/sys/ufs/lfs/lfs_vfsops.c
diff -u src/sys/ufs/lfs/lfs_vfsops.c:1.310 src/sys/ufs/lfs/lfs_vfsops.c:1.311
--- src/sys/ufs/lfs/lfs_vfsops.c:1.310	Sun Jul 28 01:10:49 2013
+++ src/sys/ufs/lfs/lfs_vfsops.c	Sun Jul 28 01:22:55 2013
@@ -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 
 	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;

Index: src/sys/ufs/lfs/ulfs_extern.h
diff -u src/sys/ufs/lfs/ulfs_extern.h:1.9 src/sys/ufs/lfs/ulfs_extern.h:1.10
--- src/sys/ufs/lfs/ulfs_extern.h:1.9	Sun Jul 28 01:10:49 2013
+++ src/sys/ufs/lfs/ulfs_extern.h	Sun Jul 28 01:22:55 2013
@@ -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);
Index: src/sys/ufs/lfs/ulfs_quota2.c
diff -u src/sys/ufs/lfs/ulfs_quota2.c:1.9 src/sys/ufs/lfs/ulfs_quota2.c:1.10
--- src/sys/ufs/lfs/ulfs_quota2.c:1.9	Sun Jul 28 01:10:49 2013
+++ src/sys/ufs/lfs/ulfs_quota2.c	Sun Jul 28 01:22:55 2013
@@ -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 dqu
 {
 	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;
+}

Reply via email to