---
name: "VOP_CREATE"
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_CREATE"
---

# VOP\_CREATE(9)

create a file, socket, fifo, device, directory or symlink

## NAME

**VOP\_CREATE**, **VOP\_MKNOD**, **VOP\_MKDIR**, **VOP\_SYMLINK** – create a file, socket, fifo, device, directory or symlink

## SYNOPSIS

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

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

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

*int*\

**VOP\_CREATE**(*struct vnode \*dvp*, *struct vnode \*\*vpp*, *struct componentname \*cnp*, *struct vattr \*vap*);

*int*\

**VOP\_MKNOD**(*struct vnode \*dvp*, *struct vnode \*\*vpp*, *struct componentname \*cnp*, *struct vattr \*vap*);

*int*\

**VOP\_MKDIR**(*struct vnode \*dvp*, *struct vnode \*\*vpp*, *struct componentname \*cnp*, *struct vattr \*vap*);

*int*\

**VOP\_SYMLINK**(*struct vnode \*dvp*, *struct vnode \*\*vpp*, *struct componentname \*cnp*, *struct vattr \*vap*, *char \*target*);

## DESCRIPTION

These entry points create a new file, socket, fifo, device, directory or symlink in a given directory.

The arguments are:

- *dvp*

  The locked vnode of the directory.

- *vpp*

  The address of a variable where the resulting locked vnode should be stored.

- *cnp*

  The pathname component created.

- *vap*

  The attributes that the new object should be created with.

- *target*

  The pathname of the target of the symlink.

These entry points are called after [VOP\_LOOKUP(9)](/VOP_LOOKUP/9.md) when an object is being created.

## LOCKS

The directory, *dvp* will be locked on entry and must remain locked on return. If the call is successful, the new object will be returned locked.

## RETURN VALUES

If successful, the vnode for the new object is placed in *\*vpp* and zero is returned. Otherwise, an appropriate error is returned.

## PSEUDOCODE

```
int
vop_create(struct vnode *dvp,
	   struct vnode **vpp,
	   struct componentname *cnp
	   struct vattr *vap)
{
    int mode = MAKEIMODE(vap->va_type, vap->va_mode);
    struct vnode *vp;
    int error;
    *vpp = NULL;
    if ((mode & IFMT) == 0)
	mode |= IFREG;
    error = SOMEFS_VALLOC(dvp, mode, cnp->cn_cred, &vp);
    if (error)
	return error;
    /*
     * Update the permissions for the new vnode, including
     * copying the group from the directory.
     */
    ...;
#ifdef QUOTA
    /*
     * Possibly check quota information.
     */
    ...;
#endif
    /*
     * Enter new vnode in directory, taking care that the vnode
     * hits the disk before the directory contents are changed.
     */
    error = ...;
    if (error)
	goto bad;
    *vpp = vp;
    return 0;
bad:
    /*
     * Write error occurred trying to update the inode
     * or the directory so must deallocate the inode.
     */
    vput(vp);
    /*
     * Deallocate file system resources for vp.
     */
    ...;
    return error;
}
```

## ERRORS

- \[ENOSPC\]

  The file system is full.

- \[EDQUOT\]

  The user's file system space or inode quota would be exceeded.

## SEE ALSO

[vnode(9)](/vnode/9.md), [VOP\_LOOKUP(9)](/VOP_LOOKUP/9.md)

## HISTORY

The function **VOP\_CREATE** appeared in 4.3BSD.

## AUTHORS

This manual page was written by Doug Rabson.
