offset_t off, uio_seg_t seg, int x1, rlim64_t x2,
void *x3, ssize_t *residp);
extern int vn_close(vnode_t *vp, int flags, int x1, int x2, void *x3, void *x4);
+extern int vn_seek(vnode_t *vp, offset_t o, offset_t *op, caller_context_t *ct);
+
extern int vn_remove(const char *path, uio_seg_t seg, int flags);
extern int vn_rename(const char *path1, const char *path2, int x1);
extern int vn_getattr(vnode_t *vp, vattr_t *vap, int flags, void *x3, void *x4);
} /* vn_putpage() */
#define VOP_CLOSE vn_close
+#define VOP_SEEK vn_seek
#define VN_RELE vn_rele
#define VOP_GETATTR vn_getattr
#define VOP_FSYNC vn_fsync
ASSERT(vp);
ASSERT(vp->v_file);
- rc = filp_close(vp->v_file, 0);
- vn_free(vp);
+ rc = filp_close(vp->v_file, 0);
+ vn_free(vp);
RETURN(-rc);
} /* vn_close() */
EXPORT_SYMBOL(vn_close);
-static struct dentry *vn_lookup_hash(struct nameidata *nd)
+/* vn_seek() does not actually seek it only performs bounds checking on the
+ * proposed seek. We perform minimal checking and allow vn_rdwr() to catch
+ * anything more serious. */
+int
+vn_seek(vnode_t *vp, offset_t ooff, offset_t *noffp, caller_context_t *ct)
+{
+ return ((*noffp < 0 || *noffp > MAXOFFSET_T) ? EINVAL : 0);
+}
+EXPORT_SYMBOL(vn_seek);
+
+static struct dentry *
+vn_lookup_hash(struct nameidata *nd)
{
return lookup_one_len(nd->last.name, nd->nd_dentry, nd->last.len);
} /* lookup_hash() */
-static void vn_path_release(struct nameidata *nd)
+static void
+vn_path_release(struct nameidata *nd)
{
dput(nd->nd_dentry);
mntput(nd->nd_mnt);