libafs: fix lock leak during shutdown
[openafs.git] / src / afs / VNOPS / afs_vnop_attrs.c
index ef3f774..c25e90d 100644 (file)
@@ -54,8 +54,8 @@ afs_CopyOutAttrs(struct vcache *avc, struct vattr *attrs)
     if (afs_fakestat_enable && avc->mvstat == 1)
        fakedir = 1;
     attrs->va_type = fakedir ? VDIR : vType(avc);
-#if defined(AFS_SGI_ENV) || defined(AFS_AIX32_ENV) || defined(AFS_SUN5_ENV)
-    attrs->va_mode = fakedir ? 0755 : (mode_t) (avc->f.m.Mode & 0xffff);
+#if defined(AFS_SGI_ENV) || defined(AFS_AIX32_ENV) || defined(AFS_SUN5_ENV) || defined(AFS_DARWIN_ENV)
+    attrs->va_mode = fakedir ? S_IFDIR | 0755 : (mode_t) (avc->f.m.Mode & 0xffff);
 #else
     attrs->va_mode = fakedir ? VDIR | 0755 : avc->f.m.Mode;
 #endif
@@ -239,8 +239,13 @@ afs_getattr(OSI_VC_DECL(avc), struct vattr *attrs, afs_ucred_t *acred)
     afs_BozonLock(&avc->pvnLock, avc);
 #endif
 
-    if (afs_shuttingdown)
+    if (afs_shuttingdown) {
+#ifdef AFS_BOZONLOCK_ENV
+       afs_BozonUnlock(&avc->pvnLock, avc);
+#endif
+       AFS_DISCON_UNLOCK();
        return EIO;
+    }
 
     if (!(avc->f.states & CStatd)) {
        if (!(code = afs_InitReq(&treq, acred))) {