OpenBSD: Replace "vnodeop_desc" with "vops" in kernel module.
authorAntoine Verheijen <antoine@ualberta.ca>
Mon, 21 Jan 2013 09:30:58 +0000 (02:30 -0700)
committerDerrick Brashear <shadow@your-file-system.com>
Wed, 13 Mar 2013 14:31:34 +0000 (07:31 -0700)
In OpenBSD 4.9, the vnode operations vector in the "vnode" struct
was changed from using a "vnodeop_desc" struct to a new "vops"
struct. This patch makes the appropriate changes to the OpenBSD
kernel module support to accommodate the change.

Change-Id: Ib47259e1213e29658a691ce3a53d7ac88e8d746b
Reviewed-on: http://gerrit.openafs.org/8928
Reviewed-by: Derrick Brashear <shadow@your-file-system.com>
Tested-by: BuildBot <buildbot@rampaginggeek.com>

src/afs/OBSD/osi_machdep.h
src/afs/OBSD/osi_vfsops.c
src/afs/OBSD/osi_vnodeops.c

index c0599f2..0b1e901 100644 (file)
@@ -230,11 +230,16 @@ extern struct lock afs_global_lock;
     } while (0)
 
 /* vnodes */
+#if defined(AFS_OBSD49_ENV)
+extern struct vops afs_vops;
+#define IsAfsVnode(v)      ((v)->v_op == &afs_vops)
+#else
 extern int (**afs_vnodeop_p) ();
+#define IsAfsVnode(v)      ((v)->v_op == afs_vnodeop_p)
+#endif
 #define vType(vc)               AFSTOV(vc)->v_type
 #define vSetVfsp(vc, vfsp)      AFSTOV(vc)->v_mount = (vfsp)
 #define vSetType(vc, type)      AFSTOV(vc)->v_type = (type)
-#define IsAfsVnode(v)      ((v)->v_op == afs_vnodeop_p)
 #define SetAfsVnode(v)     /* nothing; done in getnewvnode() */
 
 #define osi_procname(procname, size) strncpy(procname, curproc->p_comm, size)
index d4ab1f6..7b4125f 100644 (file)
@@ -309,10 +309,18 @@ afs_badcall(struct proc *p, void *xx, register_t * yy)
     return ENOSYS;
 }
 
+#if defined(AFS_OBSD49_ENV)
+extern struct vops afs_vops;
+#endif
+
 void
 afs_obsd_getnewvnode(struct vcache *tvc)
 {
+#if defined(AFS_OBSD49_ENV)
+    while (getnewvnode(VT_AFS, afs_globalVFS, &afs_vops, &tvc->v)) {
+#else
     while (getnewvnode(VT_AFS, afs_globalVFS, afs_vnodeop_p, &tvc->v)) {
+#endif
        /* no vnodes available, force an alloc (limits be damned)! */
        desiredvnodes++;
     }
@@ -441,8 +449,10 @@ afs_vfs_load(struct lkm_table *lkmtp, int cmd)
 {
     extern char *memname[];
 
+#if ! defined(AFS_OBSD49_ENV)
     vfs_opv_init_explicit(&afs_vnodeop_opv_desc);
     vfs_opv_init_default(&afs_vnodeop_opv_desc);
+#endif
     if (memname[M_AFSGENERIC] == NULL)
        memname[M_AFSGENERIC] = afsgenmem;
     if (memname[M_AFSFID] == NULL)
index a3f572e..d3b85fd 100644 (file)
@@ -151,6 +151,46 @@ int afs_obsd_advlock(void *);
        ((int (*) __P((void *)))eopnotsupp)
 #define afs_obsd_reallocblks afs_obsd_opnotsupp
 
+#if defined(AFS_OBSD49_ENV)
+
+struct vops afs_vops = {
+       .vop_lookup     = afs_obsd_lookup,
+       .vop_create     = afs_obsd_create,
+       .vop_mknod      = afs_obsd_mknod,
+       .vop_open       = afs_obsd_open,
+       .vop_close      = afs_obsd_close,
+       .vop_access     = afs_obsd_access,
+       .vop_getattr    = afs_obsd_getattr,
+       .vop_setattr    = afs_obsd_setattr,
+       .vop_read       = afs_obsd_read,
+       .vop_write      = afs_obsd_write,
+       .vop_ioctl      = afs_obsd_ioctl,
+       .vop_poll       = afs_obsd_select,
+       .vop_fsync      = afs_obsd_fsync,
+       .vop_remove     = afs_obsd_remove,
+       .vop_link       = afs_obsd_link,
+       .vop_rename     = afs_obsd_rename,
+       .vop_mkdir      = afs_obsd_mkdir,
+       .vop_rmdir      = afs_obsd_rmdir,
+       .vop_symlink    = afs_obsd_symlink,
+       .vop_readdir    = afs_obsd_readdir,
+       .vop_readlink   = afs_obsd_readlink,
+       .vop_abortop    = vop_generic_abortop,
+       .vop_inactive   = afs_obsd_inactive,
+       .vop_reclaim    = afs_obsd_reclaim,
+       .vop_lock       = afs_obsd_lock,
+       .vop_unlock     = afs_obsd_unlock,
+       .vop_bmap       = afs_obsd_bmap,
+       .vop_strategy   = afs_obsd_strategy,
+       .vop_print      = afs_obsd_print,
+       .vop_islocked   = afs_obsd_islocked,
+       .vop_pathconf   = afs_obsd_pathconf,
+       .vop_advlock    = afs_obsd_advlock,
+       .vop_bwrite     = vop_generic_bwrite,
+};
+
+#else
+
 /* Global vfs data structures for AFS. */
 int (**afs_vnodeop_p) __P((void *));
 struct vnodeopv_entry_desc afs_vnodeop_entries[] = {
@@ -202,6 +242,8 @@ struct vnodeopv_entry_desc afs_vnodeop_entries[] = {
 struct vnodeopv_desc afs_vnodeop_opv_desc =
     { &afs_vnodeop_p, afs_vnodeop_entries };
 
+#endif
+
 #define GETNAME()      \
     struct componentname *cnp = ap->a_cnp; \
     char *name; \
@@ -676,7 +718,11 @@ afs_obsd_rename(void *v)
        if ((fcnp->cn_flags & SAVESTART) == 0)
            panic("afs_rename: lost from startdir");
        fcnp->cn_nameiop = DELETE;
+#if defined(AFS_OBSD49_ENV)
+       (void)vfs_relookup(fdvp, &fvp, fcnp);
+#else
        (void)relookup(fdvp, &fvp, fcnp);
+#endif
        return (VOP_REMOVE(fdvp, fvp, fcnp));
     }