Module Name:    src
Committed By:   manu
Date:           Wed Nov 19 16:26:47 UTC 2014

Modified Files:
        src/sys/ufs/ufs: ufs_extattr.c

Log Message:
Fix uninitialized mutex usage

We use extended attribute mount mutex before testing if it had been
initialized, and as reported by Christos,  this caused panic with
LOCKDEBUG. Fix it by testing before using.


To generate a diff of this commit:
cvs rdiff -u -r1.45 -r1.46 src/sys/ufs/ufs/ufs_extattr.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/ufs/ufs/ufs_extattr.c
diff -u src/sys/ufs/ufs/ufs_extattr.c:1.45 src/sys/ufs/ufs/ufs_extattr.c:1.46
--- src/sys/ufs/ufs/ufs_extattr.c:1.45	Sat Nov 15 05:03:55 2014
+++ src/sys/ufs/ufs/ufs_extattr.c	Wed Nov 19 16:26:47 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: ufs_extattr.c,v 1.45 2014/11/15 05:03:55 manu Exp $	*/
+/*	$NetBSD: ufs_extattr.c,v 1.46 2014/11/19 16:26:47 manu Exp $	*/
 
 /*-
  * Copyright (c) 1999-2002 Robert N. M. Watson
@@ -48,7 +48,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ufs_extattr.c,v 1.45 2014/11/15 05:03:55 manu Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ufs_extattr.c,v 1.46 2014/11/19 16:26:47 manu Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_ffs.h"
@@ -1103,6 +1103,9 @@ vop_getextattr {
 	struct ufsmount *ump = VFSTOUFS(mp);
 	int error;
 
+	if (!(ump->um_extattr.uepm_flags & UFS_EXTATTR_UEPM_STARTED))
+		return (EOPNOTSUPP);
+
 	ufs_extattr_uepm_lock(ump);
 
 	error = ufs_extattr_get(ap->a_vp, ap->a_attrnamespace, ap->a_name,
@@ -1129,9 +1132,6 @@ ufs_extattr_get(struct vnode *vp, int at
 	size_t len, old_len;
 	int error = 0;
 
-	if (!(ump->um_extattr.uepm_flags & UFS_EXTATTR_UEPM_STARTED))
-		return (EOPNOTSUPP);
-
 	if (strlen(name) == 0)
 		return (EINVAL);
 
@@ -1221,6 +1221,9 @@ vop_listextattr {
 	struct ufsmount *ump = VFSTOUFS(mp);
 	int error;
 
+	if (!(ump->um_extattr.uepm_flags & UFS_EXTATTR_UEPM_STARTED))
+		return (EOPNOTSUPP);
+
 	ufs_extattr_uepm_lock(ump);
 
 	error = ufs_extattr_list(ap->a_vp, ap->a_attrnamespace,
@@ -1247,9 +1250,6 @@ ufs_extattr_list(struct vnode *vp, int a
 	size_t listsize = 0;
 	int error = 0;
 
-	if (!(ump->um_extattr.uepm_flags & UFS_EXTATTR_UEPM_STARTED))
-		return (EOPNOTSUPP);
-
 	/*
 	 * XXX: We can move this inside the loop and iterate on individual
 	 *	attributes.
@@ -1348,6 +1348,9 @@ vop_deleteextattr {
 	struct ufsmount *ump = VFSTOUFS(mp); 
 	int error;
 
+	if (!(ump->um_extattr.uepm_flags & UFS_EXTATTR_UEPM_STARTED))
+		return (EOPNOTSUPP);
+
 	ufs_extattr_uepm_lock(ump);
 
 	error = ufs_extattr_rm(ap->a_vp, ap->a_attrnamespace, ap->a_name,
@@ -1377,6 +1380,9 @@ vop_setextattr {
 	struct ufsmount *ump = VFSTOUFS(mp); 
 	int error;
 
+	if (!(ump->um_extattr.uepm_flags & UFS_EXTATTR_UEPM_STARTED))
+		return (EOPNOTSUPP);
+
 	ufs_extattr_uepm_lock(ump);
 
 	/*
@@ -1415,8 +1421,7 @@ ufs_extattr_set(struct vnode *vp, int at
 
 	if (vp->v_mount->mnt_flag & MNT_RDONLY)
 		return (EROFS);
-	if (!(ump->um_extattr.uepm_flags & UFS_EXTATTR_UEPM_STARTED))
-		return (EOPNOTSUPP);
+
 	if (!ufs_extattr_valid_attrname(attrnamespace, name))
 		return (EINVAL);
 
@@ -1535,8 +1540,7 @@ ufs_extattr_rm(struct vnode *vp, int att
 
 	if (vp->v_mount->mnt_flag & MNT_RDONLY)  
 		return (EROFS);
-	if (!(ump->um_extattr.uepm_flags & UFS_EXTATTR_UEPM_STARTED))
-		return (EOPNOTSUPP);
+
 	if (!ufs_extattr_valid_attrname(attrnamespace, name))
 		return (EINVAL);
 
@@ -1609,12 +1613,10 @@ ufs_extattr_vnode_inactive(struct vnode 
 	if (!(ump->um_extattr.uepm_flags & UFS_EXTATTR_UEPM_INITIALIZED))
 		return;
 
-	ufs_extattr_uepm_lock(ump);
-
-	if (!(ump->um_extattr.uepm_flags & UFS_EXTATTR_UEPM_STARTED)) {
-		ufs_extattr_uepm_unlock(ump);
+	if (!(ump->um_extattr.uepm_flags & UFS_EXTATTR_UEPM_STARTED))
 		return;
-	}
+
+	ufs_extattr_uepm_lock(ump);
 
 	LIST_FOREACH(uele, &ump->um_extattr.uepm_list, uele_entries)
 		ufs_extattr_rm(vp, uele->uele_attrnamespace,

Reply via email to