Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files. =================================================================== RCS file: /ftp/cvs/cvsroot/src/sys/fs/efs/efs_vnops.c,v rcsdiff: /ftp/cvs/cvsroot/src/sys/fs/efs/efs_vnops.c,v: warning: Unknown phrases like `commitid ...;' are present. retrieving revision 1.26 retrieving revision 1.26.2.5 diff -u -p -r1.26 -r1.26.2.5 --- src/sys/fs/efs/efs_vnops.c 2012/07/22 00:53:19 1.26 +++ src/sys/fs/efs/efs_vnops.c 2017/12/03 11:38:41 1.26.2.5 @@ -1,4 +1,4 @@ -/* $NetBSD: efs_vnops.c,v 1.26 2012/07/22 00:53:19 rmind Exp $ */ +/* $NetBSD: efs_vnops.c,v 1.26.2.5 2017/12/03 11:38:41 jdolecek Exp $ */ /* * Copyright (c) 2006 Stephen M. Rumble @@ -17,7 +17,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: efs_vnops.c,v 1.26 2012/07/22 00:53:19 rmind Exp $"); +__KERNEL_RCSID(0, "$NetBSD: efs_vnops.c,v 1.26.2.5 2017/12/03 11:38:41 jdolecek Exp $"); #include #include @@ -46,7 +46,6 @@ __KERNEL_RCSID(0, "$NetBSD: efs_vnops.c, #include #include #include -#include MALLOC_DECLARE(M_EFSTMP); @@ -58,7 +57,7 @@ MALLOC_DECLARE(M_EFSTMP); static int efs_lookup(void *v) { - struct vop_lookup_args /* { + struct vop_lookup_v2_args /* { struct vnode *a_dvp; struct vnode **a_vpp; struct componentname *a_cnp; @@ -73,37 +72,26 @@ efs_lookup(void *v) if (err) return (err); - err = cache_lookup(ap->a_dvp, ap->a_vpp, cnp); - if (err != -1) - return (err); + if (cache_lookup(ap->a_dvp, cnp->cn_nameptr, cnp->cn_namelen, + cnp->cn_nameiop, cnp->cn_flags, NULL, ap->a_vpp)) { + return *ap->a_vpp == NULLVP ? ENOENT : 0; + } /* - * Handle the three lookup types: '.', '..', and everything else. + * Handle the lookup types: '.' or everything else. */ if (cnp->cn_namelen == 1 && cnp->cn_nameptr[0] == '.') { vref(ap->a_dvp); *ap->a_vpp = ap->a_dvp; - } else if (cnp->cn_flags & ISDOTDOT) { - err = efs_inode_lookup(VFSTOEFS(ap->a_dvp->v_mount), - EFS_VTOI(ap->a_dvp), ap->a_cnp, &ino); - if (err) - return (err); - - VOP_UNLOCK(ap->a_dvp); /* preserve lock order */ - - err = VFS_VGET(ap->a_dvp->v_mount, ino, &vp); - if (err) { - vn_lock(ap->a_dvp, LK_EXCLUSIVE | LK_RETRY); - return (err); - } - vn_lock(ap->a_dvp, LK_EXCLUSIVE | LK_RETRY); - *ap->a_vpp = vp; } else { err = efs_inode_lookup(VFSTOEFS(ap->a_dvp->v_mount), EFS_VTOI(ap->a_dvp), ap->a_cnp, &ino); if (err) { + if (cnp->cn_flags & ISDOTDOT) + return (err); if (err == ENOENT && nameiop != CREATE) - cache_enter(ap->a_dvp, NULL, cnp); + cache_enter(ap->a_dvp, NULL, cnp->cn_nameptr, + cnp->cn_namelen, cnp->cn_flags); if (err == ENOENT && (nameiop == CREATE || nameiop == RENAME)) { err = VOP_ACCESS(ap->a_dvp, VWRITE, @@ -114,13 +102,14 @@ efs_lookup(void *v) } return (err); } - err = VFS_VGET(ap->a_dvp->v_mount, ino, &vp); + err = vcache_get(ap->a_dvp->v_mount, &ino, sizeof(ino), &vp); if (err) return (err); *ap->a_vpp = vp; } - cache_enter(ap->a_dvp, *ap->a_vpp, cnp); + cache_enter(ap->a_dvp, *ap->a_vpp, cnp->cn_nameptr, cnp->cn_namelen, + cnp->cn_flags); return 0; } @@ -146,7 +135,7 @@ efs_check_permitted(struct vnode *vp, st kauth_cred_t cred) { - return kauth_authorize_vnode(cred, kauth_access_action(mode, + return kauth_authorize_vnode(cred, KAUTH_ACCESS_ACTION(mode, vp->v_type, eip->ei_mode), vp, NULL, genfs_can_access(vp->v_type, eip->ei_mode, eip->ei_uid, eip->ei_gid, mode, cred)); } @@ -184,7 +173,7 @@ efs_getattr(void *v) struct vop_getattr_args /* { const struct vnodeop_desc *a_desc; struct vnode *a_vp; - struct vattr *a_vap; + struct vattr *a_vap; struct ucred *a_cred; } */ *ap = v; @@ -248,7 +237,7 @@ efs_read(void *v) struct vop_read_args /* { const struct vnodeop_desc *a_desc; struct vnode *a_vp; - struct uio *a_uio; + struct uio *a_uio; int a_ioflag; struct ucred *a_cred; } */ *ap = v; @@ -305,8 +294,8 @@ efs_readdir(void *v) { struct vop_readdir_args /* { const struct vnodeop_desc *a_desc; - struct vnode *a_vp; - struct uio *a_uio; + struct vnode *a_vp; + struct uio *a_uio; struct ucred *a_cred; int *a_eofflag; off_t **a_cookies; @@ -347,7 +336,6 @@ efs_readdir(void *v) err = efs_bread(VFSTOEFS(ap->a_vp->v_mount), ex.ex_bn + i, NULL, &bp); if (err) { - brelse(bp, 0); goto exit_err; } @@ -432,7 +420,7 @@ efs_readdir(void *v) err = uiomove(dp, s, uio); if (err) { brelse(bp, 0); - goto exit_err; + goto exit_err; } offset += s; @@ -527,7 +515,6 @@ efs_readlink(void *v) err = efs_bread(VFSTOEFS(ap->a_vp->v_mount), ex.ex_bn + i, NULL, &bp); if (err) { - brelse(bp, 0); free(buf, M_EFSTMP); return (err); } @@ -573,7 +560,7 @@ efs_readlink(void *v) static int efs_inactive(void *v) { - struct vop_inactive_args /* { + struct vop_inactive_v2_args /* { const struct vnodeop_desc *a_desc; struct vnode *a_vp; bool *a_recycle @@ -581,7 +568,6 @@ efs_inactive(void *v) struct efs_inode *eip = EFS_VTOI(ap->a_vp); *ap->a_recycle = (eip->ei_mode == 0); - VOP_UNLOCK(ap->a_vp); return (0); } @@ -589,15 +575,17 @@ efs_inactive(void *v) static int efs_reclaim(void *v) { - struct vop_reclaim_args /* { + struct vop_reclaim_v2_args /* { const struct vnodeop_desc *a_desc; struct vnode *a_vp; } */ *ap = v; struct vnode *vp = ap->a_vp; + struct efs_inode *eip = EFS_VTOI(vp); + + VOP_UNLOCK(vp); - efs_ihashrem(EFS_VTOI(vp)); genfs_node_destroy(vp); - pool_put(&efs_inode_pool, vp->v_data); + pool_put(&efs_inode_pool, eip); vp->v_data = NULL; return (0); @@ -634,7 +622,7 @@ efs_bmap(void *v) } } - KASSERT(!found || (found && ret == 0)); + KASSERT(!found || ret == 0); if (!found) { EFS_DPRINTF(("efs_bmap: ap->a_bn not in extents\n")); @@ -748,7 +736,7 @@ efs_pathconf(void *v) /* IRIX 4 values */ switch (ap->a_name) { case _PC_LINK_MAX: - *ap->a_retval = 30000; + *ap->a_retval = 30000; break; case _PC_NAME_MAX: *ap->a_retval = 255; @@ -805,6 +793,8 @@ const struct vnodeopv_entry_desc efs_vno { &vop_setattr_desc, genfs_eopnotsupp}, /* setattr */ { &vop_read_desc, efs_read }, /* read */ { &vop_write_desc, genfs_eopnotsupp}, /* write */ + { &vop_fallocate_desc, genfs_eopnotsupp}, /* fallocate */ + { &vop_fdiscard_desc, genfs_eopnotsupp}, /* fdiscard */ { &vop_ioctl_desc, genfs_enoioctl }, /* ioctl */ { &vop_fcntl_desc, genfs_fcntl }, /* fcntl */ { &vop_poll_desc, genfs_poll }, /* poll */ @@ -861,6 +851,8 @@ const struct vnodeopv_entry_desc efs_spe { &vop_setattr_desc, genfs_eopnotsupp}, /* setattr */ { &vop_read_desc, spec_read }, /* read */ { &vop_write_desc, spec_write }, /* write */ + { &vop_fallocate_desc, spec_fallocate }, /* fallocate */ + { &vop_fdiscard_desc, spec_fdiscard }, /* fdiscard */ { &vop_ioctl_desc, spec_ioctl }, /* ioctl */ { &vop_fcntl_desc, genfs_fcntl }, /* fcntl */ { &vop_poll_desc, spec_poll }, /* poll */ @@ -917,6 +909,8 @@ const struct vnodeopv_entry_desc efs_fif { &vop_setattr_desc, genfs_eopnotsupp}, /* setattr */ { &vop_read_desc, vn_fifo_bypass }, /* read */ { &vop_write_desc, vn_fifo_bypass }, /* write */ + { &vop_fallocate_desc, vn_fifo_bypass }, /* fallocate */ + { &vop_fdiscard_desc, vn_fifo_bypass }, /* fdiscard */ { &vop_ioctl_desc, vn_fifo_bypass }, /* ioctl */ { &vop_fcntl_desc, genfs_fcntl }, /* fcntl */ { &vop_poll_desc, vn_fifo_bypass }, /* poll */