---
name: "VOP_LINK"
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_LINK"
---

# VOP\_LINK(9)

create a new name for a file

## NAME

**VOP\_LINK** – create a new name for a file

## SYNOPSIS

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

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

*int*\

**VOP\_LINK**(*struct vnode \*dvp*, *struct vnode \*vp*, *struct componentname \*cnp*);

## DESCRIPTION

This links a new name in the specified directory to an existing file.

Its arguments are:

- *dvp*

  The vnode of the directory.

- *vp*

  The vnode of the file to be linked.

- *cnp*

  Pathname information about the file.

The pathname info should *not* be released on exit because it is done by the caller. The directory and file vnodes should *not* be released on exit.

## LOCKS

**VOP\_LINK**() expects the directory and file vnodes to be locked on entry and will leave the vnodes locked on return.

## RETURN VALUES

Zero is returned if the file was linked successfully, otherwise an error is returned.

## PSEUDOCODE

```
int
vop_link(struct vnode *dvp, struct vnode *vp, struct componentname *cnp)
{
    int error = 0;
    if (vp->v_mount != dvp->v_mount)
	return (EXDEV);
    if (vp would have too many links)
	return (EMLINK);
    if (vp is immutable)
	return (EPERM);
    /*
     * Increment link count of vp and write back the on-disc version of it.
     */
    ...;
    if (!error) {
	/*
	 * Add the new name to the directory.
	 */
	...;
    }
    return error;
}
```

## ERRORS

- \[EMLINK\]

  The file has too many links.

- \[EPERM\]

  The file is immutable.

- \[EXDEV\]

  A hard link is not possible between different file systems.

## SEE ALSO

[vn\_lock(9)](/vn_lock/9.md), [vnode(9)](/vnode/9.md)

## AUTHORS

This manual page was originally written by Doug Rabson.
