Module Name: src Committed By: christos Date: Mon Aug 19 09:30:30 UTC 2019
Modified Files: src/sys/ufs/ufs: ufs_extattr.c Log Message: - return (foo) -> return foo - normalize all error messages to use __func__ - add more messages for startup failure (should perhaps auto-create the attributes directory and the user and system subdirs?) - factor out common code To generate a diff of this commit: cvs rdiff -u -r1.48 -r1.49 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.48 src/sys/ufs/ufs/ufs_extattr.c:1.49 --- src/sys/ufs/ufs/ufs_extattr.c:1.48 Wed Nov 9 00:08:35 2016 +++ src/sys/ufs/ufs/ufs_extattr.c Mon Aug 19 05:30:30 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: ufs_extattr.c,v 1.48 2016/11/09 05:08:35 dholland Exp $ */ +/* $NetBSD: ufs_extattr.c,v 1.49 2019/08/19 09:30:30 christos 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.48 2016/11/09 05:08:35 dholland Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ufs_extattr.c,v 1.49 2019/08/19 09:30:30 christos Exp $"); #ifdef _KERNEL_OPT #include "opt_ffs.h" @@ -207,10 +207,10 @@ ufs_extattr_valid_attrname(int attrnames { if (attrname == NULL) - return (0); + return 0; if (strlen(attrname) == 0) - return (0); - return (1); + return 0; + return 1; } /* @@ -321,8 +321,8 @@ ufs_extattr_autocreate_attr(struct vnode VOP_UNLOCK(backing_vp); if (error != 0) { - printf("%s: write uef header failed for %s, error = %d\n", - __func__, attrname, error); + printf("%s: write uef header failed for `%s' (%d)\n", + __func__, attrname, error); vn_close(backing_vp, FREAD|FWRITE, l->l_cred); *uelep = NULL; return error; @@ -335,8 +335,8 @@ ufs_extattr_autocreate_attr(struct vnode KASSERT(VOP_ISLOCKED(backing_vp) == 0); if (error != 0) { - printf("%s: enable %s failed, error %d\n", - __func__, attrname, error); + printf("%s: enable `%s' failed (%d)\n", + __func__, attrname, error); vn_close(backing_vp, FREAD|FWRITE, l->l_cred); *uelep = NULL; return error; @@ -344,7 +344,7 @@ ufs_extattr_autocreate_attr(struct vnode uele = ufs_extattr_find_attr(ump, attrnamespace, attrname); if (uele == NULL) { - printf("%s: atttribute %s created but not found!\n", + printf("%s: atttribute `%s' created but not found!\n", __func__, attrname); vn_close(backing_vp, FREAD|FWRITE, l->l_cred); *uelep = NULL; @@ -352,7 +352,7 @@ ufs_extattr_autocreate_attr(struct vnode } printf("%s: EA backing store autocreated for %s\n", - mp->mnt_stat.f_mntonname, attrname); + mp->mnt_stat.f_mntonname, attrname); *uelep = uele; return 0; @@ -374,11 +374,11 @@ ufs_extattr_find_attr(struct ufsmount *u if (!(strncmp(attrname, search_attribute->uele_attrname, UFS_EXTATTR_MAXEXTATTRNAME)) && (attrnamespace == search_attribute->uele_attrnamespace)) { - return (search_attribute); + return search_attribute; } } - return (0); + return 0; } /* @@ -453,8 +453,7 @@ ufs_extattr_start(struct mount *mp, stru unlock: ufs_extattr_uepm_unlock(ump); - - return (error); + return error; } /* @@ -490,8 +489,8 @@ ufs_extattr_lookup(struct vnode *start_d VOP_UNLOCK(start_dvp); } PNBUF_PUT(pnbuf); - printf("ufs_extattr_lookup: copystr failed\n"); - return (error); + printf("%s: copystr failed (%d)\n", __func__, error); + return error; } cnp.cn_namelen--; /* trim nul termination */ vargs.a_desc = NULL; @@ -504,11 +503,11 @@ ufs_extattr_lookup(struct vnode *start_d if (lockparent == 0) { VOP_UNLOCK(start_dvp); } - return (error); + return error; } #if 0 if (target_vp == start_dvp) - panic("ufs_extattr_lookup: target_vp == start_dvp"); + panic("%s: target_vp == start_dvp", __func__); #endif if (target_vp != start_dvp) { @@ -523,7 +522,7 @@ ufs_extattr_lookup(struct vnode *start_d KASSERT(VOP_ISLOCKED(target_vp) == LK_EXCLUSIVE); *vp = target_vp; - return (0); + return 0; } /* @@ -541,10 +540,9 @@ ufs_extattr_enable_with_open(struct ufsm error = VOP_OPEN(vp, FREAD|FWRITE, l->l_cred); if (error) { - printf("ufs_extattr_enable_with_open.VOP_OPEN(): failed " - "with %d\n", error); + printf("%s: VOP_OPEN(): failed (%d)\n", __func__, error); VOP_UNLOCK(vp); - return (error); + return error; } mutex_enter(vp->v_interlock); @@ -558,7 +556,7 @@ ufs_extattr_enable_with_open(struct ufsm error = ufs_extattr_enable(ump, attrnamespace, attrname, vp, l); if (error != 0) vn_close(vp, FREAD|FWRITE, l->l_cred); - return (error); + return error; } /* @@ -582,7 +580,7 @@ ufs_extattr_iterate_directory(struct ufs int error, eofflag = 0; if (dvp->v_type != VDIR) - return (ENOTDIR); + return ENOTDIR; dirbuf = kmem_alloc(UFS_DIRBLKSIZ, KM_SLEEP); @@ -606,9 +604,8 @@ ufs_extattr_iterate_directory(struct ufs aiov.iov_len = UFS_DIRBLKSIZ; error = ufs_readdir(&vargs); if (error) { - printf("ufs_extattr_iterate_directory: ufs_readdir " - "%d\n", error); - return (error); + printf("%s: ufs_readdir (%d)\n", __func__, error); + return error; } /* @@ -631,8 +628,8 @@ ufs_extattr_iterate_directory(struct ufs if (error == ENOENT) { goto next; /* keep silent */ } else if (error) { - printf("ufs_extattr_iterate_directory: lookup " - "%s %d\n", dp->d_name, error); + printf("%s: lookup `%s' (%d)\n", __func__, + dp->d_name, error); } else if (attr_vp == dvp) { vrele(attr_vp); } else if (attr_vp->v_type != VREG) { @@ -642,12 +639,11 @@ ufs_extattr_iterate_directory(struct ufs attr_vp, attrnamespace, dp->d_name, l); vrele(attr_vp); if (error) { - printf("ufs_extattr_iterate_directory: " - "enable %s %d\n", dp->d_name, - error); + printf("%s: enable `%s' (%d)\n", + __func__, dp->d_name, error); } else if (bootverbose) { printf("%s: EA %s loaded\n", - sbp->f_mntonname, dp->d_name); + sbp->f_mntonname, dp->d_name); } } next: @@ -658,7 +654,32 @@ ufs_extattr_iterate_directory(struct ufs } kmem_free(dirbuf, UFS_DIRBLKSIZ); - return (0); + return 0; +} + +static int +ufs_extattr_subdir(struct lwp *l, struct mount *mp, struct vnode *attr_dvp, + const char *subdir, int namespace) +{ + int error; + struct vnode *attr_sub; + error = ufs_extattr_lookup(attr_dvp, LOCKPARENT, subdir, &attr_sub, l); + KASSERT(VOP_ISLOCKED(attr_dvp) == LK_EXCLUSIVE); + if (error) { + printf("%s: Can't find `%s/%s' (%d)\n", + __func__, UFS_EXTATTR_FSROOTSUBDIR, subdir, error); + return error; + } + KASSERT(VOP_ISLOCKED(attr_sub) == LK_EXCLUSIVE); + error = ufs_extattr_iterate_directory(VFSTOUFS(mp), + attr_sub, namespace, l); + if (error) { + printf("%s: ufs_extattr_iterate_directory for `%s/%s' (%d)\n", + __func__, UFS_EXTATTR_FSROOTSUBDIR, subdir, error); + } + KASSERT(VOP_ISLOCKED(attr_sub) == LK_EXCLUSIVE); + vput(attr_sub); + return error; } /* @@ -668,7 +689,7 @@ ufs_extattr_iterate_directory(struct ufs int ufs_extattr_autostart(struct mount *mp, struct lwp *l) { - struct vnode *rvp, *attr_dvp, *attr_system_dvp, *attr_user_dvp; + struct vnode *rvp, *attr_dvp; int error; /* @@ -677,9 +698,8 @@ ufs_extattr_autostart(struct mount *mp, */ error = VFS_ROOT(mp, &rvp); if (error) { - printf("ufs_extattr_autostart.VFS_ROOT() returned %d\n", - error); - return (error); + printf("%s: VFS_ROOT() (%d)\n", __func__, error); + return error; } KASSERT(VOP_ISLOCKED(rvp) == LK_EXCLUSIVE); @@ -690,14 +710,18 @@ ufs_extattr_autostart(struct mount *mp, /* rvp ref'd but now unlocked */ KASSERT(VOP_ISLOCKED(rvp) == 0); vrele(rvp); - return (error); + printf("%s: lookup `%s' (%d)\n", __func__, + UFS_EXTATTR_FSROOTSUBDIR, error); + return error; } if (rvp == attr_dvp) { /* Should never happen. */ KASSERT(VOP_ISLOCKED(rvp) == LK_EXCLUSIVE); vrele(attr_dvp); vput(rvp); - return (EINVAL); + printf("%s: `/' == `%s' (%d)\n", __func__, + UFS_EXTATTR_FSROOTSUBDIR, EINVAL); + return EINVAL; } KASSERT(VOP_ISLOCKED(rvp) == 0); vrele(rvp); @@ -705,14 +729,14 @@ ufs_extattr_autostart(struct mount *mp, KASSERT(VOP_ISLOCKED(attr_dvp) == LK_EXCLUSIVE); if (attr_dvp->v_type != VDIR) { - printf("ufs_extattr_autostart: %s != VDIR\n", - UFS_EXTATTR_FSROOTSUBDIR); + printf("%s: `%s' is not a directory\n", + __func__, UFS_EXTATTR_FSROOTSUBDIR); goto return_vput_attr_dvp; } error = ufs_extattr_start(mp, l); if (error) { - printf("ufs_extattr_autostart: ufs_extattr_start failed (%d)\n", + printf("%s: ufs_extattr_start failed (%d)\n", __func__, error); goto return_vput_attr_dvp; } @@ -724,33 +748,10 @@ ufs_extattr_autostart(struct mount *mp, * result in an over-all failure. attr_dvp is left locked to * be cleaned up on exit. */ - error = ufs_extattr_lookup(attr_dvp, LOCKPARENT, - UFS_EXTATTR_SUBDIR_SYSTEM, &attr_system_dvp, l); - KASSERT(VOP_ISLOCKED(attr_dvp) == LK_EXCLUSIVE); - if (error == 0) { - KASSERT(VOP_ISLOCKED(attr_system_dvp) == LK_EXCLUSIVE); - error = ufs_extattr_iterate_directory(VFSTOUFS(mp), - attr_system_dvp, EXTATTR_NAMESPACE_SYSTEM, l); - if (error) - printf("ufs_extattr_iterate_directory returned %d\n", - error); - KASSERT(VOP_ISLOCKED(attr_system_dvp) == LK_EXCLUSIVE); - vput(attr_system_dvp); - } - - error = ufs_extattr_lookup(attr_dvp, LOCKPARENT, - UFS_EXTATTR_SUBDIR_USER, &attr_user_dvp, l); - KASSERT(VOP_ISLOCKED(attr_dvp) == LK_EXCLUSIVE); - if (error == 0) { - KASSERT(VOP_ISLOCKED(attr_user_dvp) == LK_EXCLUSIVE); - error = ufs_extattr_iterate_directory(VFSTOUFS(mp), - attr_user_dvp, EXTATTR_NAMESPACE_USER, l); - if (error) - printf("ufs_extattr_iterate_directory returned %d\n", - error); - KASSERT(VOP_ISLOCKED(attr_user_dvp) == LK_EXCLUSIVE); - vput(attr_user_dvp); - } + error = ufs_extattr_subdir(l, mp, attr_dvp, UFS_EXTATTR_SUBDIR_SYSTEM, + EXTATTR_NAMESPACE_SYSTEM); + error = ufs_extattr_subdir(l, mp, attr_dvp, UFS_EXTATTR_SUBDIR_USER, + EXTATTR_NAMESPACE_USER); /* Mask startup failures in sub-directories. */ error = 0; @@ -759,7 +760,7 @@ ufs_extattr_autostart(struct mount *mp, KASSERT(VOP_ISLOCKED(attr_dvp) == LK_EXCLUSIVE); vput(attr_dvp); - return (error); + return error; } /* @@ -810,9 +811,9 @@ ufs_extattr_enable(struct ufsmount *ump, int error = 0; if (!ufs_extattr_valid_attrname(attrnamespace, attrname)) - return (EINVAL); + return EINVAL; if (backing_vnode->v_type != VREG) - return (EINVAL); + return EINVAL; attribute = kmem_zalloc(sizeof(*attribute), KM_SLEEP); @@ -851,7 +852,7 @@ ufs_extattr_enable(struct ufsmount *ump, goto unlock_free_exit; if (auio.uio_resid != 0) { - printf("ufs_extattr_enable: malformed attribute header\n"); + printf("%s: malformed attribute header\n", __func__); error = EINVAL; goto unlock_free_exit; } @@ -865,8 +866,8 @@ ufs_extattr_enable(struct ufsmount *ump, ufs_rw32(attribute->uele_fileheader.uef_magic, UELE_NEEDSWAP(attribute)); if (attribute->uele_fileheader.uef_magic != UFS_EXTATTR_MAGIC) { - printf("ufs_extattr_enable: invalid attribute header " - "magic\n"); + printf("%s: invalid attribute header magic\n", + __func__); error = EINVAL; goto unlock_free_exit; } @@ -879,8 +880,9 @@ ufs_extattr_enable(struct ufsmount *ump, UELE_NEEDSWAP(attribute)); if (attribute->uele_fileheader.uef_version != UFS_EXTATTR_VERSION) { - printf("ufs_extattr_enable: incorrect attribute header " - "version\n"); + printf("%s: incorrect attribute header version %d != %d\n", + __func__, attribute->uele_fileheader.uef_version, + UFS_EXTATTR_VERSION); error = EINVAL; goto unlock_free_exit; } @@ -889,14 +891,14 @@ ufs_extattr_enable(struct ufsmount *ump, uele_entries); VOP_UNLOCK(backing_vnode); - return (0); + return 0; unlock_free_exit: VOP_UNLOCK(backing_vnode); free_exit: kmem_free(attribute, sizeof(*attribute)); - return (error); + return error; } /* @@ -910,11 +912,11 @@ ufs_extattr_disable(struct ufsmount *ump int error = 0; if (!ufs_extattr_valid_attrname(attrnamespace, attrname)) - return (EINVAL); + return EINVAL; uele = ufs_extattr_find_attr(ump, attrnamespace, attrname); if (!uele) - return (ENODATA); + return ENODATA; LIST_REMOVE(uele, uele_entries); @@ -923,7 +925,7 @@ ufs_extattr_disable(struct ufsmount *ump kmem_free(uele, sizeof(*uele)); - return (error); + return error; } /* @@ -947,40 +949,35 @@ ufs_extattrctl(struct mount *mp, int cmd if (error) { if (filename_vp != NULL) VOP_UNLOCK(filename_vp); - return (error); + return error; } switch(cmd) { case UFS_EXTATTR_CMD_START: + case UFS_EXTATTR_CMD_STOP: + case UFS_EXTATTR_CMD_ENABLE: + case UFS_EXTATTR_CMD_DISABLE: if (filename_vp != NULL) { VOP_UNLOCK(filename_vp); - return (EINVAL); + return EINVAL; } if (attrname != NULL) - return (EINVAL); + return EINVAL; + break; + default: + return EINVAL; + } + switch(cmd) { + case UFS_EXTATTR_CMD_START: error = ufs_extattr_autostart(mp, l); - return (error); + return error; case UFS_EXTATTR_CMD_STOP: - if (filename_vp != NULL) { - VOP_UNLOCK(filename_vp); - return (EINVAL); - } - if (attrname != NULL) - return (EINVAL); - ufs_extattr_stop(mp, l); - return (0); + return 0; case UFS_EXTATTR_CMD_ENABLE: - if (filename_vp == NULL) - return (EINVAL); - if (attrname == NULL) { - VOP_UNLOCK(filename_vp); - return (EINVAL); - } - /* * ufs_extattr_enable_with_open() will always unlock the * vnode, regardless of failure. @@ -989,23 +986,16 @@ ufs_extattrctl(struct mount *mp, int cmd error = ufs_extattr_enable_with_open(ump, filename_vp, attrnamespace, attrname, l); ufs_extattr_uepm_unlock(ump); - return (error); + return error; case UFS_EXTATTR_CMD_DISABLE: - if (filename_vp != NULL) { - VOP_UNLOCK(filename_vp); - return (EINVAL); - } - if (attrname == NULL) - return (EINVAL); - ufs_extattr_uepm_lock(ump); error = ufs_extattr_disable(ump, attrnamespace, attrname, l); ufs_extattr_uepm_unlock(ump); - return (error); + return error; default: - return (EINVAL); + return EINVAL; } } @@ -1072,7 +1062,7 @@ ufs_extattr_get_header(struct vnode *vp, * is to coerce this to undefined, and let it get cleaned * up by the next write or extattrctl clean. */ - printf("%s (%s): inode gen inconsistency (%u, %jd)\n", + printf("%s: %s: inode gen inconsistency (%u, %jd)\n", __func__, mp->mnt_stat.f_mntonname, ueh->ueh_i_gen, (intmax_t)ip->i_gen); return ENODATA; @@ -1110,7 +1100,7 @@ vop_getextattr { int error; if (!(ump->um_extattr.uepm_flags & UFS_EXTATTR_UEPM_STARTED)) - return (EOPNOTSUPP); + return EOPNOTSUPP; ufs_extattr_uepm_lock(ump); @@ -1119,7 +1109,7 @@ vop_getextattr { ufs_extattr_uepm_unlock(ump); - return (error); + return error; } /* @@ -1139,16 +1129,16 @@ ufs_extattr_get(struct vnode *vp, int at int error = 0; if (strlen(name) == 0) - return (EINVAL); + return EINVAL; error = internal_extattr_check_cred(vp, attrnamespace, name, cred, VREAD); if (error) - return (error); + return error; attribute = ufs_extattr_find_attr(ump, attrnamespace, name); if (!attribute) - return (ENODATA); + return ENODATA; /* * Allow only offsets of zero to encourage the read/replace @@ -1156,7 +1146,7 @@ ufs_extattr_get(struct vnode *vp, int at * atomicity, as we don't provide locks for extended attributes. */ if (uio != NULL && uio->uio_offset != 0) - return (ENXIO); + return ENXIO; /* * Don't need to get a lock on the backing file if the getattr is @@ -1203,7 +1193,7 @@ ufs_extattr_get(struct vnode *vp, int at if (attribute->uele_backing_vnode != vp) VOP_UNLOCK(attribute->uele_backing_vnode); - return (error); + return error; } /* @@ -1228,7 +1218,7 @@ vop_listextattr { int error; if (!(ump->um_extattr.uepm_flags & UFS_EXTATTR_UEPM_STARTED)) - return (EOPNOTSUPP); + return EOPNOTSUPP; ufs_extattr_uepm_lock(ump); @@ -1237,7 +1227,7 @@ vop_listextattr { ufs_extattr_uepm_unlock(ump); - return (error); + return error; } /* @@ -1263,7 +1253,7 @@ ufs_extattr_list(struct vnode *vp, int a error = internal_extattr_check_cred(vp, attrnamespace, "", cred, VREAD); if (error) - return (error); + return error; LIST_FOREACH(uele, &ump->um_extattr.uepm_list, uele_entries) { unsigned char attrnamelen; @@ -1355,7 +1345,7 @@ vop_deleteextattr { int error; if (!(ump->um_extattr.uepm_flags & UFS_EXTATTR_UEPM_STARTED)) - return (EOPNOTSUPP); + return EOPNOTSUPP; ufs_extattr_uepm_lock(ump); @@ -1364,7 +1354,7 @@ vop_deleteextattr { ufs_extattr_uepm_unlock(ump); - return (error); + return error; } /* @@ -1387,7 +1377,7 @@ vop_setextattr { int error; if (!(ump->um_extattr.uepm_flags & UFS_EXTATTR_UEPM_STARTED)) - return (EOPNOTSUPP); + return EOPNOTSUPP; ufs_extattr_uepm_lock(ump); @@ -1396,7 +1386,7 @@ vop_setextattr { */ if (ap->a_uio == NULL) { ufs_extattr_uepm_unlock(ump); - return (EINVAL); + return EINVAL; } error = ufs_extattr_set(ap->a_vp, ap->a_attrnamespace, ap->a_name, @@ -1404,7 +1394,7 @@ vop_setextattr { ufs_extattr_uepm_unlock(ump); - return (error); + return error; } /* @@ -1426,15 +1416,15 @@ ufs_extattr_set(struct vnode *vp, int at int error = 0, ioflag; if (vp->v_mount->mnt_flag & MNT_RDONLY) - return (EROFS); + return EROFS; if (!ufs_extattr_valid_attrname(attrnamespace, name)) - return (EINVAL); + return EINVAL; error = internal_extattr_check_cred(vp, attrnamespace, name, cred, VWRITE); if (error) - return (error); + return error; attribute = ufs_extattr_find_attr(ump, attrnamespace, name); if (!attribute) { @@ -1458,7 +1448,7 @@ ufs_extattr_set(struct vnode *vp, int at */ if (uio->uio_offset != 0 || uio->uio_resid > attribute->uele_fileheader.uef_size) - return (ENXIO); + return ENXIO; /* * Find base offset of header in file based on file header size, and @@ -1524,7 +1514,7 @@ ufs_extattr_set(struct vnode *vp, int at if (attribute->uele_backing_vnode != vp) VOP_UNLOCK(attribute->uele_backing_vnode); - return (error); + return error; } /* @@ -1545,19 +1535,19 @@ ufs_extattr_rm(struct vnode *vp, int att int error = 0, ioflag; if (vp->v_mount->mnt_flag & MNT_RDONLY) - return (EROFS); + return EROFS; if (!ufs_extattr_valid_attrname(attrnamespace, name)) - return (EINVAL); + return EINVAL; error = internal_extattr_check_cred(vp, attrnamespace, name, cred, VWRITE); if (error) - return (error); + return error; attribute = ufs_extattr_find_attr(ump, attrnamespace, name); if (!attribute) - return (ENODATA); + return ENODATA; /* * Don't need to get a lock on the backing file if the getattr is @@ -1597,7 +1587,7 @@ ufs_extattr_rm(struct vnode *vp, int att vopunlock_exit: VOP_UNLOCK(attribute->uele_backing_vnode); - return (error); + return error; } /*