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,