afs: alloc openafs_lck_grp before osi_Init() on darwin
[openafs.git] / src / afs / DARWIN / osi_module.c
index 3ed61f3..aa7785a 100644 (file)
@@ -5,14 +5,26 @@
 #include "afsincludes.h"
 
 #define MYBUNDLEID "org.openafs.filesystems.afs"
+extern struct vfsops afs_vfsops;
+
 #ifdef AFS_DARWIN80_ENV
 static vfstable_t afs_vfstable;
-static struct vfs_fsentry afs_vfsentry;
 extern struct vnodeopv_desc afs_vnodeop_opv_desc;
 extern struct vnodeopv_desc afs_dead_vnodeop_opv_desc;
 static struct vnodeopv_desc *afs_vnodeop_opv_desc_list[2] =
    { &afs_vnodeop_opv_desc, &afs_dead_vnodeop_opv_desc };
 
+struct vfs_fsentry afs_vfsentry = {
+  &afs_vfsops,
+  2,
+  afs_vnodeop_opv_desc_list,
+  0,
+  "afs",
+  VFS_TBLNOTYPENUM|VFS_TBLTHREADSAFE|VFS_TBL64BITREADY,
+  NULL,
+  NULL,
+};
+
 #include <sys/conf.h>
 #include <miscfs/devfs/devfs.h>
 #define seltrue eno_select
@@ -28,7 +40,6 @@ struct vfsconf afs_vfsconf;
 #endif
 #include <mach/kmod.h>
 
-extern struct vfsops afs_vfsops;
 extern struct mount *afs_globalVFS;
 extern int Afs_xsetgroups();
 
@@ -38,18 +49,15 @@ extern int maxvfsconf;
 kern_return_t
 afs_modload(struct kmod_info *kmod_info, void *data)
 {
-    osi_Init();
+    int ret;
 #ifdef AFS_DARWIN80_ENV
     MUTEX_SETUP();
+    osi_Init();
     afs_global_lock = lck_mtx_alloc_init(openafs_lck_grp, 0);
-    memset(&afs_vfsentry, 0, sizeof(struct vfs_fsentry));
-    strcpy(afs_vfsentry.vfe_fsname, "afs");
-    afs_vfsentry.vfe_vfsops = &afs_vfsops;
-    afs_vfsentry.vfe_vopcnt = 2;
-    afs_vfsentry.vfe_opvdescs = afs_vnodeop_opv_desc_list;
-    afs_vfsentry.vfe_flags = VFS_TBLTHREADSAFE|VFS_TBLNOTYPENUM|VFS_TBL64BITREADY;
-    if (vfs_fsadd(&afs_vfsentry, &afs_vfstable)) {
-       printf("AFS: vfs_fsadd failed. aborting\n");
+
+    if (ret = vfs_fsadd(&afs_vfsentry, &afs_vfstable)) {
+       afs_warn("AFS: vfs_fsadd failed. aborting: %d\n", ret);
+       afs_vfstable = NULL;
        goto fsadd_out;
     }
     afs_cdev.d_open = &afs_cdev_nop_openclose;
@@ -57,14 +65,14 @@ afs_modload(struct kmod_info *kmod_info, void *data)
     afs_cdev.d_ioctl = &afs_cdev_ioctl;
     afs_cdev_major = cdevsw_add(-1, &afs_cdev);
     if (afs_cdev_major == -1) {
-       printf("AFS: cdevsw_add failed. aborting\n");
+       afs_warn("AFS: cdevsw_add failed. aborting\n");
        goto cdevsw_out;
     }
     afs_cdev_devfs_handle = devfs_make_node(makedev(afs_cdev_major, 0),
                                             DEVFS_CHAR, UID_ROOT, GID_WHEEL,
                                             0666, "openafs_ioctl", 0);
     if (!afs_cdev_devfs_handle) {
-       printf("AFS: devfs_make_node failed. aborting\n");
+       afs_warn("AFS: devfs_make_node failed. aborting\n");
        cdevsw_remove(afs_cdev_major, &afs_cdev);
     cdevsw_out:
        vfs_fsremove(afs_vfstable);
@@ -74,17 +82,18 @@ afs_modload(struct kmod_info *kmod_info, void *data)
        return KERN_FAILURE;
     }
 #else
+    osi_Init();
     memset(&afs_vfsconf, 0, sizeof(struct vfsconf));
     strcpy(afs_vfsconf.vfc_name, "afs");
     afs_vfsconf.vfc_vfsops = &afs_vfsops;
     afs_vfsconf.vfc_typenum = maxvfsconf++;    /* oddly not VT_AFS */
     afs_vfsconf.vfc_flags = MNT_NODEV;
     if (vfsconf_add(&afs_vfsconf)) {
-       printf("AFS: vfsconf_add failed. aborting\n");
+       afs_warn("AFS: vfsconf_add failed. aborting\n");
        return KERN_FAILURE;
     }
     if (sysent[AFS_SYSCALL].sy_call != nosys) {
-       printf("AFS_SYSCALL in use. aborting\n");
+       afs_warn("AFS_SYSCALL in use. aborting\n");
        return KERN_FAILURE;
     }
     sysent[SYS_setgroups].sy_call = Afs_xsetgroups;
@@ -95,7 +104,7 @@ afs_modload(struct kmod_info *kmod_info, void *data)
     sysent[AFS_SYSCALL].sy_funnel = KERNEL_FUNNEL;
 #endif
 #endif
-    printf("%s kext loaded; %u pages at 0x%lx (load tag %u).\n",
+    afs_warn("%s kext loaded; %u pages at 0x%lx (load tag %u).\n",
           kmod_info->name, (unsigned)kmod_info->size / PAGE_SIZE,
           (unsigned long)kmod_info->address, (unsigned)kmod_info->id);
 
@@ -107,6 +116,8 @@ afs_modunload(struct kmod_info * kmod_info, void *data)
 {
     if (afs_globalVFS)
        return KERN_FAILURE;
+    if ((afs_initState != 0) || (afs_shuttingdown != AFS_RUNNING))
+       return KERN_FAILURE;
 #ifdef AFS_DARWIN80_ENV
     if (vfs_fsremove(afs_vfstable))
        return KERN_FAILURE;
@@ -125,7 +136,7 @@ afs_modunload(struct kmod_info * kmod_info, void *data)
     MUTEX_FINISH();
     lck_mtx_free(afs_global_lock, openafs_lck_grp);
 #endif
-    printf("%s kext unloaded; (load tag %u).\n",
+    afs_warn("%s kext unloaded; (load tag %u).\n",
           kmod_info->name, (unsigned)kmod_info->id);
     return KERN_SUCCESS;
 }