Device layer rollup commit.
[dragonfly.git] / sys / vfs / ufs / ffs_vfsops.c
index 86ad6ed..ec2711d 100644 (file)
@@ -32,7 +32,7 @@
  *
  *     @(#)ffs_vfsops.c        8.31 (Berkeley) 5/20/95
  * $FreeBSD: src/sys/ufs/ffs/ffs_vfsops.c,v 1.117.2.10 2002/06/23 22:34:52 iedowse Exp $
- * $DragonFly: src/sys/vfs/ufs/ffs_vfsops.c,v 1.16 2004/04/24 04:32:05 drhodus Exp $
+ * $DragonFly: src/sys/vfs/ufs/ffs_vfsops.c,v 1.18 2004/05/19 22:53:06 dillon Exp $
  */
 
 #include "opt_quota.h"
@@ -128,12 +128,11 @@ VFS_SET(ufs_vfsops, ufs, 0);
  *             namei() if it is a genuine NULL from the user.
  */
 static int
-ffs_mount( mp, path, data, ndp, td)
-        struct mount           *mp;    /* mount struct pointer*/
-        char                   *path;  /* path to mount point*/
-        caddr_t                        data;   /* arguments to FS specific mount*/
-        struct nameidata       *ndp;   /* mount point credentials*/
-        struct thread          *td;    /* process requesting mount*/
+ffs_mount(struct mount *mp,            /* mount struct pointer */
+          char *path,                  /* path to mount point */
+          caddr_t data,                        /* arguments to FS specific mount */
+          struct nameidata *ndp,       /* mount point credentials */
+          struct thread        *td)            /* process requesting mount */
 {
        size_t          size;
        int             err = 0;
@@ -317,18 +316,22 @@ ffs_mount( mp, path, data, ndp, td)
                 ********************
                 * UPDATE
                 * If it's not the same vnode, or at least the same device
-                * then it's not correct.
+                * then it's not correct.  NOTE: devvp->v_rdev may be NULL
+                * since we haven't opened it, so we compare udev instead.
                 ********************
                 */
-
                if (devvp != ump->um_devvp) {
-                       if ( devvp->v_rdev == ump->um_devvp->v_rdev) {
+                       if (devvp->v_udev == ump->um_devvp->v_udev) {
                                vrele(devvp);
                        } else {
+                               printf("cannot update mount, udev does"
+                                       " not match %08x vs %08x\n",
+                                       devvp->v_udev, ump->um_devvp->v_udev);
                                err = EINVAL;   /* needs translation */
                        }
-               } else
+               } else {
                        vrele(devvp);
+               }
                /*
                 * Update device name only on success
                 */
@@ -460,7 +463,6 @@ ffs_reload(struct mount *mp, struct ucred *cred, struct thread *td)
                panic("ffs_reload: dirty1");
 
        dev = devvp->v_rdev;
-
        /*
         * Only VMIO the backing device if the backing device is a real
         * block device.  See ffs_mountmfs() for more details.
@@ -604,11 +606,8 @@ ffs_reload_scan2(struct mount *mp, struct vnode *vp, lwkt_tokref_t vlock, void *
  * Common code for mount and mountroot
  */
 int
-ffs_mountfs(devvp, mp, td, malloctype)
-       struct vnode *devvp;
-       struct mount *mp;
-       struct thread *td;
-       struct malloc_type *malloctype;
+ffs_mountfs(struct vnode *devvp, struct mount *mp, struct thread *td,
+           struct malloc_type *malloctype)
 {
        struct ufsmount *ump;
        struct buf *bp;
@@ -621,9 +620,7 @@ ffs_mountfs(devvp, mp, td, malloctype)
        int32_t *lp;
        u_int64_t maxfilesize;                                  /* XXX */
        size_t strsize;
-       int ncount;
 
-       dev = devvp->v_rdev;
        /*
         * Disallow multiple mounts of the same device.
         * Disallow mounting of a device that is currently in use
@@ -633,9 +630,7 @@ ffs_mountfs(devvp, mp, td, malloctype)
        error = vfs_mountedon(devvp);
        if (error)
                return (error);
-       ncount = vcount(devvp);
-
-       if (ncount > 1 && devvp != rootvp)
+       if (count_udev(devvp->v_udev) > 0 && devvp != rootvp)
                return (EBUSY);
        vn_lock(devvp, NULL, LK_EXCLUSIVE | LK_RETRY, td);
        error = vinvalbuf(devvp, V_SAVE, td, 0, 0);
@@ -662,8 +657,9 @@ ffs_mountfs(devvp, mp, td, malloctype)
        VOP_UNLOCK(devvp, NULL, 0, td);
        if (error)
                return (error);
-       if (devvp->v_rdev->si_iosize_max != 0)
-               mp->mnt_iosize_max = devvp->v_rdev->si_iosize_max;
+       dev = devvp->v_rdev;
+       if (dev->si_iosize_max != 0)
+               mp->mnt_iosize_max = dev->si_iosize_max;
        if (mp->mnt_iosize_max > MAXPHYS)
                mp->mnt_iosize_max = MAXPHYS;
 
@@ -772,7 +768,7 @@ ffs_mountfs(devvp, mp, td, malloctype)
        ump->um_seqinc = fs->fs_frag;
        for (i = 0; i < MAXQUOTAS; i++)
                ump->um_quotas[i] = NULLVP;
-       devvp->v_specmountpoint = mp;
+       dev->si_mountpoint = mp;
        ffs_oldfscompat(fs);
 
        /*
@@ -812,10 +808,10 @@ ffs_mountfs(devvp, mp, td, malloctype)
        }
        return (0);
 out:
-       devvp->v_specmountpoint = NULL;
+       dev->si_mountpoint = NULL;
        if (bp)
                brelse(bp);
-       (void)VOP_CLOSE(devvp, ronly ? FREAD : FREAD|FWRITE, td);
+       VOP_CLOSE(devvp, ronly ? FREAD : FREAD|FWRITE, td);
        if (ump) {
                free(ump->um_fs, M_UFSMNT);
                free(ump, M_UFSMNT);
@@ -830,10 +826,8 @@ out:
  * XXX - goes away some day.
  */
 static int
-ffs_oldfscompat(fs)
-       struct fs *fs;
+ffs_oldfscompat(struct fs *fs)
 {
-
        fs->fs_npsect = max(fs->fs_npsect, fs->fs_nsect);       /* XXX */
        fs->fs_interleave = max(fs->fs_interleave, 1);          /* XXX */
        if (fs->fs_postblformat == FS_42POSTBLFMT)              /* XXX */
@@ -887,7 +881,7 @@ ffs_unmount(struct mount *mp, int mntflags, struct thread *td)
                        return (error);
                }
        }
-       ump->um_devvp->v_specmountpoint = NULL;
+       ump->um_devvp->v_rdev->si_mountpoint = NULL;
 
        vinvalbuf(ump->um_devvp, V_SAVE, td, 0, 0);
        error = VOP_CLOSE(ump->um_devvp, fs->fs_ronly ? FREAD : FREAD|FWRITE, td);
@@ -1058,7 +1052,7 @@ ffs_sync_scan1(struct mount *mp, struct vnode *vp, void *data)
 static
 int 
 ffs_sync_scan2(struct mount *mp, struct vnode *vp,
-                lwkt_tokref_t vlock, void *data)
+              lwkt_tokref_t vlock, void *data)
 {
        struct scaninfo *info = data;
        thread_t td = curthread;        /* XXX */
@@ -1110,10 +1104,7 @@ ffs_sync_scan2(struct mount *mp, struct vnode *vp,
 static int ffs_inode_hash_lock;
 
 int
-ffs_vget(mp, ino, vpp)
-       struct mount *mp;
-       ino_t ino;
-       struct vnode **vpp;
+ffs_vget(struct mount *mp, ino_t ino, struct vnode **vpp)
 {
        struct fs *fs;
        struct inode *ip;
@@ -1264,10 +1255,7 @@ restart:
  *   those rights via. exflagsp and credanonp
  */
 int
-ffs_fhtovp(mp, fhp, vpp)
-       struct mount *mp;
-       struct fid *fhp;
-       struct vnode **vpp;
+ffs_fhtovp(struct mount *mp, struct fid *fhp, struct vnode **vpp)
 {
        struct ufid *ufhp;
        struct fs *fs;
@@ -1285,9 +1273,7 @@ ffs_fhtovp(mp, fhp, vpp)
  */
 /* ARGSUSED */
 int
-ffs_vptofh(vp, fhp)
-       struct vnode *vp;
-       struct fid *fhp;
+ffs_vptofh(struct vnode *vp, struct fid *fhp)
 {
        struct inode *ip;
        struct ufid *ufhp;
@@ -1304,10 +1290,8 @@ ffs_vptofh(vp, fhp)
  * Initialize the filesystem; just use ufs_init.
  */
 static int
-ffs_init(vfsp)
-       struct vfsconf *vfsp;
+ffs_init(struct vfsconf *vfsp)
 {
-
        softdep_initialize();
        return (ufs_init(vfsp));
 }
@@ -1316,9 +1300,7 @@ ffs_init(vfsp)
  * Write a superblock and associated information back to disk.
  */
 static int
-ffs_sbupdate(mp, waitfor)
-       struct ufsmount *mp;
-       int waitfor;
+ffs_sbupdate(struct ufsmount *mp, int waitfor)
 {
        struct fs *dfs, *fs = mp->um_fs;
        struct buf *bp;