PERFORCE change 112577 for review
Matt Jacob
mjacob at FreeBSD.org
Fri Jan 5 15:09:43 PST 2007
http://perforce.freebsd.org/chv.cgi?CH=112577
Change 112577 by mjacob at mjexp_6 on 2007/01/05 23:08:55
Integrate from vendor branch.
Affected files ...
.. //depot/projects/mjexp_6/sys/contrib/pf/net/pf_ioctl.c#2 integrate
.. //depot/projects/mjexp_6/sys/dev/md/md.c#2 integrate
.. //depot/projects/mjexp_6/sys/fs/msdosfs/bpb.h#2 integrate
.. //depot/projects/mjexp_6/sys/kern/vfs_bio.c#2 integrate
.. //depot/projects/mjexp_6/sys/nfsclient/nfs_node.c#2 integrate
.. //depot/projects/mjexp_6/sys/sys/vnode.h#2 integrate
Differences ...
==== //depot/projects/mjexp_6/sys/contrib/pf/net/pf_ioctl.c#2 (text+ko) ====
@@ -1,4 +1,4 @@
-/* $FreeBSD: src/sys/contrib/pf/net/pf_ioctl.c,v 1.20.2.4 2006/09/09 00:50:25 mlaier Exp $ */
+/* $FreeBSD: src/sys/contrib/pf/net/pf_ioctl.c,v 1.20.2.5 2007/01/04 18:31:43 mlaier Exp $ */
/* $OpenBSD: pf_ioctl.c,v 1.139 2005/03/03 07:13:39 dhartmei Exp $ */
/* add: $OpenBSD: pf_ioctl.c,v 1.168 2006/07/21 01:21:17 dhartmei Exp $ */
@@ -256,6 +256,7 @@
UMA_DESTROY(pf_cache_pl);
UMA_DESTROY(pf_cent_pl);
UMA_DESTROY(pfr_ktable_pl);
+ UMA_DESTROY(pfr_kentry_pl2);
UMA_DESTROY(pfr_kentry_pl);
UMA_DESTROY(pf_state_scrub_pl);
UMA_DESTROY(pfi_addr_pl);
==== //depot/projects/mjexp_6/sys/dev/md/md.c#2 (text+ko) ====
@@ -6,7 +6,7 @@
* this stuff is worth it, you can buy me a beer in return. Poul-Henning Kamp
* ----------------------------------------------------------------------------
*
- * $FreeBSD: src/sys/dev/md/md.c,v 1.153.2.6 2006/02/14 14:46:22 luigi Exp $
+ * $FreeBSD: src/sys/dev/md/md.c,v 1.153.2.8 2007/01/05 09:51:14 kib Exp $
*
*/
@@ -67,6 +67,7 @@
#include <sys/lock.h>
#include <sys/malloc.h>
#include <sys/mdioctl.h>
+#include <sys/mount.h>
#include <sys/mutex.h>
#include <sys/sx.h>
#include <sys/namei.h>
@@ -88,7 +89,8 @@
#define MD_MODVER 1
-#define MD_SHUTDOWN 0x10000 /* Tell worker thread to terminate. */
+#define MD_SHUTDOWN 0x10000 /* Tell worker thread to terminate. */
+#define MD_EXITING 0x20000 /* Worker thread is exiting. */
#ifndef MD_NSECT
#define MD_NSECT (10000 * 2)
@@ -482,12 +484,11 @@
static int
mdstart_vnode(struct md_s *sc, struct bio *bp)
{
- int error;
+ int error, vfslocked;
struct uio auio;
struct iovec aiov;
struct mount *mp;
- mtx_assert(&Giant, MA_OWNED);
/*
* VNODE I/O
*
@@ -516,6 +517,7 @@
* When reading set IO_DIRECT to try to avoid double-caching
* the data. When writing IO_DIRECT is not optimal.
*/
+ vfslocked = VFS_LOCK_GIANT(sc->vnode->v_mount);
if (bp->bio_cmd == BIO_READ) {
vn_lock(sc->vnode, LK_EXCLUSIVE | LK_RETRY, curthread);
error = VOP_READ(sc->vnode, &auio, IO_DIRECT, sc->cred);
@@ -528,6 +530,7 @@
VOP_UNLOCK(sc->vnode, 0, curthread);
vn_finished_write(mp);
}
+ VFS_UNLOCK_GIANT(vfslocked);
bp->bio_resid = auio.uio_resid;
return (error);
}
@@ -638,35 +641,22 @@
{
struct md_s *sc;
struct bio *bp;
- int error, hasgiant;
+ int error;
sc = arg;
mtx_lock_spin(&sched_lock);
sched_prio(curthread, PRIBIO);
mtx_unlock_spin(&sched_lock);
+ if (sc->type == MD_VNODE)
+ curthread->td_pflags |= TDP_NORUNNINGBUF;
- switch (sc->type) {
- case MD_VNODE:
- mtx_lock(&Giant);
- hasgiant = 1;
- break;
- case MD_MALLOC:
- case MD_PRELOAD:
- case MD_SWAP:
- default:
- hasgiant = 0;
- break;
- }
-
for (;;) {
+ mtx_lock(&sc->queue_mtx);
if (sc->flags & MD_SHUTDOWN) {
- sc->procp = NULL;
- wakeup(&sc->procp);
- if (hasgiant)
- mtx_unlock(&Giant);
+ sc->flags |= MD_EXITING;
+ mtx_unlock(&sc->queue_mtx);
kthread_exit(0);
}
- mtx_lock(&sc->queue_mtx);
bp = bioq_takefirst(&sc->bio_queue);
if (!bp) {
msleep(sc, &sc->queue_mtx, PRIBIO | PDROP, "mdwait", 0);
@@ -864,7 +854,7 @@
{
struct vattr vattr;
struct nameidata nd;
- int error, flags;
+ int error, flags, vfslocked;
error = copyinstr(mdio->md_file, sc->file, sizeof(sc->file), NULL);
if (error != 0)
@@ -881,12 +871,15 @@
if (error != 0)
return (error);
NDFREE(&nd, NDF_ONLY_PNBUF);
+ vfslocked = VFS_LOCK_GIANT(nd.ni_vp->v_mount);
if (nd.ni_vp->v_type != VREG ||
(error = VOP_GETATTR(nd.ni_vp, &vattr, td->td_ucred, td))) {
VOP_UNLOCK(nd.ni_vp, 0, td);
(void)vn_close(nd.ni_vp, flags, td->td_ucred, td);
+ VFS_UNLOCK_GIANT(vfslocked);
return (error ? error : EINVAL);
}
+ nd.ni_vp->v_vflag |= VV_MD;
VOP_UNLOCK(nd.ni_vp, 0, td);
if (mdio->md_fwsectors != 0)
@@ -900,16 +893,21 @@
error = mdsetcred(sc, td->td_ucred);
if (error != 0) {
+ vn_lock(nd.ni_vp, LK_EXCLUSIVE | LK_RETRY, td);
+ nd.ni_vp->v_vflag &= ~VV_MD;
+ VOP_UNLOCK(nd.ni_vp, 0, td);
(void)vn_close(nd.ni_vp, flags, td->td_ucred, td);
+ VFS_UNLOCK_GIANT(vfslocked);
return (error);
}
+ VFS_UNLOCK_GIANT(vfslocked);
return (0);
}
static int
mddestroy(struct md_s *sc, struct thread *td)
{
-
+ int vfslocked;
if (sc->gp) {
sc->gp->softc = NULL;
@@ -919,16 +917,21 @@
sc->gp = NULL;
sc->pp = NULL;
}
+ mtx_lock(&sc->queue_mtx);
sc->flags |= MD_SHUTDOWN;
wakeup(sc);
- while (sc->procp != NULL)
- tsleep(&sc->procp, PRIBIO, "mddestroy", hz / 10);
+ while (!(sc->flags & MD_EXITING))
+ msleep(sc->procp, &sc->queue_mtx, PRIBIO, "mddestroy", hz / 10);
+ mtx_unlock(&sc->queue_mtx);
mtx_destroy(&sc->queue_mtx);
if (sc->vnode != NULL) {
- mtx_lock(&Giant);
+ vfslocked = VFS_LOCK_GIANT(sc->vnode->v_mount);
+ vn_lock(sc->vnode, LK_EXCLUSIVE | LK_RETRY, td);
+ sc->vnode->v_vflag &= ~VV_MD;
+ VOP_UNLOCK(sc->vnode, 0, td);
(void)vn_close(sc->vnode, sc->flags & MD_READONLY ?
FREAD : (FREAD|FWRITE), sc->cred, td);
- mtx_unlock(&Giant);
+ VFS_UNLOCK_GIANT(vfslocked);
}
if (sc->cred != NULL)
crfree(sc->cred);
==== //depot/projects/mjexp_6/sys/fs/msdosfs/bpb.h#2 (text+ko) ====
@@ -1,4 +1,4 @@
-/* $FreeBSD: src/sys/fs/msdosfs/bpb.h,v 1.11 2005/01/06 18:10:38 imp Exp $ */
+/* $FreeBSD: src/sys/fs/msdosfs/bpb.h,v 1.11.2.1 2007/01/05 05:50:36 rodrigc Exp $ */
/* $NetBSD: bpb.h,v 1.7 1997/11/17 15:36:24 ws Exp $ */
/*-
@@ -86,35 +86,14 @@
* and longs are just character arrays of the appropriate length. This is
* because the compiler forces shorts and longs to align on word or
* halfword boundaries.
- *
- * XXX The little-endian code here assumes that the processor can access
- * 16-bit and 32-bit quantities on byte boundaries. If this is not true,
- * use the macros for the big-endian case.
*/
-#include <machine/endian.h>
+#include <sys/endian.h>
-#ifdef __i386__
-#define UNLALIGNED_ACCESS
-#endif
-
-#if (BYTE_ORDER == LITTLE_ENDIAN) && defined(UNALIGNED_ACCESS)
-#define getushort(x) *((u_int16_t *)(x))
-#define getulong(x) *((u_int32_t *)(x))
-#define putushort(p, v) (*((u_int16_t *)(p)) = (v))
-#define putulong(p, v) (*((u_int32_t *)(p)) = (v))
-#else
-#define getushort(x) (((u_int8_t *)(x))[0] + (((u_int8_t *)(x))[1] << 8))
-#define getulong(x) (((u_int8_t *)(x))[0] + (((u_int8_t *)(x))[1] << 8) \
- + (((u_int8_t *)(x))[2] << 16) \
- + (((u_int8_t *)(x))[3] << 24))
-#define putushort(p, v) (((u_int8_t *)(p))[0] = (v), \
- ((u_int8_t *)(p))[1] = (v) >> 8)
-#define putulong(p, v) (((u_int8_t *)(p))[0] = (v), \
- ((u_int8_t *)(p))[1] = (v) >> 8, \
- ((u_int8_t *)(p))[2] = (v) >> 16,\
- ((u_int8_t *)(p))[3] = (v) >> 24)
-#endif
+#define getushort(x) le16dec(x)
+#define getulong(x) le32dec(x)
+#define putushort(p, v) le16enc(p, v)
+#define putulong(p, v) le32enc(p, v)
/*
* BIOS Parameter Block (BPB) for DOS 3.3
==== //depot/projects/mjexp_6/sys/kern/vfs_bio.c#2 (text+ko) ====
@@ -39,7 +39,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/kern/vfs_bio.c,v 1.491.2.9 2006/10/13 07:05:46 pjd Exp $");
+__FBSDID("$FreeBSD: src/sys/kern/vfs_bio.c,v 1.491.2.10 2007/01/05 09:51:14 kib Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -796,6 +796,8 @@
bufwrite(struct buf *bp)
{
int oldflags;
+ struct vnode *vp;
+ int vp_md;
CTR3(KTR_BUF, "bufwrite(%p) vp %p flags %X", bp, bp->b_vp, bp->b_flags);
if (bp->b_flags & B_INVAL) {
@@ -810,6 +812,12 @@
KASSERT(!(bp->b_vflags & BV_BKGRDINPROG),
("FFS background buffer should not get here %p", bp));
+ vp = bp->b_vp;
+ if (vp)
+ vp_md = vp->v_vflag & VV_MD;
+ else
+ vp_md = 0;
+
/* Mark the buffer clean */
bundirty(bp);
@@ -847,7 +855,7 @@
* or syncer daemon trying to clean up as that can lead
* to deadlock.
*/
- if ((curthread->td_pflags & TDP_NORUNNINGBUF) == 0)
+ if ((curthread->td_pflags & TDP_NORUNNINGBUF) == 0 && !vp_md)
waitrunningbufspace();
}
==== //depot/projects/mjexp_6/sys/nfsclient/nfs_node.c#2 (text+ko) ====
@@ -33,7 +33,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/nfsclient/nfs_node.c,v 1.76.2.3 2006/09/13 19:25:44 mohans Exp $");
+__FBSDID("$FreeBSD: src/sys/nfsclient/nfs_node.c,v 1.76.2.4 2007/01/03 20:19:02 mohans Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -163,23 +163,22 @@
*/
vp->v_vnlock->lk_flags |= LK_CANRECURSE;
vp->v_vnlock->lk_flags &= ~LK_NOSHARE;
+ if (fhsize > NFS_SMALLFH) {
+ MALLOC(np->n_fhp, nfsfh_t *, fhsize, M_NFSBIGFH, M_WAITOK);
+ } else
+ np->n_fhp = &np->n_fh;
+ bcopy((caddr_t)fhp, (caddr_t)np->n_fhp, fhsize);
+ np->n_fhsize = fhsize;
+ lockinit(&np->n_rslock, PVFS | rsflags, "nfrslk", 0, 0);
error = vfs_hash_insert(vp, hash, LK_EXCLUSIVE,
td, &nvp, nfs_vncmpf, &ncmp);
if (error)
return (error);
if (nvp != NULL) {
*npp = VTONFS(nvp);
- /* vrele() the duplicate allocated here, to get it recycled */
- vrele(vp);
+ /* vfs_hash_insert() vput()'s the losing vnode */
return (0);
}
- if (fhsize > NFS_SMALLFH) {
- MALLOC(np->n_fhp, nfsfh_t *, fhsize, M_NFSBIGFH, M_WAITOK);
- } else
- np->n_fhp = &np->n_fh;
- bcopy((caddr_t)fhp, (caddr_t)np->n_fhp, fhsize);
- np->n_fhsize = fhsize;
- lockinit(&np->n_rslock, PVFS | rsflags, "nfrslk", 0, 0);
*npp = np;
return (0);
==== //depot/projects/mjexp_6/sys/sys/vnode.h#2 (text+ko) ====
@@ -27,7 +27,7 @@
* SUCH DAMAGE.
*
* @(#)vnode.h 8.7 (Berkeley) 2/4/94
- * $FreeBSD: src/sys/sys/vnode.h,v 1.304.2.7 2006/03/13 03:07:27 jeff Exp $
+ * $FreeBSD: src/sys/sys/vnode.h,v 1.304.2.8 2007/01/05 09:51:14 kib Exp $
*/
#ifndef _SYS_VNODE_H_
@@ -253,6 +253,7 @@
#define VV_SYSTEM 0x0080 /* vnode being used by kernel */
#define VV_PROCDEP 0x0100 /* vnode is process dependent */
#define VV_NOKNOTE 0x0200 /* don't activate knotes on this vnode */
+#define VV_MD 0x0800 /* vnode backs the md device */
/*
* Vnode attributes. A field value of VNOVAL represents a field whose value
More information about the p4-projects
mailing list