---
name: "VOP_ATTRIB"
section: "9"
platform: "linux"
package: "freebsd-manpages"
version: "6.0-5"
release: "Debian 4.0 (Etch)"
platforms: ["linux", "freebsd"]
url: "https://new.carta.tech/VOP_ATTRIB"
---

# VOP\_ATTRIB(9)

get and set attributes on a file or directory

## NAME

**VOP\_GETATTR**, **VOP\_SETATTR** – get and set attributes on a file or directory

## SYNOPSIS

**#include \<sys/param.h\>**

**#include \<sys/vnode.h\>**

*int*\

**VOP\_GETATTR**(*struct vnode \*vp*, *struct vattr \*vap*, *struct ucred \*cred*, *struct thread \*td*);

*int*\

**VOP\_SETATTR**(*struct vnode \*vp*, *struct vattr \*vap*, *struct ucred \*cred*, *struct thread \*td*);

## DESCRIPTION

These entry points manipulate various attributes of a file or directory, including file permissions, owner, group, size, access time and modification time.

The arguments are:

- *vp*

  The vnode of the file.

- *vap*

  The attributes of the file.

- *cred*

  The user credentials of the calling process.

- *td*

  The thread.

Attributes which are not being modified by **VOP\_SETATTR**() should be set to the value VNOVAL; **VATTR\_NULL**() may be used to clear all the values, and should generally be used to reset the contents of *\*vap* prior to setting specific values.

## LOCKS

**VOP\_GETATTR**() expects the vnode to be locked on entry and will leave the vnode locked on return. The lock type can be either shared or exclusive.

**VOP\_SETATTR**() expects the vnode to be locked on entry and will leave the vnode locked on return. The lock type must be exclusive.

## RETURN VALUES

**VOP\_GETATTR**() returns 0 if it was able to retrieve the attribute data via *\*vap*, otherwise an appropriate error is returned. **VOP\_SETATTR**() returns zero if the attributes were changed successfully, otherwise an appropriate error is returned.

## PSEUDOCODE

```
int
vop_getattr(struct vnode *vp, struct vattr *vap,
	    struct ucred *cred, struct thread *td)
{
    /*
     * Fill in the contents of *vap with information from
     * the file system.
     */
    ...;
    return 0;
}
int
vop_setattr(struct vnode *vp, struct vattr *vap,
	    struct ucred *cred, struct thread *td)
{
    /*
     * Check for unsettable attributes.
     */
    if ((vap->va_type != VNON) || (vap->va_nlink != VNOVAL) ||
	(vap->va_fsid != VNOVAL) || (vap->va_fileid != VNOVAL) ||
	(vap->va_blocksize != VNOVAL) || (vap->va_rdev != VNOVAL) ||
	((int)vap->va_bytes != VNOVAL) || (vap->va_gen != VNOVAL)) {
	return (EINVAL);
    }
    if (vap->va_flags != VNOVAL) {
	/*
	 * Set the immutable and append flags of the file.
	 */
    }
    if (vap->va_uid != (uid_t)VNOVAL || vap->va_gid != (gid_t)VNOVAL) {
	/*
	 * Change owner and/or group of the file.
	 */
    }
    if (vap->va_size != VNOVAL) {
	/*
	 * Truncate the file to the specified size.
	 */
    }
    if (vap->va_atime.tv_sec != VNOVAL || vap->va_mtime.tv_sec != VNOVAL) {
	/*
	 * Change access and/or modification time of file.
	 */
    }
    if (vap->va_mode != (mode_t)VNOVAL) {
	/*
	 * Change permissions of file.
	 */
    }
    return 0;
}
```

## ERRORS

- \[EPERM\]

  The file is immutable.

- \[EACCES\]

  The caller does not have permission to modify the file or directory attributes.

- \[EROFS\]

  The file system is read-only.

## SEE ALSO

[VFS(9)](/VFS/9.md), [vnode(9)](/vnode/9.md), [VOP\_ACCESS(9)](/VOP_ACCESS/9.md)

## AUTHORS

This manual page was written by Doug Rabson.
