]> granicus.if.org Git - zfs/commitdiff
Add VOP_SEEK
authorBrian Behlendorf <behlendorf1@llnl.gov>
Fri, 9 Jan 2009 21:59:39 +0000 (13:59 -0800)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Fri, 9 Jan 2009 21:59:39 +0000 (13:59 -0800)
include/sys/vnode.h
modules/spl/spl-vnode.c

index 8b7aefee08413ecc25ffe28608ac73c37e5a7c72..7972f654822f0a53f36fca9e08f7c1c72eafd28d 100644 (file)
@@ -207,6 +207,8 @@ extern int vn_rdwr(uio_rw_t uio, vnode_t *vp, void *addr, ssize_t len,
                   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);
@@ -230,6 +232,7 @@ vn_putpage(vnode_t *vp, offset_t off, ssize_t size,
 } /* 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
index fef74f3c7a209d2abdd0b2c90c0ef56a59c4489a..b19d9f1de35cff05519248c92d289db2eafa1006 100644 (file)
@@ -235,19 +235,31 @@ vn_close(vnode_t *vp, int flags, int x1, int x2, void *x3, void *x4)
        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);