OpenBSD: allow for more graceful shutdown
authorAntoine Verheijen <antoine@ualberta.ca>
Mon, 8 Feb 2010 22:33:38 +0000 (15:33 -0700)
committerDerrick Brashear <shadow@dementia.org>
Tue, 9 Feb 2010 16:30:08 +0000 (08:30 -0800)
A shutdown or unmount of AFS on OpenBSD will invariably result in a kernel
panic. This is because the afs_unmount() routine does not (can not?) force
vnode releases if the vnode is still busy. However, it continues on
nonetheless and dies a horrible death a little later.

This update causes a return from afs_unmount() with EBUSY if all the vnodes
weren't released. This results in error messages on shutdown but the overall
process continues more reliably and reboots, for example, work.

There is likely a better solution to this but at least this is no worse than
a system crash and it doesn't require console (or power button) intervention
so it should do until I have the chance to explore further.

Change-Id: Ia70f83bda748ea3d0b81b341a292e83121446567
Reviewed-on: http://gerrit.openafs.org/1275
Reviewed-by: Derrick Brashear <shadow@dementia.org>
Tested-by: Derrick Brashear <shadow@dementia.org>

src/afs/OBSD/osi_vfsops.c

index 40baec0..69a5580 100644 (file)
@@ -268,6 +268,13 @@ afs_unmount(afsp, flags, p)
 {
     extern int sys_ioctl(), sys_setgroups();
 
+    struct vnode *vp;
+
+    for (vp = LIST_FIRST(&afsp->mnt_vnodelist); vp != NULL;
+       vp = LIST_NEXT(vp, v_mntvnodes)) {
+       if (vp->v_usecount) return EBUSY;
+    }
+
     AFS_STATCNT(afs_unmount);
 #ifdef AFS_DISCON_ENV
     give_up_cbs();