|
|
| version 1.17, 2004/05/18 00:16:46 | version 1.18, 2004/05/19 22:53:06 |
|---|---|
| Line 316 ffs_mount(struct mount *mp, /* mount st | Line 316 ffs_mount(struct mount *mp, /* mount st |
| ******************** | ******************** |
| * UPDATE | * UPDATE |
| * If it's not the same vnode, or at least the same device | * 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 != ump->um_devvp) { |
| if ( devvp->v_rdev == ump->um_devvp->v_rdev) { | if (devvp->v_udev == ump->um_devvp->v_udev) { |
| vrele(devvp); | vrele(devvp); |
| } else { | } 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 */ | err = EINVAL; /* needs translation */ |
| } | } |
| } else | } else { |
| vrele(devvp); | vrele(devvp); |
| } | |
| /* | /* |
| * Update device name only on success | * Update device name only on success |
| */ | */ |
| Line 459 ffs_reload(struct mount *mp, struct ucre | Line 463 ffs_reload(struct mount *mp, struct ucre |
| panic("ffs_reload: dirty1"); | panic("ffs_reload: dirty1"); |
| dev = devvp->v_rdev; | dev = devvp->v_rdev; |
| /* | /* |
| * Only VMIO the backing device if the backing device is a real | * Only VMIO the backing device if the backing device is a real |
| * block device. See ffs_mountmfs() for more details. | * block device. See ffs_mountmfs() for more details. |
| Line 617 ffs_mountfs(struct vnode *devvp, struct | Line 620 ffs_mountfs(struct vnode *devvp, struct |
| int32_t *lp; | int32_t *lp; |
| u_int64_t maxfilesize; /* XXX */ | u_int64_t maxfilesize; /* XXX */ |
| size_t strsize; | size_t strsize; |
| int ncount; | |
| dev = devvp->v_rdev; | |
| /* | /* |
| * Disallow multiple mounts of the same device. | * Disallow multiple mounts of the same device. |
| * Disallow mounting of a device that is currently in use | * Disallow mounting of a device that is currently in use |
| Line 629 ffs_mountfs(struct vnode *devvp, struct | Line 630 ffs_mountfs(struct vnode *devvp, struct |
| error = vfs_mountedon(devvp); | error = vfs_mountedon(devvp); |
| if (error) | if (error) |
| return (error); | return (error); |
| ncount = vcount(devvp); | if (count_udev(devvp->v_udev) > 0 && devvp != rootvp) |
| if (ncount > 1 && devvp != rootvp) | |
| return (EBUSY); | return (EBUSY); |
| vn_lock(devvp, NULL, LK_EXCLUSIVE | LK_RETRY, td); | vn_lock(devvp, NULL, LK_EXCLUSIVE | LK_RETRY, td); |
| error = vinvalbuf(devvp, V_SAVE, td, 0, 0); | error = vinvalbuf(devvp, V_SAVE, td, 0, 0); |
| Line 658 ffs_mountfs(struct vnode *devvp, struct | Line 657 ffs_mountfs(struct vnode *devvp, struct |
| VOP_UNLOCK(devvp, NULL, 0, td); | VOP_UNLOCK(devvp, NULL, 0, td); |
| if (error) | if (error) |
| return (error); | return (error); |
| if (devvp->v_rdev->si_iosize_max != 0) | dev = devvp->v_rdev; |
| mp->mnt_iosize_max = devvp->v_rdev->si_iosize_max; | if (dev->si_iosize_max != 0) |
| mp->mnt_iosize_max = dev->si_iosize_max; | |
| if (mp->mnt_iosize_max > MAXPHYS) | if (mp->mnt_iosize_max > MAXPHYS) |
| mp->mnt_iosize_max = MAXPHYS; | mp->mnt_iosize_max = MAXPHYS; |
| Line 768 ffs_mountfs(struct vnode *devvp, struct | Line 768 ffs_mountfs(struct vnode *devvp, struct |
| ump->um_seqinc = fs->fs_frag; | ump->um_seqinc = fs->fs_frag; |
| for (i = 0; i < MAXQUOTAS; i++) | for (i = 0; i < MAXQUOTAS; i++) |
| ump->um_quotas[i] = NULLVP; | ump->um_quotas[i] = NULLVP; |
| devvp->v_specmountpoint = mp; | dev->si_mountpoint = mp; |
| ffs_oldfscompat(fs); | ffs_oldfscompat(fs); |
| /* | /* |
| Line 808 ffs_mountfs(struct vnode *devvp, struct | Line 808 ffs_mountfs(struct vnode *devvp, struct |
| } | } |
| return (0); | return (0); |
| out: | out: |
| devvp->v_specmountpoint = NULL; | dev->si_mountpoint = NULL; |
| if (bp) | if (bp) |
| brelse(bp); | brelse(bp); |
| (void)VOP_CLOSE(devvp, ronly ? FREAD : FREAD|FWRITE, td); | VOP_CLOSE(devvp, ronly ? FREAD : FREAD|FWRITE, td); |
| if (ump) { | if (ump) { |
| free(ump->um_fs, M_UFSMNT); | free(ump->um_fs, M_UFSMNT); |
| free(ump, M_UFSMNT); | free(ump, M_UFSMNT); |
| Line 881 ffs_unmount(struct mount *mp, int mntfla | Line 881 ffs_unmount(struct mount *mp, int mntfla |
| return (error); | 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); | vinvalbuf(ump->um_devvp, V_SAVE, td, 0, 0); |
| error = VOP_CLOSE(ump->um_devvp, fs->fs_ronly ? FREAD : FREAD|FWRITE, td); | error = VOP_CLOSE(ump->um_devvp, fs->fs_ronly ? FREAD : FREAD|FWRITE, td); |