]> Zhao Yanbai Git Server - minix.git/commitdiff
Properly unlock on mount failure
authorThomas Veerman <thomas@minix3.org>
Fri, 9 Dec 2011 15:47:42 +0000 (15:47 +0000)
committerThomas Veerman <thomas@minix3.org>
Fri, 9 Dec 2011 15:47:42 +0000 (15:47 +0000)
servers/avfs/mount.c

index f8457a2d4c64ecefb786a5318d85b6075cf815d4..36853ccbdbcaa9deec4957f885c989853cbb4a29 100644 (file)
@@ -237,20 +237,27 @@ char mount_label[LABEL_MAX] )
        }
   }
 
-/* XXX: move this upwards before lookup after proper locking. */
   /* We'll need a vnode for the root inode */
   if ((root_node = get_free_vnode()) == NULL || dev == 266) {
-       unlock_vnode(vp);
+       if (vp != NULL) {
+               unlock_vnode(vp);
+               put_vnode(vp);
+       }
        unlock_vmnt(new_vmp);
-       put_vnode(vp);
        return(err_code);
   }
-
   lock_vnode(root_node, VNODE_OPCL);
 
   /* Record process as a system process */
-  if (isokendpt(fs_e, &slot) != OK)
+  if (isokendpt(fs_e, &slot) != OK) {
+       if (vp != NULL) {
+               unlock_vnode(vp);
+               put_vnode(vp);
+       }
+       unlock_vnode(root_node);
+       unlock_vmnt(new_vmp);
        return(EINVAL);
+  }
   rfp = &fproc[slot];
   rfp->fp_flags |= FP_SYS_PROC;        /* Process is an FS */
 
@@ -269,9 +276,11 @@ char mount_label[LABEL_MAX] )
        new_vmp->m_fs_e = NONE;
        new_vmp->m_dev = NO_DEV;
        unlock_vnode(root_node);
-       unlock_vnode(vp);
+       if (vp != NULL) {
+               unlock_vnode(vp);
+               put_vnode(vp);
+       }
        unlock_vmnt(new_vmp);
-       put_vnode(vp);
        return(r);
   }