diff options
author | phk <phk@FreeBSD.org> | 2004-10-29 10:40:14 +0000 |
---|---|---|
committer | phk <phk@FreeBSD.org> | 2004-10-29 10:40:14 +0000 |
commit | a4581c67889154eca92ca51c4863ca7e13d8238f (patch) | |
tree | 59da9c67fad5f682ec3e87c0aca43042a1f40c67 | |
parent | d9d9558b8bc8b5630a1f2947c1b6f440a1356e48 (diff) | |
download | FreeBSD-src-a4581c67889154eca92ca51c4863ca7e13d8238f.zip FreeBSD-src-a4581c67889154eca92ca51c4863ca7e13d8238f.tar.gz |
Move MSDOSFS to GEOM backing instead of DEVFS.
For details, please see src/sys/ufs/ffs/ffs_vfsops.c 1.250.
-rw-r--r-- | sys/fs/msdosfs/msdosfs_denode.c | 1 | ||||
-rw-r--r-- | sys/fs/msdosfs/msdosfs_vfsops.c | 89 | ||||
-rw-r--r-- | sys/fs/msdosfs/msdosfs_vnops.c | 7 | ||||
-rw-r--r-- | sys/fs/msdosfs/msdosfsmount.h | 2 |
4 files changed, 47 insertions, 52 deletions
diff --git a/sys/fs/msdosfs/msdosfs_denode.c b/sys/fs/msdosfs/msdosfs_denode.c index cd7f536..845e633 100644 --- a/sys/fs/msdosfs/msdosfs_denode.c +++ b/sys/fs/msdosfs/msdosfs_denode.c @@ -371,7 +371,6 @@ deget(pmp, dirclust, diroffset, depp) } } else nvp->v_type = VREG; - ldep->de_modrev = init_va_filerev(); ldep->de_devvp = pmp->pm_devvp; VREF(ldep->de_devvp); diff --git a/sys/fs/msdosfs/msdosfs_vfsops.c b/sys/fs/msdosfs/msdosfs_vfsops.c index 089118d..fdad05a 100644 --- a/sys/fs/msdosfs/msdosfs_vfsops.c +++ b/sys/fs/msdosfs/msdosfs_vfsops.c @@ -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 @@ msdosfs_omount(mp, path, data, td) 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 @@ msdosfs_omount(mp, path, data, td) 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 @@ msdosfs_omount(mp, path, data, td) } 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 @@ mountmsdosfs(devvp, mp, td, argp) u_int8_t SecPerClust; u_long clusters; int ronly, error; - - /* - * 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); - } + struct g_consumer *cp; + struct bufobj *bo; 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 @@ mountmsdosfs(devvp, mp, td, argp) 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 @@ mountmsdosfs(devvp, mp, td, argp) 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 @@ mountmsdosfs(devvp, mp, td, argp) 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 @@ msdosfs_unmount(mp, mntflags, td) 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 @@ msdosfs_unmount(mp, mntflags, td) 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 diff --git a/sys/fs/msdosfs/msdosfs_vnops.c b/sys/fs/msdosfs/msdosfs_vnops.c index 207e6d8..66c600e 100644 --- a/sys/fs/msdosfs/msdosfs_vnops.c +++ b/sys/fs/msdosfs/msdosfs_vnops.c @@ -1772,8 +1772,8 @@ msdosfs_strategy(ap) } */ *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 @@ msdosfs_strategy(ap) * 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); } diff --git a/sys/fs/msdosfs/msdosfsmount.h b/sys/fs/msdosfs/msdosfsmount.h index 46f9cc5..4743292 100644 --- a/sys/fs/msdosfs/msdosfsmount.h +++ b/sys/fs/msdosfs/msdosfsmount.h @@ -67,6 +67,8 @@ struct msdosfs_fileno; 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 |