Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/ufs/ufs Change quota1_handle_cmd_quotaon() and q1sync() ...
details: https://anonhg.NetBSD.org/src/rev/4aa320613282
branches: trunk
changeset: 794542:4aa320613282
user: hannken <hannken%NetBSD.org@localhost>
date: Mon Mar 17 09:31:35 2014 +0000
description:
Change quota1_handle_cmd_quotaon() and q1sync() to use vfs_vnode_iterator.
diffstat:
sys/ufs/ufs/ufs_quota1.c | 109 ++++++++++++++++------------------------------
1 files changed, 39 insertions(+), 70 deletions(-)
diffs (211 lines):
diff -r 3b8815f285fb -r 4aa320613282 sys/ufs/ufs/ufs_quota1.c
--- a/sys/ufs/ufs/ufs_quota1.c Mon Mar 17 09:30:32 2014 +0000
+++ b/sys/ufs/ufs/ufs_quota1.c Mon Mar 17 09:31:35 2014 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: ufs_quota1.c,v 1.18 2012/02/02 03:00:48 matt Exp $ */
+/* $NetBSD: ufs_quota1.c,v 1.19 2014/03/17 09:31:35 hannken 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.18 2012/02/02 03:00:48 matt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ufs_quota1.c,v 1.19 2014/03/17 09:31:35 hannken Exp $");
#include <sys/param.h>
#include <sys/kernel.h>
@@ -304,7 +304,8 @@
const char *fname)
{
struct mount *mp = ump->um_mountp;
- struct vnode *vp, **vpp, *mvp;
+ struct vnode *vp, **vpp;
+ struct vnode_iterator *marker;
struct dquot *dq;
int error;
struct pathbuf *pb;
@@ -366,41 +367,33 @@
ump->umq1_itime[type] = dq->dq_itime;
dqrele(NULLVP, dq);
}
- /* Allocate a marker vnode. */
- mvp = vnalloc(mp);
/*
* Search vnodes associated with this mount point,
* adding references to quota file being opened.
* NB: only need to add dquot's for inodes being modified.
*/
- mutex_enter(&mntvnode_lock);
-again:
- for (vp = TAILQ_FIRST(&mp->mnt_vnodelist); vp; vp = vunmark(mvp)) {
- vmark(mvp, vp);
- mutex_enter(vp->v_interlock);
- if (VTOI(vp) == NULL || vp->v_mount != mp || vismarker(vp) ||
- vp->v_type == VNON || vp->v_writecount == 0 ||
- (vp->v_iflag & (VI_XLOCK | VI_CLEAN)) != 0) {
- mutex_exit(vp->v_interlock);
+ vfs_vnode_iterator_init(mp, &marker);
+ while (vfs_vnode_iterator_next(marker, &vp)) {
+ error = vn_lock(vp, LK_EXCLUSIVE);
+ if (error) {
+ vrele(vp);
continue;
}
- mutex_exit(&mntvnode_lock);
- if (vget(vp, LK_EXCLUSIVE)) {
- mutex_enter(&mntvnode_lock);
- (void)vunmark(mvp);
- goto again;
+ mutex_enter(vp->v_interlock);
+ if (VTOI(vp) == NULL || vp->v_type == VNON ||
+ vp->v_writecount == 0) {
+ mutex_exit(vp->v_interlock);
+ vput(vp);
+ continue;
}
+ mutex_exit(vp->v_interlock);
if ((error = getinoquota(VTOI(vp))) != 0) {
vput(vp);
- mutex_enter(&mntvnode_lock);
- (void)vunmark(mvp);
break;
}
vput(vp);
- mutex_enter(&mntvnode_lock);
}
- mutex_exit(&mntvnode_lock);
- vnfree(mvp);
+ vfs_vnode_iterator_destroy(marker);
mutex_enter(&dqlock);
ump->umq1_qflags[type] &= ~QTF_OPENING;
@@ -421,21 +414,18 @@
{
struct mount *mp = ump->um_mountp;
struct vnode *vp;
- struct vnode *qvp, *mvp;
+ struct vnode *qvp;
+ struct vnode_iterator *marker;
struct dquot *dq;
struct inode *ip;
kauth_cred_t cred;
int i, error;
- /* Allocate a marker vnode. */
- mvp = vnalloc(mp);
-
mutex_enter(&dqlock);
while ((ump->umq1_qflags[type] & (QTF_CLOSING | QTF_OPENING)) != 0)
cv_wait(&dqcv, &dqlock);
if ((qvp = ump->um_quotas[type]) == NULLVP) {
mutex_exit(&dqlock);
- vnfree(mvp);
return (0);
}
ump->umq1_qflags[type] |= QTF_CLOSING;
@@ -445,31 +435,24 @@
* Search vnodes associated with this mount point,
* deleting any references to quota file being closed.
*/
- mutex_enter(&mntvnode_lock);
-again:
- for (vp = TAILQ_FIRST(&mp->mnt_vnodelist); vp; vp = vunmark(mvp)) {
- vmark(mvp, vp);
- mutex_enter(vp->v_interlock);
- if (VTOI(vp) == NULL || vp->v_mount != mp || vismarker(vp) ||
- vp->v_type == VNON ||
- (vp->v_iflag & (VI_XLOCK | VI_CLEAN)) != 0) {
- mutex_exit(vp->v_interlock);
+ vfs_vnode_iterator_init(mp, &marker);
+ while (vfs_vnode_iterator_next(marker, &vp)) {
+ error = vn_lock(vp, LK_EXCLUSIVE);
+ if (error) {
+ vrele(vp);
continue;
}
- mutex_exit(&mntvnode_lock);
- if (vget(vp, LK_EXCLUSIVE)) {
- mutex_enter(&mntvnode_lock);
- (void)vunmark(mvp);
- goto again;
+ ip = VTOI(vp);
+ if (ip == NULL || vp->v_type == VNON) {
+ vput(vp);
+ continue;
}
- ip = VTOI(vp);
dq = ip->i_dquot[type];
ip->i_dquot[type] = NODQUOT;
dqrele(vp, dq);
vput(vp);
- mutex_enter(&mntvnode_lock);
}
- mutex_exit(&mntvnode_lock);
+ vfs_vnode_iterator_destroy(marker);
#ifdef DIAGNOSTIC
dqflush(qvp);
#endif
@@ -759,7 +742,8 @@
q1sync(struct mount *mp)
{
struct ufsmount *ump = VFSTOUFS(mp);
- struct vnode *vp, *mvp;
+ struct vnode *vp;
+ struct vnode_iterator *marker;
struct dquot *dq;
int i, error;
@@ -773,32 +757,19 @@
if (i == MAXQUOTAS)
return (0);
- /* Allocate a marker vnode. */
- mvp = vnalloc(mp);
-
/*
* Search vnodes associated with this mount point,
* synchronizing any modified dquot structures.
*/
- mutex_enter(&mntvnode_lock);
- again:
- for (vp = TAILQ_FIRST(&mp->mnt_vnodelist); vp; vp = vunmark(mvp)) {
- vmark(mvp, vp);
- mutex_enter(vp->v_interlock);
- if (VTOI(vp) == NULL || vp->v_mount != mp || vismarker(vp) ||
- vp->v_type == VNON ||
- (vp->v_iflag & (VI_XLOCK | VI_CLEAN)) != 0) {
- mutex_exit(vp->v_interlock);
+ vfs_vnode_iterator_init(mp, &marker);
+ while (vfs_vnode_iterator_next(marker, &vp)) {
+ error = vn_lock(vp, LK_EXCLUSIVE);
+ if (error) {
+ vrele(vp);
continue;
}
- mutex_exit(&mntvnode_lock);
- error = vget(vp, LK_EXCLUSIVE | LK_NOWAIT);
- if (error) {
- mutex_enter(&mntvnode_lock);
- if (error == ENOENT) {
- (void)vunmark(mvp);
- goto again;
- }
+ if (VTOI(vp) == NULL || vp->v_type == VNON) {
+ vput(vp);
continue;
}
for (i = 0; i < MAXQUOTAS; i++) {
@@ -811,10 +782,8 @@
mutex_exit(&dq->dq_interlock);
}
vput(vp);
- mutex_enter(&mntvnode_lock);
}
- mutex_exit(&mntvnode_lock);
- vnfree(mvp);
+ vfs_vnode_iterator_destroy(marker);
return (0);
}
Home |
Main Index |
Thread Index |
Old Index