version 1.257, 2010/02/05 20:03:36 |
version 1.257.2.8, 2010/08/17 06:48:10 |
Line 67 __KERNEL_RCSID(0, "$NetBSD$"); |
|
Line 67 __KERNEL_RCSID(0, "$NetBSD$"); |
|
#include "opt_ffs.h" |
#include "opt_ffs.h" |
#include "opt_quota.h" |
#include "opt_quota.h" |
#include "opt_wapbl.h" |
#include "opt_wapbl.h" |
|
#include "opt_xip.h" |
#endif |
#endif |
|
|
#include <sys/param.h> |
#include <sys/param.h> |
Line 391 ffs_mount(struct mount *mp, const char * |
|
Line 392 ffs_mount(struct mount *mp, const char * |
|
accessmode |= VWRITE; |
accessmode |= VWRITE; |
vn_lock(devvp, LK_EXCLUSIVE | LK_RETRY); |
vn_lock(devvp, LK_EXCLUSIVE | LK_RETRY); |
error = genfs_can_mount(devvp, accessmode, l->l_cred); |
error = genfs_can_mount(devvp, accessmode, l->l_cred); |
VOP_UNLOCK(devvp, 0); |
VOP_UNLOCK(devvp); |
} |
} |
|
|
if (error) { |
if (error) { |
Line 422 ffs_mount(struct mount *mp, const char * |
|
Line 423 ffs_mount(struct mount *mp, const char * |
|
if (error) { |
if (error) { |
vn_lock(devvp, LK_EXCLUSIVE | LK_RETRY); |
vn_lock(devvp, LK_EXCLUSIVE | LK_RETRY); |
(void)VOP_CLOSE(devvp, xflags, NOCRED); |
(void)VOP_CLOSE(devvp, xflags, NOCRED); |
VOP_UNLOCK(devvp, 0); |
VOP_UNLOCK(devvp); |
goto fail; |
goto fail; |
} |
} |
|
|
Line 599 ffs_reload(struct mount *mp, kauth_cred_ |
|
Line 600 ffs_reload(struct mount *mp, kauth_cred_ |
|
devvp = ump->um_devvp; |
devvp = ump->um_devvp; |
vn_lock(devvp, LK_EXCLUSIVE | LK_RETRY); |
vn_lock(devvp, LK_EXCLUSIVE | LK_RETRY); |
error = vinvalbuf(devvp, 0, cred, l, 0, 0); |
error = vinvalbuf(devvp, 0, cred, l, 0, 0); |
VOP_UNLOCK(devvp, 0); |
VOP_UNLOCK(devvp); |
if (error) |
if (error) |
panic("ffs_reload: dirty1"); |
panic("ffs_reload: dirty1"); |
/* |
/* |
Line 774 ffs_reload(struct mount *mp, kauth_cred_ |
|
Line 775 ffs_reload(struct mount *mp, kauth_cred_ |
|
*/ |
*/ |
mutex_enter(&vp->v_interlock); |
mutex_enter(&vp->v_interlock); |
mutex_exit(&mntvnode_lock); |
mutex_exit(&mntvnode_lock); |
if (vget(vp, LK_EXCLUSIVE | LK_INTERLOCK)) { |
if (vget(vp, LK_EXCLUSIVE)) { |
(void)vunmark(mvp); |
(void)vunmark(mvp); |
goto loop; |
goto loop; |
} |
} |
Line 822 ffs_mountfs(struct vnode *devvp, struct |
|
Line 823 ffs_mountfs(struct vnode *devvp, struct |
|
daddr_t sblockloc, fsblockloc; |
daddr_t sblockloc, fsblockloc; |
int blks, fstype; |
int blks, fstype; |
int error, i, bsize, ronly, bset = 0; |
int error, i, bsize, ronly, bset = 0; |
uint64_t numsecs; |
|
unsigned secsize; |
|
#ifdef FFS_EI |
#ifdef FFS_EI |
int needswap = 0; /* keep gcc happy */ |
int needswap = 0; /* keep gcc happy */ |
#endif |
#endif |
int32_t *lp; |
int32_t *lp; |
kauth_cred_t cred; |
kauth_cred_t cred; |
u_int32_t sbsize = 8192; /* keep gcc happy*/ |
u_int32_t sbsize = 8192; /* keep gcc happy*/ |
|
int32_t fsbsize; |
|
|
dev = devvp->v_rdev; |
dev = devvp->v_rdev; |
cred = l ? l->l_cred : NOCRED; |
cred = l ? l->l_cred : NOCRED; |
Line 837 ffs_mountfs(struct vnode *devvp, struct |
|
Line 837 ffs_mountfs(struct vnode *devvp, struct |
|
/* Flush out any old buffers remaining from a previous use. */ |
/* Flush out any old buffers remaining from a previous use. */ |
vn_lock(devvp, LK_EXCLUSIVE | LK_RETRY); |
vn_lock(devvp, LK_EXCLUSIVE | LK_RETRY); |
error = vinvalbuf(devvp, V_SAVE, cred, l, 0, 0); |
error = vinvalbuf(devvp, V_SAVE, cred, l, 0, 0); |
VOP_UNLOCK(devvp, 0); |
VOP_UNLOCK(devvp); |
if (error) |
if (error) |
return (error); |
return (error); |
|
|
ronly = (mp->mnt_flag & MNT_RDONLY) != 0; |
ronly = (mp->mnt_flag & MNT_RDONLY) != 0; |
error = getdisksize(devvp, &numsecs, &secsize); |
|
if (error) |
|
return (error); |
|
|
|
bp = NULL; |
bp = NULL; |
ump = NULL; |
ump = NULL; |
Line 891 ffs_mountfs(struct vnode *devvp, struct |
|
Line 888 ffs_mountfs(struct vnode *devvp, struct |
|
if (fs->fs_magic == FS_UFS1_MAGIC) { |
if (fs->fs_magic == FS_UFS1_MAGIC) { |
sbsize = fs->fs_sbsize; |
sbsize = fs->fs_sbsize; |
fstype = UFS1; |
fstype = UFS1; |
|
fsbsize = fs->fs_bsize; |
#ifdef FFS_EI |
#ifdef FFS_EI |
needswap = 0; |
needswap = 0; |
} else if (fs->fs_magic == bswap32(FS_UFS1_MAGIC)) { |
} else if (fs->fs_magic == bswap32(FS_UFS1_MAGIC)) { |
sbsize = bswap32(fs->fs_sbsize); |
sbsize = bswap32(fs->fs_sbsize); |
fstype = UFS1; |
fstype = UFS1; |
|
fsbsize = bswap32(fs->fs_bsize); |
needswap = 1; |
needswap = 1; |
#endif |
#endif |
} else if (fs->fs_magic == FS_UFS2_MAGIC) { |
} else if (fs->fs_magic == FS_UFS2_MAGIC) { |
sbsize = fs->fs_sbsize; |
sbsize = fs->fs_sbsize; |
fstype = UFS2; |
fstype = UFS2; |
|
fsbsize = fs->fs_bsize; |
#ifdef FFS_EI |
#ifdef FFS_EI |
needswap = 0; |
needswap = 0; |
} else if (fs->fs_magic == bswap32(FS_UFS2_MAGIC)) { |
} else if (fs->fs_magic == bswap32(FS_UFS2_MAGIC)) { |
sbsize = bswap32(fs->fs_sbsize); |
sbsize = bswap32(fs->fs_sbsize); |
fstype = UFS2; |
fstype = UFS2; |
|
fsbsize = bswap32(fs->fs_bsize); |
needswap = 1; |
needswap = 1; |
#endif |
#endif |
} else |
} else |
Line 938 ffs_mountfs(struct vnode *devvp, struct |
|
Line 939 ffs_mountfs(struct vnode *devvp, struct |
|
if (sbsize > MAXBSIZE || sbsize < sizeof(struct fs)) |
if (sbsize > MAXBSIZE || sbsize < sizeof(struct fs)) |
continue; |
continue; |
|
|
|
/* Check that we can handle the file system blocksize */ |
|
if (fsbsize > MAXBSIZE) { |
|
printf("ffs_mountfs: block size (%d) > MAXBSIZE (%d)\n", |
|
fsbsize, MAXBSIZE); |
|
continue; |
|
} |
|
|
/* Ok seems to be a good superblock */ |
/* Ok seems to be a good superblock */ |
break; |
break; |
} |
} |
Line 1173 ffs_mountfs(struct vnode *devvp, struct |
|
Line 1181 ffs_mountfs(struct vnode *devvp, struct |
|
mp->mnt_dev_bshift = DEV_BSHIFT; /* XXX */ |
mp->mnt_dev_bshift = DEV_BSHIFT; /* XXX */ |
mp->mnt_flag |= MNT_LOCAL; |
mp->mnt_flag |= MNT_LOCAL; |
mp->mnt_iflag |= IMNT_MPSAFE; |
mp->mnt_iflag |= IMNT_MPSAFE; |
|
#ifdef XIP |
|
if ((mp->mnt_flag & MNT_RDONLY) == 0) |
|
printf("XIP needs read-only mount\n"); |
|
else { |
|
void *physseg = NULL; |
|
|
|
if ((VOP_IOCTL(devvp, DIOCGPHYSSEG, &physseg, FREAD, |
|
cred) == 0) && |
|
physseg != NULL) { |
|
mp->mnt_iflag |= IMNT_XIP; |
|
devvp->v_physseg = physseg; |
|
} else |
|
printf("device doesn't support DIOCGPHYSSEG\n"); |
|
} |
|
#endif |
#ifdef FFS_EI |
#ifdef FFS_EI |
if (needswap) |
if (needswap) |
ump->um_flags |= UFS_NEEDSWAP; |
ump->um_flags |= UFS_NEEDSWAP; |
Line 1475 ffs_flushfiles(struct mount *mp, int fla |
|
Line 1498 ffs_flushfiles(struct mount *mp, int fla |
|
*/ |
*/ |
vn_lock(ump->um_devvp, LK_EXCLUSIVE | LK_RETRY); |
vn_lock(ump->um_devvp, LK_EXCLUSIVE | LK_RETRY); |
error = VOP_FSYNC(ump->um_devvp, l->l_cred, FSYNC_WAIT, 0, 0); |
error = VOP_FSYNC(ump->um_devvp, l->l_cred, FSYNC_WAIT, 0, 0); |
VOP_UNLOCK(ump->um_devvp, 0); |
VOP_UNLOCK(ump->um_devvp); |
if (flags & FORCECLOSE) /* XXXDBJ */ |
if (flags & FORCECLOSE) /* XXXDBJ */ |
error = 0; |
error = 0; |
|
|
Line 1560 ffs_sync(struct mount *mp, int waitfor, |
|
Line 1583 ffs_sync(struct mount *mp, int waitfor, |
|
* threads waiting on fstrans may have locked vnodes. |
* threads waiting on fstrans may have locked vnodes. |
*/ |
*/ |
if (is_suspending) |
if (is_suspending) |
lk_flags = LK_INTERLOCK; |
lk_flags = 0; |
else |
else |
lk_flags = LK_EXCLUSIVE | LK_NOWAIT | LK_INTERLOCK; |
lk_flags = LK_EXCLUSIVE | LK_NOWAIT; |
/* |
/* |
* Write back each (modified) inode. |
* Write back each (modified) inode. |
*/ |
*/ |
|
|
(waitfor == MNT_WAIT ? FSYNC_WAIT : 0) | FSYNC_NOLOG, |
(waitfor == MNT_WAIT ? FSYNC_WAIT : 0) | FSYNC_NOLOG, |
0, 0)) != 0) |
0, 0)) != 0) |
allerror = error; |
allerror = error; |
VOP_UNLOCK(ump->um_devvp, 0); |
VOP_UNLOCK(ump->um_devvp); |
if (allerror == 0 && waitfor == MNT_WAIT && !mp->mnt_wapbl) { |
if (allerror == 0 && waitfor == MNT_WAIT && !mp->mnt_wapbl) { |
mutex_enter(&mntvnode_lock); |
mutex_enter(&mntvnode_lock); |
goto loop; |
goto loop; |
Line 1748 ffs_vget(struct mount *mp, ino_t ino, st |
|
Line 1771 ffs_vget(struct mount *mp, ino_t ino, st |
|
|
|
vp->v_vflag |= VV_LOCKSWORK; |
vp->v_vflag |= VV_LOCKSWORK; |
|
|
|
#ifdef XIP |
|
if ((vp->v_mount->mnt_iflag & IMNT_XIP) != 0) { |
|
vp->v_vflag |= VV_XIP; |
|
} |
|
#endif |
|
|
/* |
/* |
* XXX MFS ends up here, too, to allocate an inode. Should we |
* XXX MFS ends up here, too, to allocate an inode. Should we |
* XXX create another pool for MFS inodes? |
* XXX create another pool for MFS inodes? |