- ignore truncation for VCHR/VBLK/VFIFO as it used to be

before yamt-vop merge.  PR/32049 from Atsushi Onoe.
- reject setattr which attempts to change size of VLNK/VSOCK.
This commit is contained in:
yamt 2005-11-11 15:50:57 +00:00
parent a54786194c
commit 6a17dd42f4
7 changed files with 86 additions and 25 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: cd9660_node.h,v 1.9 2005/11/02 12:38:58 yamt Exp $ */
/* $NetBSD: cd9660_node.h,v 1.10 2005/11/11 15:50:57 yamt Exp $ */
/*-
* Copyright (c) 1994
@ -129,6 +129,7 @@ int cd9660_strategy(void *);
int cd9660_print(void *);
int cd9660_islocked(void *);
int cd9660_pathconf(void *);
int cd9660_setattr(void *);
int cd9660_blkatoff(struct vnode *, off_t, char **, struct buf **);
void cd9660_defattr(struct iso_directory_record *,

View File

@ -1,4 +1,4 @@
/* $NetBSD: cd9660_vnops.c,v 1.16 2005/11/02 12:38:58 yamt Exp $ */
/* $NetBSD: cd9660_vnops.c,v 1.17 2005/11/11 15:50:57 yamt Exp $ */
/*-
* Copyright (c) 1994
@ -37,7 +37,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: cd9660_vnops.c,v 1.16 2005/11/02 12:38:58 yamt Exp $");
__KERNEL_RCSID(0, "$NetBSD: cd9660_vnops.c,v 1.17 2005/11/11 15:50:57 yamt Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@ -836,6 +836,51 @@ cd9660_pathconf(v)
/* NOTREACHED */
}
/*
* Allow changing the size for special files (and fifos).
*/
int
cd9660_setattr(v)
void *v;
{
struct vop_setattr_args /* {
struct vnodeop_desc *a_desc;
struct vnode *a_vp;
struct vattr *a_vap;
struct ucred *a_cred;
struct proc *a_p;
} */ *ap = v;
struct vattr *vap = ap->a_vap;
struct vnode *vp = ap->a_vp;
/*
* Only size is changeable.
*/
if (vap->va_type != VNON
|| vap->va_nlink != (nlink_t)VNOVAL
|| vap->va_fsid != VNOVAL
|| vap->va_fileid != VNOVAL
|| vap->va_blocksize != VNOVAL
|| vap->va_rdev != (dev_t)VNOVAL
|| (int)vap->va_bytes != VNOVAL
|| vap->va_gen != VNOVAL
|| vap->va_flags != VNOVAL
|| vap->va_uid != (uid_t)VNOVAL
|| vap->va_gid != (gid_t)VNOVAL
|| vap->va_atime.tv_sec != VNOVAL
|| vap->va_mtime.tv_sec != VNOVAL
|| vap->va_mode != (mode_t)VNOVAL)
return EOPNOTSUPP;
if (vap->va_size != VNOVAL
&& vp->v_type != VCHR
&& vp->v_type != VBLK
&& vp->v_type != VFIFO)
return EOPNOTSUPP;
return 0;
}
/*
* Global vfs data structures for isofs
*/
@ -851,7 +896,6 @@ cd9660_pathconf(v)
#define cd9660_advlock genfs_einval
#define cd9660_bwrite genfs_eopnotsupp
#define cd9660_revoke genfs_revoke
#define cd9660_setattr genfs_eopnotsupp
/*
* Global vfs data structures for cd9660

View File

@ -1,4 +1,4 @@
/* $NetBSD: tmpfs_subr.c,v 1.13 2005/11/08 23:04:03 yamt Exp $ */
/* $NetBSD: tmpfs_subr.c,v 1.14 2005/11/11 15:50:57 yamt Exp $ */
/*
* Copyright (c) 2005 The NetBSD Foundation, Inc.
@ -42,7 +42,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: tmpfs_subr.c,v 1.13 2005/11/08 23:04:03 yamt Exp $");
__KERNEL_RCSID(0, "$NetBSD: tmpfs_subr.c,v 1.14 2005/11/11 15:50:57 yamt Exp $");
#include <sys/param.h>
#include <sys/dirent.h>
@ -1141,8 +1141,6 @@ tmpfs_chsize(struct vnode *vp, u_quad_t size, struct ucred *cred,
case VDIR:
return EISDIR;
case VLNK:
/* FALLTHROUGH */
case VREG:
if (vp->v_mount->mnt_flag & MNT_RDONLY)
return EROFS;
@ -1152,17 +1150,15 @@ tmpfs_chsize(struct vnode *vp, u_quad_t size, struct ucred *cred,
/* FALLTHROUGH */
case VCHR:
/* FALLTHROUGH */
case VSOCK:
/* FALLTHROUGH */
case VFIFO:
/* Allow modifications of special files even if in the file
* system is mounted read-only (we are not modifying the
* files themselves, but the objects they represent). */
break;
return 0;
default:
/* Anything else is unsupported. */
return EINVAL;
return EOPNOTSUPP;
}
/* Immutable or append-only files cannot be modified, either. */

View File

@ -1,4 +1,4 @@
/* $NetBSD: ext2fs_inode.c,v 1.50 2005/11/02 12:39:00 yamt Exp $ */
/* $NetBSD: ext2fs_inode.c,v 1.51 2005/11/11 15:50:57 yamt Exp $ */
/*
* Copyright (c) 1982, 1986, 1989, 1993
@ -65,7 +65,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: ext2fs_inode.c,v 1.50 2005/11/02 12:39:00 yamt Exp $");
__KERNEL_RCSID(0, "$NetBSD: ext2fs_inode.c,v 1.51 2005/11/11 15:50:57 yamt Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@ -262,6 +262,11 @@ ext2fs_truncate(struct vnode *ovp, off_t length, int ioflag,
int sync;
struct ufsmount *ump = oip->i_ump;
if (ovp->v_type == VCHR || ovp->v_type == VBLK ||
ovp->v_type == VFIFO || ovp->v_type == VSOCK) {
return 0;
}
if (length < 0)
return (EINVAL);

View File

@ -1,4 +1,4 @@
/* $NetBSD: ffs_inode.c,v 1.77 2005/11/02 12:39:00 yamt Exp $ */
/* $NetBSD: ffs_inode.c,v 1.78 2005/11/11 15:50:57 yamt Exp $ */
/*
* Copyright (c) 1982, 1986, 1989, 1993
@ -32,7 +32,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: ffs_inode.c,v 1.77 2005/11/02 12:39:00 yamt Exp $");
__KERNEL_RCSID(0, "$NetBSD: ffs_inode.c,v 1.78 2005/11/11 15:50:57 yamt Exp $");
#if defined(_KERNEL_OPT)
#include "opt_ffs.h"
@ -180,6 +180,12 @@ ffs_truncate(struct vnode *ovp, off_t length, int ioflag, struct ucred *cred,
int sync;
struct ufsmount *ump = oip->i_ump;
if (ovp->v_type == VCHR || ovp->v_type == VBLK ||
ovp->v_type == VFIFO || ovp->v_type == VSOCK) {
KASSERT(oip->i_size == 0);
return 0;
}
if (length < 0)
return (EINVAL);

View File

@ -1,4 +1,4 @@
/* $NetBSD: lfs_inode.c,v 1.98 2005/11/02 12:39:14 yamt Exp $ */
/* $NetBSD: lfs_inode.c,v 1.99 2005/11/11 15:50:57 yamt Exp $ */
/*-
* Copyright (c) 1999, 2000, 2001, 2002, 2003 The NetBSD Foundation, Inc.
@ -67,7 +67,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: lfs_inode.c,v 1.98 2005/11/02 12:39:14 yamt Exp $");
__KERNEL_RCSID(0, "$NetBSD: lfs_inode.c,v 1.99 2005/11/11 15:50:57 yamt Exp $");
#if defined(_KERNEL_OPT)
#include "opt_quota.h"
@ -223,6 +223,12 @@ lfs_truncate(struct vnode *ovp, off_t length, int ioflag,
int usepc;
struct ufsmount *ump = oip->i_ump;
if (ovp->v_type == VCHR || ovp->v_type == VBLK ||
ovp->v_type == VFIFO || ovp->v_type == VSOCK) {
KASSERT(oip->i_size == 0);
return 0;
}
if (length < 0)
return (EINVAL);

View File

@ -1,4 +1,4 @@
/* $NetBSD: ufs_vnops.c,v 1.136 2005/11/02 12:39:14 yamt Exp $ */
/* $NetBSD: ufs_vnops.c,v 1.137 2005/11/11 15:50:57 yamt Exp $ */
/*
* Copyright (c) 1982, 1986, 1989, 1993, 1995
@ -37,7 +37,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: ufs_vnops.c,v 1.136 2005/11/02 12:39:14 yamt Exp $");
__KERNEL_RCSID(0, "$NetBSD: ufs_vnops.c,v 1.137 2005/11/11 15:50:57 yamt Exp $");
#if defined(_KERNEL_OPT)
#include "opt_ffs.h"
@ -435,19 +435,22 @@ ufs_setattr(void *v)
switch (vp->v_type) {
case VDIR:
return (EISDIR);
case VLNK:
case VCHR:
case VBLK:
case VFIFO:
break;
case VREG:
if (vp->v_mount->mnt_flag & MNT_RDONLY)
return (EROFS);
if ((ip->i_flags & SF_SNAPSHOT) != 0)
return (EPERM);
error = UFS_TRUNCATE(vp, vap->va_size, 0, cred, p);
if (error)
return (error);
break;
default:
break;
return (EOPNOTSUPP);
}
error = UFS_TRUNCATE(vp, vap->va_size, 0, cred, p);
if (error)
return (error);
}
ip = VTOI(vp);
if (vap->va_atime.tv_sec != VNOVAL || vap->va_mtime.tv_sec != VNOVAL ||