Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 30 Oct 2004 07:38:30 GMT
From:      Marcel Moolenaar <marcel@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 63974 for review
Message-ID:  <200410300738.i9U7cUCe031967@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=63974

Change 63974 by marcel@marcel_nfs on 2004/10/30 07:38:14

	IFC @63972

Affected files ...

.. //depot/projects/uart/amd64/amd64/machdep.c#9 integrate
.. //depot/projects/uart/conf/files#31 integrate
.. //depot/projects/uart/dev/dcons/dcons_os.c#2 integrate
.. //depot/projects/uart/dev/fdc/fdc.c#2 integrate
.. //depot/projects/uart/dev/mcd/mcd.c#5 integrate
.. //depot/projects/uart/dev/scd/scd.c#5 integrate
.. //depot/projects/uart/dev/usb/uhci.c#7 integrate
.. //depot/projects/uart/fs/devfs/devfs_vfsops.c#3 integrate
.. //depot/projects/uart/fs/devfs/devfs_vnops.c#3 integrate
.. //depot/projects/uart/fs/hpfs/hpfs.h#3 integrate
.. //depot/projects/uart/fs/hpfs/hpfs_vfsops.c#4 integrate
.. //depot/projects/uart/fs/hpfs/hpfs_vnops.c#4 integrate
.. //depot/projects/uart/fs/msdosfs/msdosfs_denode.c#4 integrate
.. //depot/projects/uart/fs/msdosfs/msdosfs_vfsops.c#7 integrate
.. //depot/projects/uart/fs/msdosfs/msdosfs_vnops.c#7 integrate
.. //depot/projects/uart/fs/msdosfs/msdosfsmount.h#5 integrate
.. //depot/projects/uart/fs/ntfs/ntfs_vfsops.c#6 integrate
.. //depot/projects/uart/fs/udf/udf.h#3 integrate
.. //depot/projects/uart/fs/udf/udf_vfsops.c#5 integrate
.. //depot/projects/uart/fs/udf/udf_vnops.c#4 integrate
.. //depot/projects/uart/geom/geom.h#6 integrate
.. //depot/projects/uart/geom/geom_dev.c#9 integrate
.. //depot/projects/uart/geom/geom_subr.c#5 integrate
.. //depot/projects/uart/geom/geom_vfs.c#1 branch
.. //depot/projects/uart/geom/geom_vfs.h#1 branch
.. //depot/projects/uart/gnu/ext2fs/ext2_bmap.c#4 integrate
.. //depot/projects/uart/gnu/ext2fs/ext2_mount.h#3 integrate
.. //depot/projects/uart/gnu/ext2fs/ext2_vfsops.c#6 integrate
.. //depot/projects/uart/gnu/ext2fs/ext2_vnops.c#4 integrate
.. //depot/projects/uart/i386/i386/pmap.c#23 integrate
.. //depot/projects/uart/isofs/cd9660/cd9660_bmap.c#3 integrate
.. //depot/projects/uart/isofs/cd9660/cd9660_node.c#4 integrate
.. //depot/projects/uart/isofs/cd9660/cd9660_node.h#3 integrate
.. //depot/projects/uart/isofs/cd9660/cd9660_vfsops.c#6 integrate
.. //depot/projects/uart/isofs/cd9660/cd9660_vnops.c#5 integrate
.. //depot/projects/uart/isofs/cd9660/iso.h#4 integrate
.. //depot/projects/uart/kern/kern_physio.c#5 integrate
.. //depot/projects/uart/kern/kern_sig.c#13 integrate
.. //depot/projects/uart/kern/vfs_aio.c#4 integrate
.. //depot/projects/uart/kern/vfs_bio.c#10 integrate
.. //depot/projects/uart/kern/vfs_cluster.c#6 integrate
.. //depot/projects/uart/kern/vfs_default.c#4 integrate
.. //depot/projects/uart/kern/vfs_subr.c#7 integrate
.. //depot/projects/uart/kern/vnode_if.src#5 integrate
.. //depot/projects/uart/netgraph/ng_device.c#3 integrate
.. //depot/projects/uart/netgraph/ng_pppoe.c#3 integrate
.. //depot/projects/uart/netinet6/ipsec.c#5 integrate
.. //depot/projects/uart/pc98/pc98/wd_cd.c#4 integrate
.. //depot/projects/uart/sys/bufobj.h#2 integrate
.. //depot/projects/uart/sys/conf.h#6 integrate
.. //depot/projects/uart/sys/mount.h#4 integrate
.. //depot/projects/uart/ufs/ffs/ffs_alloc.c#3 integrate
.. //depot/projects/uart/ufs/ffs/ffs_extern.h#3 integrate
.. //depot/projects/uart/ufs/ffs/ffs_rawread.c#4 integrate
.. //depot/projects/uart/ufs/ffs/ffs_snapshot.c#4 integrate
.. //depot/projects/uart/ufs/ffs/ffs_softdep.c#7 integrate
.. //depot/projects/uart/ufs/ffs/ffs_vfsops.c#6 integrate
.. //depot/projects/uart/ufs/ffs/ffs_vnops.c#6 integrate
.. //depot/projects/uart/ufs/ufs/inode.h#4 integrate
.. //depot/projects/uart/ufs/ufs/ufs_vnops.c#7 integrate
.. //depot/projects/uart/ufs/ufs/ufsmount.h#3 integrate
.. //depot/projects/uart/vm/vm_page.c#10 integrate
.. //depot/projects/uart/vm/vm_pageout.c#11 integrate

Differences ...

==== //depot/projects/uart/amd64/amd64/machdep.c#9 (text+ko) ====

@@ -39,7 +39,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/amd64/amd64/machdep.c,v 1.621 2004/09/24 01:11:11 peter Exp $");
+__FBSDID("$FreeBSD: src/sys/amd64/amd64/machdep.c,v 1.622 2004/10/28 12:16:03 simokawa Exp $");
 
 #include "opt_atalk.h"
 #include "opt_atpic.h"
@@ -823,6 +823,7 @@
 	char *cp;
 	struct bios_smap *smapbase, *smap, *smapend;
 	u_int32_t smapsize;
+	quad_t dcons_addr, dcons_size;
 
 	bzero(physmap, sizeof(physmap));
 	basemem = 0;
@@ -968,6 +969,13 @@
 	pte = CMAP1;
 
 	/*
+	 * Get dcons buffer address
+	 */
+	if (getenv_quad("dcons.addr", &dcons_addr) == 0 ||
+	    getenv_quad("dcons.size", &dcons_size) == 0)
+		dcons_addr = 0;
+
+	/*
 	 * physmap is in bytes, so when converting to page boundaries,
 	 * round up the start address and round down the end address.
 	 */
@@ -987,6 +995,14 @@
 			if (pa >= 0x100000 && pa < first)
 				continue;
 
+ 			/*
+ 			 * block out dcons buffer
+ 			 */
+ 			if (dcons_addr > 0
+ 			    && pa >= trunc_page(dcons_addr)
+ 			    && pa < dcons_addr + dcons_size)
+ 				continue;
+
 			page_bad = FALSE;
 
 			/*

==== //depot/projects/uart/conf/files#31 (text+ko) ====

@@ -1,4 +1,4 @@
-# $FreeBSD: src/sys/conf/files,v 1.959 2004/10/24 08:26:48 ru Exp $
+# $FreeBSD: src/sys/conf/files,v 1.960 2004/10/29 09:56:56 phk Exp $
 #
 # The long compile-with and dependency lines are required because of
 # limitations in config: backslash-newline doesn't work in strings, and
@@ -973,6 +973,7 @@
 geom/geom_subr.c	standard
 geom/geom_sunlabel.c	optional geom_sunlabel
 geom/geom_sunlabel_enc.c	optional geom_sunlabel
+geom/geom_vfs.c			standard
 geom/geom_vol_ffs.c	optional geom_vol
 gnu/ext2fs/ext2_alloc.c		optional ext2fs \
 	warning "kernel contains GPL contaminated ext2fs filesystem"

==== //depot/projects/uart/dev/dcons/dcons_os.c#2 (text+ko) ====

@@ -31,7 +31,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  * 
- * $FreeBSD: src/sys/dev/dcons/dcons_os.c,v 1.4 2004/10/24 12:41:04 simokawa Exp $
+ * $FreeBSD: src/sys/dev/dcons/dcons_os.c,v 1.5 2004/10/28 12:18:22 simokawa Exp $
  */
 
 #include <sys/param.h>
@@ -488,7 +488,7 @@
 static int
 dcons_drv_init(int stage)
 {
-#ifdef __i386__
+#if defined(__i386__) || defined(__amd64__)
 	quad_t addr, size;
 #endif
 
@@ -503,9 +503,10 @@
 	dg.buf = NULL;
 	dg.size = DCONS_BUF_SIZE;
 
-#ifdef __i386__
+#if defined(__i386__) || defined(__amd64__)
 	if (getenv_quad("dcons.addr", &addr) > 0 &&
 	    getenv_quad("dcons.size", &size) > 0) {
+#ifdef __i386__
 		vm_paddr_t pa;
 		/*
 		 * Allow read/write access to dcons buffer.
@@ -513,6 +514,7 @@
 		for (pa = trunc_page(addr); pa < addr + size; pa += PAGE_SIZE)
 			*vtopte(KERNBASE + pa) |= PG_RW;
 		invltlb();
+#endif
 		/* XXX P to V */
 		dg.buf = (struct dcons_buf *)(vm_offset_t)(KERNBASE + addr);
 		dg.size = size;

==== //depot/projects/uart/dev/fdc/fdc.c#2 (text+ko) ====

@@ -51,7 +51,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/fdc/fdc.c,v 1.299 2004/10/22 19:01:10 phk Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/fdc/fdc.c,v 1.300 2004/10/29 11:05:45 phk Exp $");
 
 #include "opt_fdc.h"
 
@@ -1371,10 +1371,8 @@
 		device_busy(fd->dev);
 	}
 
-#ifdef notyet
 	if (w > 0 && (fd->flags & FD_WP))
 		return (EROFS);
-#endif
 
 	pp->sectorsize = fd->sectorsize;
 	pp->stripesize = fd->ft->heads * fd->ft->sectrac * fd->sectorsize;

==== //depot/projects/uart/dev/mcd/mcd.c#5 (text+ko) ====

@@ -43,7 +43,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/mcd/mcd.c,v 1.142 2004/06/16 09:46:49 phk Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/mcd/mcd.c,v 1.143 2004/10/29 11:09:21 phk Exp $");
 static const char COPYRIGHT[] = "mcd-driver (C)1993 by H.Veit & B.Moore";
 
 #include <sys/param.h>
@@ -257,8 +257,6 @@
 		return (ENXIO);
 	}
 
-	dev->si_bsize_phys = sc->data.blksize;
-
 	sc->data.openflags = 1;
 	sc->data.partflags |= MCDREADRAW;
 	sc->data.flags |= MCDVALID;
@@ -347,11 +345,10 @@
 		return;
 	}
 
-	bp = bioq_first(&sc->data.head);
+	bp = bioq_takefirst(&sc->data.head);
 	if (bp != 0) {
 		/* block found to process, dequeue */
 		/*MCD_TRACE("mcd_start: found block bp=0x%x\n",bp,0,0,0);*/
-		bioq_remove(&sc->data.head, bp);
 		sc->data.flags |= MCDMBXBSY;
 		splx(s);
 	} else {

==== //depot/projects/uart/dev/scd/scd.c#5 (text+ko) ====

@@ -41,7 +41,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/scd/scd.c,v 1.82 2004/07/28 06:20:57 kan Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/scd/scd.c,v 1.83 2004/10/29 11:09:50 phk Exp $");
 
 
 #undef	SCD_DEBUG
@@ -216,8 +216,6 @@
 		}
 	}
 
-	dev->si_bsize_phys = sc->data.blksize;
-
 	sc->data.openflag = 1;
 	sc->data.flags |= SCDVALID;
 
@@ -306,10 +304,9 @@
 		return;
 	}
 
-	bp = bioq_first(&sc->data.head);
+	bp = bioq_takefirst(&sc->data.head);
 	if (bp != 0) {
 		/* block found to process, dequeue */
-		bioq_remove(&sc->data.head, bp);
 		sc->data.flags |= SCDMBXBSY;
 		splx(s);
 	} else {

==== //depot/projects/uart/dev/usb/uhci.c#7 (text+ko) ====

@@ -11,7 +11,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/usb/uhci.c,v 1.155 2004/10/03 16:12:29 stefanf Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/usb/uhci.c,v 1.156 2004/10/28 20:24:50 jhb Exp $");
 
 
 /*
@@ -1552,7 +1552,7 @@
 	for (; timo >= 0; timo--) {
 		usb_delay_ms(&sc->sc_bus, 1);
 		DPRINTFN(20,("uhci_waitintr: 0x%04x\n", UREAD2(sc, UHCI_STS)));
-		if (UREAD2(sc, UHCI_STS) & UHCI_STS_USBINT)
+		if (UREAD2(sc, UHCI_STS) & UHCI_STS_ALLINTRS)
 			uhci_intr1(sc);
 		if (xfer->status != USBD_IN_PROGRESS)
 			return;
@@ -1576,7 +1576,7 @@
 {
 	uhci_softc_t *sc = (uhci_softc_t *)bus;
 
-	if (UREAD2(sc, UHCI_STS) & UHCI_STS_USBINT)
+	if (UREAD2(sc, UHCI_STS) & UHCI_STS_ALLINTRS)
 		uhci_intr1(sc);
 }
 

==== //depot/projects/uart/fs/devfs/devfs_vfsops.c#3 (text+ko) ====

@@ -31,7 +31,7 @@
  *	@(#)kernfs_vfsops.c	8.10 (Berkeley) 5/14/95
  * From: FreeBSD: src/sys/miscfs/kernfs/kernfs_vfsops.c 1.36
  *
- * $FreeBSD: src/sys/fs/devfs/devfs_vfsops.c,v 1.33 2004/07/30 22:08:49 phk Exp $
+ * $FreeBSD: src/sys/fs/devfs/devfs_vfsops.c,v 1.34 2004/10/28 06:03:25 phk Exp $
  */
 
 #include "opt_devfs.h"
@@ -67,10 +67,8 @@
 	struct vnode *rvp;
 
 	error = 0;
-	/*
-	 * XXX: flag changes.
-	 */
-	if (mp->mnt_flag & MNT_UPDATE)
+
+	if (mp->mnt_flag & (MNT_UPDATE | MNT_NODEV))
 		return (EOPNOTSUPP);
 
 	MALLOC(fmp, struct devfs_mount *, sizeof(struct devfs_mount),

==== //depot/projects/uart/fs/devfs/devfs_vnops.c#3 (text+ko) ====

@@ -31,7 +31,7 @@
  *	@(#)kernfs_vnops.c	8.15 (Berkeley) 5/21/95
  * From: FreeBSD: src/sys/miscfs/kernfs/kernfs_vnops.c 1.43
  *
- * $FreeBSD: src/sys/fs/devfs/devfs_vnops.c,v 1.75 2004/10/26 07:39:11 phk Exp $
+ * $FreeBSD: src/sys/fs/devfs/devfs_vnops.c,v 1.79 2004/10/29 11:10:55 phk Exp $
  */
 
 /*
@@ -46,8 +46,6 @@
 
 #include <sys/param.h>
 #include <sys/systm.h>
-#include <sys/bio.h>
-#include <sys/buf.h>
 #include <sys/conf.h>
 #include <sys/dirent.h>
 #include <sys/fcntl.h>
@@ -60,7 +58,6 @@
 #include <sys/proc.h>
 #include <sys/stat.h>
 #include <sys/sx.h>
-#include <sys/sysctl.h>
 #include <sys/time.h>
 #include <sys/unistd.h>
 #include <sys/vnode.h>
@@ -92,7 +89,6 @@
 #ifdef MAC
 static int	devfs_setlabel(struct vop_setlabel_args *ap);
 #endif
-static int	devfs_specstrategy(struct vop_specstrategy_args *);
 static int	devfs_symlink(struct vop_symlink_args *ap);
 static int	devfs_write(struct vop_write_args *ap);
 
@@ -707,10 +703,6 @@
 	if (vp->v_type == VBLK)
 		return (ENXIO);
 
-	/* Don't allow open if fs is mounted -nodev. */
-	if (vp->v_mount && (vp->v_mount->mnt_flag & MNT_NODEV))
-		return (ENXIO);
-
 	if (dev == NULL)
 		return (ENXIO);
 
@@ -718,38 +710,6 @@
 	if (dev->si_iosize_max == 0)
 		dev->si_iosize_max = DFLTPHYS;
 
-	/*
-	 * XXX: Disks get special billing here, but it is mostly wrong.
-	 * XXX: Disk partitions can overlap and the real checks should
-	 * XXX: take this into account, and consequently they need to
-	 * XXX: live in the disk slice code.  Some checks do.
-	 */
-	if (vn_isdisk(vp, NULL) && ap->a_cred != FSCRED &&
-	    (ap->a_mode & FWRITE)) {
-		/*
-		 * Never allow opens for write if the disk is mounted R/W.
-		 */
-		if (vp->v_rdev->si_mountpoint != NULL &&
-		    !(vp->v_rdev->si_mountpoint->mnt_flag & MNT_RDONLY))
-			return (EBUSY);
-
-		/*
-		 * When running in secure mode, do not allow opens
-		 * for writing if the disk is mounted.
-		 */
-		error = securelevel_ge(td->td_ucred, 1);
-		if (error && vfs_mountedon(vp))
-			return (error);
-
-		/*
-		 * When running in very secure mode, do not allow
-		 * opens for writing of any disks.
-		 */
-		error = securelevel_ge(td->td_ucred, 2);
-		if (error)
-			return (error);
-	}
-
 	dsw = dev_refthread(dev);
 	if (dsw == NULL)
 		return (ENXIO);
@@ -779,11 +739,6 @@
 	if (error)
 		return (error);
 
-	if (vn_isdisk(vp, NULL)) {
-		if (!dev->si_bsize_phys)
-			dev->si_bsize_phys = DEV_BSIZE;
-		vp->v_bufobj.bo_bsize = dev->si_bsize_phys;
-	}
 	return (error);
 }
 
@@ -1231,59 +1186,7 @@
 }
 #endif
 
-static int doslowdown = 0;
-SYSCTL_INT(_debug, OID_AUTO, doslowdown, CTLFLAG_RW, &doslowdown, 0, "");
-
 static int
-devfs_specstrategy(ap)
-	struct vop_specstrategy_args /* {
-		struct vnode *a_vp;
-		struct buf *a_bp;
-	} */ *ap;
-{
-	struct vnode *vp = ap->a_vp;
-	struct buf *bp = ap->a_bp;
-	struct mount *mp;
-	struct thread *td = curthread;
-	
-	KASSERT(ap->a_vp->v_rdev == ap->a_bp->b_dev,
-	    ("%s, dev %s != %s", __func__,
-	    devtoname(ap->a_vp->v_rdev),
-	    devtoname(ap->a_bp->b_dev)));
-	KASSERT(bp->b_iocmd == BIO_READ || bp->b_iocmd == BIO_WRITE,
-	    ("Wrong b_iocmd buf=%p cmd=%d", bp, bp->b_iocmd));
-
-	/*
-	 * Slow down disk requests for niced processes.
-	 */
-	if (doslowdown && td && td->td_proc->p_nice > 0) {
-		msleep(td, NULL, PPAUSE | PCATCH, "ioslow",
-		    td->td_proc->p_nice);
-	}
-	/*
-	 * Collect statistics on synchronous and asynchronous read
-	 * and write counts for disks that have associated filesystems.
-	 */
-	if (vn_isdisk(vp, NULL) && (mp = vp->v_rdev->si_mountpoint) != NULL) {
-		if (bp->b_iocmd == BIO_WRITE) {
-			if (bp->b_lock.lk_lockholder == LK_KERNPROC)
-				mp->mnt_stat.f_asyncwrites++;
-			else
-				mp->mnt_stat.f_syncwrites++;
-		} else {
-			if (bp->b_lock.lk_lockholder == LK_KERNPROC)
-				mp->mnt_stat.f_asyncreads++;
-			else
-				mp->mnt_stat.f_syncreads++;
-		}
-	}
-
-	dev_strategy(bp);	
-		
-	return (0);
-}
-
-static int
 devfs_symlink(ap)
 	struct vop_symlink_args /* {
 		struct vnode *a_dvp;
@@ -1434,7 +1337,6 @@
 #ifdef MAC
 	{ &vop_setlabel_desc,		(vop_t *) devfs_setlabel },
 #endif
-	{ &vop_specstrategy_desc,	(vop_t *) devfs_specstrategy },
 	{ &vop_strategy_desc,		(vop_t *) vop_panic },
 	{ &vop_symlink_desc,		(vop_t *) vop_panic },
 	{ &vop_write_desc,		(vop_t *) devfs_write },

==== //depot/projects/uart/fs/hpfs/hpfs.h#3 (text+ko) ====

@@ -23,7 +23,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $FreeBSD: src/sys/fs/hpfs/hpfs.h,v 1.14 2004/06/16 09:47:03 phk Exp $
+ * $FreeBSD: src/sys/fs/hpfs/hpfs.h,v 1.15 2004/10/29 10:43:07 phk Exp $
  */
 
 /*#define HPFS_DEBUG 10*/
@@ -312,6 +312,8 @@
 	struct spblock	hpm_sp;
 	struct mount *	hpm_mp;
 	struct vnode *	hpm_devvp;
+	struct g_consumer *hpm_cp;
+	struct bufobj *hpm_bo;
 	struct cdev *hpm_dev;
 	uid_t          	hpm_uid;
 	gid_t           hpm_gid;

==== //depot/projects/uart/fs/hpfs/hpfs_vfsops.c#4 (text+ko) ====

@@ -23,7 +23,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $FreeBSD: src/sys/fs/hpfs/hpfs_vfsops.c,v 1.39 2004/07/30 22:08:49 phk Exp $
+ * $FreeBSD: src/sys/fs/hpfs/hpfs_vfsops.c,v 1.40 2004/10/29 10:43:07 phk Exp $
  */
 
 
@@ -40,6 +40,9 @@
 #include <sys/fcntl.h>
 #include <sys/malloc.h>
 
+#include <geom/geom.h>
+#include <geom/geom_vfs.h>
+
 #include <vm/vm.h>
 #include <vm/vm_param.h>
 #include <vm/vm_page.h>
@@ -212,48 +215,41 @@
 	struct hpfs_args *argsp;
 	struct thread *td;
 {
-	int error, ncount, ronly;
+	int error, ronly;
 	struct sublock *sup;
 	struct spblock *spp;
 	struct hpfsmount *hpmp;
 	struct buf *bp = NULL;
 	struct vnode *vp;
 	struct cdev *dev = devvp->v_rdev;
+	struct g_consumer *cp;
+	struct bufobj *bo;
 
 	dprintf(("hpfs_mountfs():\n"));
-	/*
-	 * Disallow multiple mounts of the same device.
-	 * Disallow mounting of a device that is currently in use
-	 * (except for root, which might share swap device for miniroot).
-	 * Flush out any old buffers remaining from a previous use.
-	 */
-	error = vfs_mountedon(devvp);
-	if (error)
-		return (error);
-	ncount = vcount(devvp);
-	if (devvp->v_object)
-		ncount -= 1;
-	if (ncount > 1)
-		return (EBUSY);
-
+	ronly = (mp->mnt_flag & MNT_RDONLY) != 0;
 	vn_lock(devvp, LK_EXCLUSIVE | LK_RETRY, td);
-	error = vinvalbuf(devvp, V_SAVE, td->td_ucred, td, 0, 0);
+	/* XXX: use VOP_ACCESS to check FS perms */
+	DROP_GIANT();
+	g_topology_lock();
+	error = g_vfs_open(devvp, &cp, "hpfs", ronly ? 0 : 1);
+	g_topology_unlock();
+	PICKUP_GIANT();
 	VOP_UNLOCK(devvp, 0, td);
 	if (error)
 		return (error);
 
-	ronly = (mp->mnt_flag & MNT_RDONLY) != 0;
-	vn_lock(devvp, LK_EXCLUSIVE | LK_RETRY, td);
-	error = VOP_OPEN(devvp, ronly ? FREAD : FREAD|FWRITE, FSCRED, td, -1);
-	VOP_UNLOCK(devvp, 0, td);
-	if (error)
-		return (error);
+	bo = &devvp->v_bufobj;
+	bo->bo_private = cp;
+	bo->bo_ops = g_vfs_bufops;
 
 	/*
 	 * Do actual mount
 	 */
 	hpmp = malloc(sizeof(struct hpfsmount), M_HPFSMNT, M_WAITOK | M_ZERO);
 
+	hpmp->hpm_cp = cp;
+	hpmp->hpm_bo = bo;
+
 	/* Read in SuperBlock */
 	error = bread(devvp, SUBLOCK, SUSIZE, NOCRED, &bp);
 	if (error)
@@ -314,15 +310,13 @@
 	mp->mnt_stat.f_fsid.val[1] = mp->mnt_vfc->vfc_typenum;
 	mp->mnt_maxsymlinklen = 0;
 	mp->mnt_flag |= MNT_LOCAL;
-	devvp->v_rdev->si_mountpoint = mp;
 	return (0);
 
 failed:
 	if (bp)
 		brelse (bp);
 	mp->mnt_data = (qaddr_t)NULL;
-	devvp->v_rdev->si_mountpoint = NULL;
-	(void)VOP_CLOSE(devvp, ronly ? FREAD : FREAD|FWRITE, NOCRED, td);
+	g_wither_geom_close(cp->geom, ENXIO);
 	return (error);
 }
 
@@ -351,12 +345,8 @@
 		return (error);
 	}
 
-	hpmp->hpm_devvp->v_rdev->si_mountpoint = NULL;
-
 	vinvalbuf(hpmp->hpm_devvp, V_SAVE, NOCRED, td, 0, 0);
-	error = VOP_CLOSE(hpmp->hpm_devvp, ronly ? FREAD : FREAD|FWRITE,
-		NOCRED, td);
-
+	g_wither_geom_close(hpmp->hpm_cp->geom, ENXIO);
 	vrele(hpmp->hpm_devvp);
 
 	dprintf(("hpfs_umount: freeing memory...\n"));

==== //depot/projects/uart/fs/hpfs/hpfs_vnops.c#4 (text+ko) ====

@@ -23,7 +23,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $FreeBSD: src/sys/fs/hpfs/hpfs_vnops.c,v 1.50 2004/10/27 06:48:20 phk Exp $
+ * $FreeBSD: src/sys/fs/hpfs/hpfs_vnops.c,v 1.51 2004/10/29 10:43:07 phk Exp $
  */
 
 #include <sys/param.h>
@@ -648,6 +648,7 @@
 	register struct vnode *vp = ap->a_vp;
 	register struct hpfsnode *hp = VTOHP(ap->a_vp);
 	daddr_t blkno;
+	struct bufobj *bo;
 	int error;
 
 	dprintf(("hpfs_strategy(): \n"));
@@ -671,9 +672,9 @@
 		bufdone(bp);
 		return (0);
 	}
-	bp->b_dev = hp->h_devvp->v_rdev;
 	bp->b_iooffset = dbtob(bp->b_blkno);
-	VOP_SPECSTRATEGY(hp->h_devvp, bp);
+	bo = hp->h_hpmp->hpm_bo;
+	bo->bo_ops->bop_strategy(bo, bp);
 	return (0);
 }
 

==== //depot/projects/uart/fs/msdosfs/msdosfs_denode.c#4 (text+ko) ====

@@ -1,4 +1,4 @@
-/* $FreeBSD: src/sys/fs/msdosfs/msdosfs_denode.c,v 1.74 2004/09/07 09:17:04 phk Exp $ */
+/* $FreeBSD: src/sys/fs/msdosfs/msdosfs_denode.c,v 1.75 2004/10/29 10:40:14 phk Exp $ */
 /*	$NetBSD: msdosfs_denode.c,v 1.28 1998/02/10 14:10:00 mrg Exp $	*/
 
 /*-
@@ -371,7 +371,6 @@
 		}
 	} else
 		nvp->v_type = VREG;
-	
 	ldep->de_modrev = init_va_filerev();
 	ldep->de_devvp = pmp->pm_devvp;
 	VREF(ldep->de_devvp);

==== //depot/projects/uart/fs/msdosfs/msdosfs_vfsops.c#7 (text+ko) ====

@@ -1,4 +1,4 @@
-/* $FreeBSD: src/sys/fs/msdosfs/msdosfs_vfsops.c,v 1.129 2004/10/25 09:14:01 phk Exp $ */
+/* $FreeBSD: src/sys/fs/msdosfs/msdosfs_vfsops.c,v 1.131 2004/10/29 10:40:14 phk Exp $ */
 /*	$NetBSD: msdosfs_vfsops.c,v 1.51 1997/11/17 15:36:58 ws Exp $	*/
 
 /*-
@@ -71,6 +71,9 @@
 #include <fs/msdosfs/denode.h>
 #include <fs/msdosfs/fat.h>
 
+#include <geom/geom.h>
+#include <geom/geom_vfs.h>
+
 #include "opt_msdosfs.h"
 
 #define MSDOSFS_DFLTBSIZE       4096
@@ -209,7 +212,8 @@
 	if (mp->mnt_flag & MNT_UPDATE) {
 		pmp = VFSTOMSDOSFS(mp);
 		error = 0;
-		if (!(pmp->pm_flags & MSDOSFSMNT_RONLY) && (mp->mnt_flag & MNT_RDONLY)) {
+		if (!(pmp->pm_flags & MSDOSFSMNT_RONLY) &&
+		    (mp->mnt_flag & MNT_RDONLY)) {
 			error = VFS_SYNC(mp, MNT_WAIT, td->td_ucred, td);
 			if (error)
 				return (error);
@@ -217,13 +221,19 @@
 			if (mp->mnt_flag & MNT_FORCE)
 				flags |= FORCECLOSE;
 			error = vflush(mp, 0, flags, td);
+			DROP_GIANT();
+			g_topology_lock();
+			g_access(pmp->pm_cp, 0, -1, 0);
+			g_topology_unlock();
+			PICKUP_GIANT();
 		}
 		if (!error && (mp->mnt_flag & MNT_RELOAD))
 			/* not yet implemented */
 			error = EOPNOTSUPP;
 		if (error)
 			return (error);
-		if ((pmp->pm_flags & MSDOSFSMNT_RONLY) && (mp->mnt_kern_flag & MNTK_WANTRDWR)) {
+		if ((pmp->pm_flags & MSDOSFSMNT_RONLY) &&
+		    (mp->mnt_kern_flag & MNTK_WANTRDWR)) {
 			/*
 			 * If upgrade to read-write by non-root, then verify
 			 * that user has necessary permissions on the device.
@@ -239,6 +249,13 @@
 				}
 				VOP_UNLOCK(devvp, 0, td);
 			}
+			DROP_GIANT();
+			g_topology_lock();
+			error = g_access(pmp->pm_cp, 0, 1, 0);
+			g_topology_unlock();
+			PICKUP_GIANT();
+			if (error)
+				return (error);
 			pmp->pm_flags &= ~MSDOSFSMNT_RONLY;
 
 			/* Now that the volume is modifiable, mark it dirty. */
@@ -344,41 +361,21 @@
 	u_int8_t SecPerClust;
 	u_long clusters;
 	int	ronly, error;
+	struct g_consumer *cp;
+	struct bufobj *bo;
 
-	/*
-	 * Disallow multiple mounts of the same device.
-	 * Disallow mounting of a device that is currently in use
-	 * (except for root, which might share swap device for miniroot).
-	 * Flush out any old buffers remaining from a previous use.
-	 */
-	error = vfs_mountedon(devvp);
-	if (error)
-		return (error);
-	if (vcount(devvp) > 1)
-		return (EBUSY);
-	vn_lock(devvp, LK_EXCLUSIVE | LK_RETRY, td);
-	error = vinvalbuf(devvp, V_SAVE, td->td_ucred, td, 0, 0);
-	if (error) {
-		VOP_UNLOCK(devvp, 0, td);
-		return (error);
-	}
-
 	ronly = (mp->mnt_flag & MNT_RDONLY) != 0;
-	/*
-	 * XXX: open the device with read and write access even if only
-	 * read access is needed now.  Write access is needed if the
-	 * filesystem is ever mounted read/write, and we don't change the
-	 * access mode for remounts.
-	 */
-#ifdef notyet
-	error = VOP_OPEN(devvp, ronly ? FREAD : FREAD | FWRITE, FSCRED, td, -1);
-#else
-	error = VOP_OPEN(devvp, FREAD | FWRITE, FSCRED, td, -1);
-#endif
+	/* XXX: use VOP_ACCESS to check FS perms */
+	DROP_GIANT();
+	g_topology_lock();
+	error = g_vfs_open(devvp, &cp, "msdos", ronly ? 0 : 1);
+	g_topology_unlock();
+	PICKUP_GIANT();
 	VOP_UNLOCK(devvp, 0, td);
 	if (error)
 		return (error);
 
+	bo = &devvp->v_bufobj;
 	bp  = NULL; /* both used in error_exit */
 	pmp = NULL;
 
@@ -407,6 +404,8 @@
 
 	pmp = malloc(sizeof *pmp, M_MSDOSFSMNT, M_WAITOK | M_ZERO);
 	pmp->pm_mountp = mp;
+	pmp->pm_cp = cp;
+	pmp->pm_bo = bo;
 
 	/*
 	 * Compute several useful quantities from the bpb in the
@@ -663,7 +662,6 @@
 	mp->mnt_stat.f_fsid.val[0] = dev2udev(dev);
 	mp->mnt_stat.f_fsid.val[1] = mp->mnt_vfc->vfc_typenum;
 	mp->mnt_flag |= MNT_LOCAL;
-	devvp->v_rdev->si_mountpoint = mp;
 
 #ifdef MSDOSFS_LARGE
 	msdosfs_fileno_init(mp);
@@ -674,12 +672,13 @@
 error_exit:
 	if (bp)
 		brelse(bp);
-	/* XXX: see comment above VOP_OPEN. */
-#ifdef notyet
-	(void)VOP_CLOSE(devvp, ronly ? FREAD : FREAD | FWRITE, NOCRED, td);
-#else
-	(void)VOP_CLOSE(devvp, FREAD | FWRITE, NOCRED, td);
-#endif
+	if (cp != NULL) {
+		DROP_GIANT();
+		g_topology_lock();
+		g_wither_geom_close(cp->geom, ENXIO);
+		g_topology_unlock();
+		PICKUP_GIANT();
+	}
 	if (pmp) {
 		if (pmp->pm_inusemap)
 			free(pmp->pm_inusemap, M_MSDOSFSFAT);
@@ -718,7 +717,6 @@
 		if (pmp->pm_u2d)
 			msdosfs_iconv->close(pmp->pm_u2d);
 	}
-	pmp->pm_devvp->v_rdev->si_mountpoint = NULL;
 
 	/* If the volume was mounted read/write, mark it clean now. */
 	if ((pmp->pm_flags & MSDOSFSMNT_RONLY) == 0) {
@@ -751,14 +749,11 @@
 		VI_UNLOCK(vp);
 	}
 #endif
-	/* XXX: see comment above VOP_OPEN. */
-#ifdef notyet
-	error = VOP_CLOSE(pmp->pm_devvp,
-	    (pmp->pm_flags & MSDOSFSMNT_RONLY) ? FREAD : FREAD | FWRITE,
-	    NOCRED, td);
-#else
-	error = VOP_CLOSE(pmp->pm_devvp, FREAD | FWRITE, NOCRED, td);
-#endif
+	DROP_GIANT();
+	g_topology_lock();
+	g_wither_geom_close(pmp->pm_cp->geom, ENXIO);
+	g_topology_unlock();
+	PICKUP_GIANT();
 	vrele(pmp->pm_devvp);
 	free(pmp->pm_inusemap, M_MSDOSFSFAT);
 #ifdef MSDOSFS_LARGE
@@ -845,17 +840,16 @@
 loop:
 	MNT_VNODE_FOREACH(vp, mp, nvp) {
 		VI_LOCK(vp);
-		if (vp->v_iflag & VI_XLOCK) {
+		if (vp->v_type == VNON || (vp->v_iflag & VI_XLOCK)) {
 			VI_UNLOCK(vp);
 			continue;
 		}
 		MNT_IUNLOCK(mp);
 		dep = VTODE(vp);
-		if (vp->v_type == VNON ||
-		    ((dep->de_flag &
+		if ((dep->de_flag &
 		    (DE_ACCESS | DE_CREATE | DE_UPDATE | DE_MODIFIED)) == 0 &&
 		    (vp->v_bufobj.bo_dirty.bv_cnt == 0 ||
-		    waitfor == MNT_LAZY))) {
+		    waitfor == MNT_LAZY)) {
 			VI_UNLOCK(vp);
 			MNT_ILOCK(mp);
 			continue;

==== //depot/projects/uart/fs/msdosfs/msdosfs_vnops.c#7 (text+ko) ====

@@ -1,4 +1,4 @@
-/* $FreeBSD: src/sys/fs/msdosfs/msdosfs_vnops.c,v 1.150 2004/10/27 06:48:20 phk Exp $ */
+/* $FreeBSD: src/sys/fs/msdosfs/msdosfs_vnops.c,v 1.151 2004/10/29 10:40:14 phk Exp $ */
 /*	$NetBSD: msdosfs_vnops.c,v 1.68 1998/02/10 14:10:04 mrg Exp $	*/
 
 /*-
@@ -1772,8 +1772,8 @@
 	} */ *ap;
 {
 	struct buf *bp = ap->a_bp;
-	struct vnode *vp;
 	struct denode *dep = VTODE(ap->a_vp);
+	struct bufobj *bo;
 	int error = 0;
 	daddr_t blkno;
 
@@ -1803,10 +1803,9 @@
 	 * Read/write the block from/to the disk that contains the desired
 	 * file block.
 	 */
-	vp = dep->de_devvp;
-	bp->b_dev = vp->v_rdev;
 	bp->b_iooffset = dbtob(bp->b_blkno);
-	VOP_SPECSTRATEGY(vp, bp);
+	bo = dep->de_pmp->pm_bo;
+	bo->bo_ops->bop_strategy(bo, bp);
 	return (0);
 }
 

==== //depot/projects/uart/fs/msdosfs/msdosfsmount.h#5 (text+ko) ====

@@ -1,4 +1,4 @@
-/* $FreeBSD: src/sys/fs/msdosfs/msdosfsmount.h,v 1.33 2004/07/03 13:22:38 tjr Exp $ */
+/* $FreeBSD: src/sys/fs/msdosfs/msdosfsmount.h,v 1.34 2004/10/29 10:40:14 phk Exp $ */
 /*	$NetBSD: msdosfsmount.h,v 1.17 1997/11/17 15:37:07 ws Exp $	*/
 
 /*-
@@ -67,6 +67,8 @@
 struct msdosfsmount {
 	struct mount *pm_mountp;/* vfs mount struct for this fs */
 	struct cdev *pm_dev;		/* block special device mounted */
+	struct g_consumer *pm_cp;
+	struct bufobj *pm_bo;
 	uid_t pm_uid;		/* uid to set as owner of the files */
 	gid_t pm_gid;		/* gid to set as owner of the files */
 	mode_t pm_mask;		/* mask to and with file protection bits 

==== //depot/projects/uart/fs/ntfs/ntfs_vfsops.c#6 (text+ko) ====

@@ -25,7 +25,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $FreeBSD: src/sys/fs/ntfs/ntfs_vfsops.c,v 1.61 2004/07/30 22:08:50 phk Exp $
+ * $FreeBSD: src/sys/fs/ntfs/ntfs_vfsops.c,v 1.62 2004/10/29 10:43:45 phk Exp $
  */
 
 
@@ -275,29 +275,9 @@
 	struct buf *bp;
 	struct ntfsmount *ntmp;
 	struct cdev *dev = devvp->v_rdev;
-	int error, ronly, ncount, i;
+	int error, ronly, i;
 	struct vnode *vp;
 
-	/*
-	 * Disallow multiple mounts of the same device.
-	 * Disallow mounting of a device that is currently in use
-	 * (except for root, which might share swap device for miniroot).
-	 * Flush out any old buffers remaining from a previous use.
-	 */
-	error = vfs_mountedon(devvp);
-	if (error)
-		return (error);
-	ncount = vcount(devvp);
-	if (devvp->v_object)
-		ncount -= 1;
-	if (ncount > 1)
-		return (EBUSY);
-	vn_lock(devvp, LK_EXCLUSIVE | LK_RETRY, td);
-	error = vinvalbuf(devvp, V_SAVE, td->td_ucred, td, 0, 0);
-	VOP_UNLOCK(devvp, 0, td);
-	if (error)
-		return (error);
-
 	ronly = (mp->mnt_flag & MNT_RDONLY) != 0;
 	vn_lock(devvp, LK_EXCLUSIVE | LK_RETRY, td);
 	error = VOP_OPEN(devvp, ronly ? FREAD : FREAD|FWRITE, FSCRED, td, -1);
@@ -451,7 +431,6 @@
 	mp->mnt_stat.f_fsid.val[1] = mp->mnt_vfc->vfc_typenum;
 	mp->mnt_maxsymlinklen = 0;
 	mp->mnt_flag |= MNT_LOCAL;
-	devvp->v_rdev->si_mountpoint = mp;
 	return (0);
 
 out1:
@@ -462,7 +441,6 @@
 		dprintf(("ntfs_mountfs: vflush failed\n"));
 
 out:
-	devvp->v_rdev->si_mountpoint = NULL;
 	if (bp)
 		brelse(bp);
 
@@ -508,13 +486,6 @@
 	if (error)
 		printf("ntfs_unmount: vflush failed(sysnodes): %d\n",error);
 
-	/* Check if the type of device node isn't VBAD before
-	 * touching v_cdev.  If the device vnode is revoked, the
-	 * field is NULL and touching it causes null pointer derefercence.
-	 */
-	if (ntmp->ntm_devvp->v_type != VBAD)
-		ntmp->ntm_devvp->v_rdev->si_mountpoint = NULL;
-
 	vinvalbuf(ntmp->ntm_devvp, V_SAVE, NOCRED, td, 0, 0);

>>> TRUNCATED FOR MAIL (1000 lines) <<<



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200410300738.i9U7cUCe031967>