Changeset View
Changeset View
Standalone View
Standalone View
head/sys/ufs/ffs/ffs_vnops.c
Show First 20 Lines • Show All 107 Lines • ▼ Show 20 Lines | |||||
#ifdef DIRECTIO | #ifdef DIRECTIO | ||||
extern int ffs_rawread(struct vnode *vp, struct uio *uio, int *workdone); | extern int ffs_rawread(struct vnode *vp, struct uio *uio, int *workdone); | ||||
#endif | #endif | ||||
static vop_fdatasync_t ffs_fdatasync; | static vop_fdatasync_t ffs_fdatasync; | ||||
static vop_fsync_t ffs_fsync; | static vop_fsync_t ffs_fsync; | ||||
static vop_getpages_t ffs_getpages; | static vop_getpages_t ffs_getpages; | ||||
static vop_getpages_async_t ffs_getpages_async; | static vop_getpages_async_t ffs_getpages_async; | ||||
static vop_lock1_t ffs_lock; | static vop_lock1_t ffs_lock; | ||||
#ifdef INVARIANTS | |||||
static vop_unlock_t ffs_unlock_debug; | |||||
#endif | |||||
static vop_read_t ffs_read; | static vop_read_t ffs_read; | ||||
static vop_write_t ffs_write; | static vop_write_t ffs_write; | ||||
static int ffs_extread(struct vnode *vp, struct uio *uio, int ioflag); | static int ffs_extread(struct vnode *vp, struct uio *uio, int ioflag); | ||||
static int ffs_extwrite(struct vnode *vp, struct uio *uio, int ioflag, | static int ffs_extwrite(struct vnode *vp, struct uio *uio, int ioflag, | ||||
struct ucred *cred); | struct ucred *cred); | ||||
static vop_strategy_t ffsext_strategy; | static vop_strategy_t ffsext_strategy; | ||||
static vop_closeextattr_t ffs_closeextattr; | static vop_closeextattr_t ffs_closeextattr; | ||||
static vop_deleteextattr_t ffs_deleteextattr; | static vop_deleteextattr_t ffs_deleteextattr; | ||||
static vop_getextattr_t ffs_getextattr; | static vop_getextattr_t ffs_getextattr; | ||||
static vop_listextattr_t ffs_listextattr; | static vop_listextattr_t ffs_listextattr; | ||||
static vop_openextattr_t ffs_openextattr; | static vop_openextattr_t ffs_openextattr; | ||||
static vop_setextattr_t ffs_setextattr; | static vop_setextattr_t ffs_setextattr; | ||||
static vop_vptofh_t ffs_vptofh; | static vop_vptofh_t ffs_vptofh; | ||||
/* Global vfs data structures for ufs. */ | /* Global vfs data structures for ufs. */ | ||||
struct vop_vector ffs_vnodeops1 = { | struct vop_vector ffs_vnodeops1 = { | ||||
.vop_default = &ufs_vnodeops, | .vop_default = &ufs_vnodeops, | ||||
.vop_fsync = ffs_fsync, | .vop_fsync = ffs_fsync, | ||||
.vop_fdatasync = ffs_fdatasync, | .vop_fdatasync = ffs_fdatasync, | ||||
.vop_getpages = ffs_getpages, | .vop_getpages = ffs_getpages, | ||||
.vop_getpages_async = ffs_getpages_async, | .vop_getpages_async = ffs_getpages_async, | ||||
.vop_lock1 = ffs_lock, | .vop_lock1 = ffs_lock, | ||||
#ifdef INVARIANTS | |||||
.vop_unlock = ffs_unlock_debug, | |||||
#endif | |||||
.vop_read = ffs_read, | .vop_read = ffs_read, | ||||
.vop_reallocblks = ffs_reallocblks, | .vop_reallocblks = ffs_reallocblks, | ||||
.vop_write = ffs_write, | .vop_write = ffs_write, | ||||
.vop_vptofh = ffs_vptofh, | .vop_vptofh = ffs_vptofh, | ||||
}; | }; | ||||
VFS_VOP_VECTOR_REGISTER(ffs_vnodeops1); | VFS_VOP_VECTOR_REGISTER(ffs_vnodeops1); | ||||
struct vop_vector ffs_fifoops1 = { | struct vop_vector ffs_fifoops1 = { | ||||
.vop_default = &ufs_fifoops, | .vop_default = &ufs_fifoops, | ||||
.vop_fsync = ffs_fsync, | .vop_fsync = ffs_fsync, | ||||
.vop_fdatasync = ffs_fdatasync, | .vop_fdatasync = ffs_fdatasync, | ||||
.vop_lock1 = ffs_lock, | .vop_lock1 = ffs_lock, | ||||
#ifdef INVARIANTS | |||||
.vop_unlock = ffs_unlock_debug, | |||||
#endif | |||||
.vop_vptofh = ffs_vptofh, | .vop_vptofh = ffs_vptofh, | ||||
}; | }; | ||||
VFS_VOP_VECTOR_REGISTER(ffs_fifoops1); | VFS_VOP_VECTOR_REGISTER(ffs_fifoops1); | ||||
/* Global vfs data structures for ufs. */ | /* Global vfs data structures for ufs. */ | ||||
struct vop_vector ffs_vnodeops2 = { | struct vop_vector ffs_vnodeops2 = { | ||||
.vop_default = &ufs_vnodeops, | .vop_default = &ufs_vnodeops, | ||||
.vop_fsync = ffs_fsync, | .vop_fsync = ffs_fsync, | ||||
.vop_fdatasync = ffs_fdatasync, | .vop_fdatasync = ffs_fdatasync, | ||||
.vop_getpages = ffs_getpages, | .vop_getpages = ffs_getpages, | ||||
.vop_getpages_async = ffs_getpages_async, | .vop_getpages_async = ffs_getpages_async, | ||||
.vop_lock1 = ffs_lock, | .vop_lock1 = ffs_lock, | ||||
#ifdef INVARIANTS | |||||
.vop_unlock = ffs_unlock_debug, | |||||
#endif | |||||
.vop_read = ffs_read, | .vop_read = ffs_read, | ||||
.vop_reallocblks = ffs_reallocblks, | .vop_reallocblks = ffs_reallocblks, | ||||
.vop_write = ffs_write, | .vop_write = ffs_write, | ||||
.vop_closeextattr = ffs_closeextattr, | .vop_closeextattr = ffs_closeextattr, | ||||
.vop_deleteextattr = ffs_deleteextattr, | .vop_deleteextattr = ffs_deleteextattr, | ||||
.vop_getextattr = ffs_getextattr, | .vop_getextattr = ffs_getextattr, | ||||
.vop_listextattr = ffs_listextattr, | .vop_listextattr = ffs_listextattr, | ||||
.vop_openextattr = ffs_openextattr, | .vop_openextattr = ffs_openextattr, | ||||
.vop_setextattr = ffs_setextattr, | .vop_setextattr = ffs_setextattr, | ||||
.vop_vptofh = ffs_vptofh, | .vop_vptofh = ffs_vptofh, | ||||
}; | }; | ||||
VFS_VOP_VECTOR_REGISTER(ffs_vnodeops2); | VFS_VOP_VECTOR_REGISTER(ffs_vnodeops2); | ||||
struct vop_vector ffs_fifoops2 = { | struct vop_vector ffs_fifoops2 = { | ||||
.vop_default = &ufs_fifoops, | .vop_default = &ufs_fifoops, | ||||
.vop_fsync = ffs_fsync, | .vop_fsync = ffs_fsync, | ||||
.vop_fdatasync = ffs_fdatasync, | .vop_fdatasync = ffs_fdatasync, | ||||
.vop_lock1 = ffs_lock, | .vop_lock1 = ffs_lock, | ||||
#ifdef INVARIANTS | |||||
.vop_unlock = ffs_unlock_debug, | |||||
#endif | |||||
.vop_reallocblks = ffs_reallocblks, | .vop_reallocblks = ffs_reallocblks, | ||||
.vop_strategy = ffsext_strategy, | .vop_strategy = ffsext_strategy, | ||||
.vop_closeextattr = ffs_closeextattr, | .vop_closeextattr = ffs_closeextattr, | ||||
.vop_deleteextattr = ffs_deleteextattr, | .vop_deleteextattr = ffs_deleteextattr, | ||||
.vop_getextattr = ffs_getextattr, | .vop_getextattr = ffs_getextattr, | ||||
.vop_listextattr = ffs_listextattr, | .vop_listextattr = ffs_listextattr, | ||||
.vop_openextattr = ffs_openextattr, | .vop_openextattr = ffs_openextattr, | ||||
.vop_setextattr = ffs_setextattr, | .vop_setextattr = ffs_setextattr, | ||||
▲ Show 20 Lines • Show All 270 Lines • ▼ Show 20 Lines | default: | ||||
result = VOP_LOCK1_APV(&ufs_vnodeops, ap); | result = VOP_LOCK1_APV(&ufs_vnodeops, ap); | ||||
} | } | ||||
return (result); | return (result); | ||||
#else | #else | ||||
return (VOP_LOCK1_APV(&ufs_vnodeops, ap)); | return (VOP_LOCK1_APV(&ufs_vnodeops, ap)); | ||||
#endif | #endif | ||||
} | } | ||||
#ifdef INVARIANTS | |||||
static int | static int | ||||
ffs_unlock_debug(struct vop_unlock_args *ap) | |||||
{ | |||||
struct vnode *vp = ap->a_vp; | |||||
struct inode *ip = VTOI(vp); | |||||
if (ip->i_flag & UFS_INODE_FLAG_LAZY_MASK) { | |||||
if ((vp->v_mflag & VMP_LAZYLIST) == 0) { | |||||
VI_LOCK(vp); | |||||
VNASSERT((vp->v_mflag & VMP_LAZYLIST), vp, | |||||
("%s: modified vnode (%x) not on lazy list", | |||||
__func__, ip->i_flag)); | |||||
VI_UNLOCK(vp); | |||||
} | |||||
} | |||||
return (VOP_UNLOCK_APV(&ufs_vnodeops, ap)); | |||||
} | |||||
#endif | |||||
static int | |||||
ffs_read_hole(struct uio *uio, long xfersize, long *size) | ffs_read_hole(struct uio *uio, long xfersize, long *size) | ||||
{ | { | ||||
ssize_t saved_resid, tlen; | ssize_t saved_resid, tlen; | ||||
int error; | int error; | ||||
while (xfersize > 0) { | while (xfersize > 0) { | ||||
tlen = min(xfersize, ZERO_REGION_SIZE); | tlen = min(xfersize, ZERO_REGION_SIZE); | ||||
saved_resid = uio->uio_resid; | saved_resid = uio->uio_resid; | ||||
▲ Show 20 Lines • Show All 185 Lines • ▼ Show 20 Lines | #endif | ||||
* because the loop above resets bp to NULL on each iteration | * because the loop above resets bp to NULL on each iteration | ||||
* and on normal completion has not set a new value into it. | * and on normal completion has not set a new value into it. | ||||
* so it must have come from a 'break' statement | * so it must have come from a 'break' statement | ||||
*/ | */ | ||||
if (bp != NULL) | if (bp != NULL) | ||||
vfs_bio_brelse(bp, ioflag); | vfs_bio_brelse(bp, ioflag); | ||||
if ((error == 0 || uio->uio_resid != orig_resid) && | if ((error == 0 || uio->uio_resid != orig_resid) && | ||||
(vp->v_mount->mnt_flag & (MNT_NOATIME | MNT_RDONLY)) == 0 && | (vp->v_mount->mnt_flag & (MNT_NOATIME | MNT_RDONLY)) == 0) | ||||
(ip->i_flag & IN_ACCESS) == 0) { | UFS_INODE_SET_FLAG_SHARED(ip, IN_ACCESS); | ||||
VI_LOCK(vp); | |||||
UFS_INODE_SET_FLAG(ip, IN_ACCESS); | |||||
VI_UNLOCK(vp); | |||||
} | |||||
return (error); | return (error); | ||||
} | } | ||||
/* | /* | ||||
* Vnode op for writing. | * Vnode op for writing. | ||||
*/ | */ | ||||
static int | static int | ||||
ffs_write(ap) | ffs_write(ap) | ||||
▲ Show 20 Lines • Show All 1,090 Lines • Show Last 20 Lines |