Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/ufs/lfs Make lfs_fastvget() private to lfs_syscalls.c, c...
details: https://anonhg.NetBSD.org/src/rev/ec3fbfa58db4
branches: trunk
changeset: 808743:ec3fbfa58db4
user: hannken <hannken%NetBSD.org@localhost>
date: Sun May 31 15:45:18 2015 +0000
description:
Make lfs_fastvget() private to lfs_syscalls.c, change it to take the
BLOCK_INFO and vnode lock type instead of the inode disk address and
return the vnode locked.
Change lfs_markv() and lfs_bmapv() to work on locked vnodes.
diffstat:
sys/ufs/lfs/lfs_extern.h | 3 +-
sys/ufs/lfs/lfs_syscalls.c | 198 ++++++++++++++++++--------------------------
2 files changed, 81 insertions(+), 120 deletions(-)
diffs (truncated from 391 to 300 lines):
diff -r 705096c44d2e -r ec3fbfa58db4 sys/ufs/lfs/lfs_extern.h
--- a/sys/ufs/lfs/lfs_extern.h Sun May 31 15:44:30 2015 +0000
+++ b/sys/ufs/lfs/lfs_extern.h Sun May 31 15:45:18 2015 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: lfs_extern.h,v 1.103 2015/05/31 15:44:31 hannken Exp $ */
+/* $NetBSD: lfs_extern.h,v 1.104 2015/05/31 15:45:18 hannken Exp $ */
/*-
* Copyright (c) 1999, 2000, 2001, 2002, 2003 The NetBSD Foundation, Inc.
@@ -215,7 +215,6 @@
void lfs_wakeup_cleaner(struct lfs *);
/* lfs_syscalls.c */
-int lfs_fastvget(struct mount *, ino_t, daddr_t, struct vnode **, struct ulfs1_dinode *);
struct buf *lfs_fakebuf(struct lfs *, struct vnode *, int, size_t, void *);
int lfs_do_segclean(struct lfs *, unsigned long);
int lfs_segwait(fsid_t *, struct timeval *);
diff -r 705096c44d2e -r ec3fbfa58db4 sys/ufs/lfs/lfs_syscalls.c
--- a/sys/ufs/lfs/lfs_syscalls.c Sun May 31 15:44:30 2015 +0000
+++ b/sys/ufs/lfs/lfs_syscalls.c Sun May 31 15:45:18 2015 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: lfs_syscalls.c,v 1.158 2015/05/31 15:44:31 hannken Exp $ */
+/* $NetBSD: lfs_syscalls.c,v 1.159 2015/05/31 15:45:18 hannken Exp $ */
/*-
* Copyright (c) 1999, 2000, 2001, 2002, 2003, 2007, 2007, 2008
@@ -61,7 +61,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: lfs_syscalls.c,v 1.158 2015/05/31 15:44:31 hannken Exp $");
+__KERNEL_RCSID(0, "$NetBSD: lfs_syscalls.c,v 1.159 2015/05/31 15:45:18 hannken Exp $");
#ifndef LFS
# define LFS /* for prototypes in syscallargs.h */
@@ -87,6 +87,7 @@
struct buf *lfs_fakebuf(struct lfs *, struct vnode *, int, size_t, void *);
int lfs_fasthashget(dev_t, ino_t, struct vnode **);
+int lfs_fastvget(struct mount *, ino_t, BLOCK_INFO *, int, struct vnode **);
pid_t lfs_cleaner_pid = 0;
@@ -230,9 +231,10 @@
struct inode *ip = NULL;
struct lfs *fs;
struct mount *mntp;
- struct vnode *vp = NULL;
+ struct ulfsmount *ump;
+ struct vnode *vp;
ino_t lastino;
- daddr_t b_daddr, v_daddr;
+ daddr_t b_daddr;
int cnt, error;
int do_again = 0;
int numrefed = 0;
@@ -245,7 +247,8 @@
if ((mntp = vfs_getvfs(fsidp)) == NULL)
return (ENOENT);
- fs = VFSTOULFS(mntp)->um_lfs;
+ ump = VFSTOULFS(mntp);
+ fs = ump->um_lfs;
if (fs->lfs_ronly)
return EROFS;
@@ -273,7 +276,7 @@
error = 0;
/* these were inside the initialization for the for loop */
- v_daddr = LFS_UNUSED_DADDR;
+ vp = NULL;
lastino = LFS_UNUSED_INUM;
nblkwritten = ninowritten = 0;
for (blkp = blkiov; cnt--; ++blkp)
@@ -289,11 +292,12 @@
*/
if (lastino != blkp->bi_inode) {
/*
- * Finish the old file, if there was one. The presence
- * of a usable vnode in vp is signaled by a valid v_daddr.
+ * Finish the old file, if there was one.
*/
- if (v_daddr != LFS_UNUSED_DADDR) {
+ if (vp != NULL) {
+ VOP_UNLOCK(vp);
lfs_vunref(vp);
+ vp = NULL;
numrefed--;
}
@@ -301,27 +305,10 @@
* Start a new file
*/
lastino = blkp->bi_inode;
- if (blkp->bi_inode == LFS_IFILE_INUM)
- v_daddr = fs->lfs_idaddr;
- else {
- LFS_IENTRY(ifp, fs, blkp->bi_inode, bp);
- /* XXX fix for force write */
- v_daddr = ifp->if_daddr;
- brelse(bp, 0);
- }
- if (v_daddr == LFS_UNUSED_DADDR)
- continue;
/* Get the vnode/inode. */
- error = lfs_fastvget(mntp, blkp->bi_inode, v_daddr,
- &vp,
- (blkp->bi_lbn == LFS_UNUSED_LBN
- ? blkp->bi_bp
- : NULL));
-
- if (!error) {
- numrefed++;
- }
+ error = lfs_fastvget(mntp, blkp->bi_inode, blkp,
+ LK_EXCLUSIVE | LK_NOWAIT, &vp);
if (error) {
DLOG((DLOG_CLEAN, "lfs_markv: lfs_fastvget"
" failed with %d (ino %d, segment %d)\n",
@@ -335,28 +322,22 @@
* again with another. (When the
* cleaner runs again, this segment will
* sort high on the list, since it is
- * now almost entirely empty.) But, we
- * still set v_daddr = LFS_UNUSED_ADDR
- * so as not to test this over and over
- * again.
+ * now almost entirely empty.)
*/
if (error == EAGAIN) {
error = 0;
do_again++;
- }
-#ifdef DIAGNOSTIC
- else if (error != ENOENT)
- panic("lfs_markv VFS_VGET FAILED");
-#endif
- /* lastino = LFS_UNUSED_INUM; */
- v_daddr = LFS_UNUSED_DADDR;
- vp = NULL;
+ } else
+ KASSERT(error == ENOENT);
+ KASSERT(vp == NULL);
ip = NULL;
continue;
}
+
ip = VTOI(vp);
+ numrefed++;
ninowritten++;
- } else if (v_daddr == LFS_UNUSED_DADDR) {
+ } else if (vp == NULL) {
/*
* This can only happen if the vnode is dead (or
* in any case we can't get it...e.g., it is
@@ -484,8 +465,10 @@
/*
* Finish the old file, if there was one
*/
- if (v_daddr != LFS_UNUSED_DADDR) {
+ if (vp != NULL) {
+ VOP_UNLOCK(vp);
lfs_vunref(vp);
+ vp = NULL;
numrefed--;
}
@@ -528,8 +511,10 @@
* XXX should do segwrite here anyway?
*/
- if (v_daddr != LFS_UNUSED_DADDR) {
+ if (vp != NULL) {
+ VOP_UNLOCK(vp);
lfs_vunref(vp);
+ vp = NULL;
--numrefed;
}
@@ -673,19 +658,15 @@
struct inode *ip = NULL;
struct lfs *fs;
struct mount *mntp;
- struct ulfsmount *ump;
struct vnode *vp;
ino_t lastino;
daddr_t v_daddr;
int cnt, error;
int numrefed = 0;
- lfs_cleaner_pid = p->p_pid;
-
if ((mntp = vfs_getvfs(fsidp)) == NULL)
return (ENOENT);
- ump = VFSTOULFS(mntp);
if ((error = vfs_busy(mntp, NULL)) != 0)
return (error);
@@ -696,6 +677,7 @@
error = 0;
/* these were inside the initialization for the for loop */
+ vp = NULL;
v_daddr = LFS_UNUSED_DADDR;
lastino = LFS_UNUSED_INUM;
for (blkp = blkiov; cnt--; ++blkp)
@@ -706,20 +688,12 @@
*/
if (lastino != blkp->bi_inode) {
/*
- * Finish the old file, if there was one. The presence
- * of a usable vnode in vp is signaled by a valid
- * v_daddr.
+ * Finish the old file, if there was one.
*/
- if (v_daddr != LFS_UNUSED_DADDR) {
+ if (vp != NULL) {
+ VOP_UNLOCK(vp);
lfs_vunref(vp);
- if (VTOI(vp)->i_lfs_iflags & LFSI_BMAP) {
- mutex_enter(vp->v_interlock);
- if (vget(vp, LK_NOWAIT,
- false /* !wait */) == 0) {
- if (! vrecycle(vp))
- vrele(vp);
- }
- }
+ vp = NULL;
numrefed--;
}
@@ -738,50 +712,20 @@
blkp->bi_daddr = LFS_UNUSED_DADDR;
continue;
}
- /*
- * A regular call to VFS_VGET could deadlock
- * here. Instead, we try an unlocked access.
- */
- mutex_enter(&ulfs_ihash_lock);
- vp = ulfs_ihashlookup(ump->um_dev, blkp->bi_inode);
- if (vp != NULL)
- mutex_enter(vp->v_interlock);
- if (vp != NULL && vdead_check(vp, VDEAD_NOWAIT) == 0) {
- ip = VTOI(vp);
- mutex_exit(&ulfs_ihash_lock);
- if (lfs_vref(vp)) {
- v_daddr = LFS_UNUSED_DADDR;
- continue;
- }
- numrefed++;
+ error = lfs_fastvget(mntp, blkp->bi_inode, NULL,
+ LK_SHARED, &vp);
+ if (error) {
+ DLOG((DLOG_CLEAN, "lfs_bmapv: lfs_fastvget ino"
+ "%d failed with %d",
+ blkp->bi_inode,error));
+ KASSERT(vp == NULL);
+ continue;
} else {
- if (vp != NULL)
- mutex_exit(vp->v_interlock);
- mutex_exit(&ulfs_ihash_lock);
- /*
- * Don't VFS_VGET if we're being unmounted,
- * since we hold vfs_busy().
- */
- if (mntp->mnt_iflag & IMNT_UNMOUNT) {
- v_daddr = LFS_UNUSED_DADDR;
- continue;
- }
- error = VFS_VGET(mntp, blkp->bi_inode, &vp);
- if (error) {
- DLOG((DLOG_CLEAN, "lfs_bmapv: vget ino"
- "%d failed with %d",
- blkp->bi_inode,error));
- v_daddr = LFS_UNUSED_DADDR;
- continue;
- } else {
- KASSERT(VOP_ISLOCKED(vp));
- VTOI(vp)->i_lfs_iflags |= LFSI_BMAP;
- VOP_UNLOCK(vp);
- numrefed++;
- }
+ KASSERT(VOP_ISLOCKED(vp));
+ numrefed++;
}
ip = VTOI(vp);
- } else if (v_daddr == LFS_UNUSED_DADDR) {
+ } else if (vp == NULL) {
/*
* This can only happen if the vnode is dead.
* Keep going. Note that we DO NOT set the
@@ -792,7 +736,6 @@
* lfs_markv will throw them out if we are
* wrong.
*/
Home |
Main Index |
Thread Index |
Old Index