Module Name: src
Committed By: martin
Date: Sun Nov 23 13:11:03 UTC 2014
Modified Files:
src/sys/ufs/ufs [netbsd-7]: ufs_extattr.c
Log Message:
Pull up following revision(s) (requested by manu in ticket #254):
sys/ufs/ufs/ufs_extattr.c: revision 1.46
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.43.4.2 -r1.43.4.3 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.43.4.2 src/sys/ufs/ufs/ufs_extattr.c:1.43.4.3
--- src/sys/ufs/ufs/ufs_extattr.c:1.43.4.2 Tue Nov 18 18:42:42 2014
+++ src/sys/ufs/ufs/ufs_extattr.c Sun Nov 23 13:11:02 2014
@@ -1,4 +1,4 @@
-/* $NetBSD: ufs_extattr.c,v 1.43.4.2 2014/11/18 18:42:42 snj Exp $ */
+/* $NetBSD: ufs_extattr.c,v 1.43.4.3 2014/11/23 13:11:02 martin 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.43.4.2 2014/11/18 18:42:42 snj Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ufs_extattr.c,v 1.43.4.3 2014/11/23 13:11:02 martin 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,