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>