static int unionfs_seek(void *v) { struct vop_seek_args *ap = v; struct unionfs_node *unp; struct vnode *tvp; unp = VTOUNIONFS(ap->a_vp); tvp = (unp->un_uppervp != NULLVP ? unp->un_uppervp : unp->un_lowervp); return VOP_SEEK(tvp, ap->a_oldoff, ap->a_newoff, ap->a_cred); }
loff_t vnode_fop_llseek( FILE_T *file_p, loff_t offset, int origin ) { INODE_T *ip = file_p->f_dentry->d_inode; loff_t result; MOFFSET_T mresult; struct seek_ctx ctx; int err; ASSERT(MDKI_INOISMVFS(ip)); switch (origin) { case /* SEEK_SET */ 0: result = offset; break; case /* SEEK_CUR */ 1: result = offset + file_p->f_pos; break; case /* SEEK_END */ 2: result = offset + READ_I_SIZE(ip); break; default: #ifdef MVFS_DEBUG MDKI_VFS_LOG(VFS_LOG_INFO, "%s: invalid origin %d, ra=%p\n", __func__, origin, mdki_getmycaller()); #endif return -EINVAL; } ctx.filep = file_p; ctx.done = FALSE; ctx.offset = offset; ctx.origin = origin; mresult = result; err = VOP_SEEK(ITOV(ip), file_p->f_pos, &mresult, &ctx); err = mdki_errno_unix_to_linux(err); result = mresult; if (err) { ASSERT(err < 0); return err; } if (!ctx.done && result != file_p->f_pos) { file_p->f_pos = result; file_p->f_version = 0; /* See default_llseek() in fs/read_write.c */ } return result; }
int RUMP_VOP_SEEK(struct vnode *vp, off_t oldoff, off_t newoff, struct kauth_cred *cred) { int error; rump_schedule(); error = VOP_SEEK(vp, oldoff, newoff, cred); rump_unschedule(); return error; }
STATIC long long linvfs_file_lseek( struct file *file, loff_t offset, int origin) { struct inode *inode = file->f_dentry->d_inode; vnode_t *vp; struct vattr vattr; loff_t old_off = offset; int error; vp = LINVFS_GET_VP(inode); ASSERT(vp); switch (origin) { case 2: vattr.va_mask = AT_SIZE; VOP_GETATTR(vp, &vattr, 0, get_current_cred(), error); if (error) return -error; offset += vattr.va_size; break; case 1: offset += file->f_pos; } /* All for the sake of seeing if we are too big */ VOP_SEEK(vp, old_off, &offset, error); if (error) return -error; if (offset != file->f_pos) { file->f_pos = offset; file->f_version = ++event; file->f_reada = 0; } return offset; }
static int nm_seek(vnode_t *vp, offset_t ooff, offset_t *noffp, caller_context_t *ct) { return (VOP_SEEK(VTONM(vp)->nm_filevp, ooff, noffp, ct)); }