This links a new name in the specified directory to an existing file.
Its arguments are:
Fa dvp
The vnode of the directory.
Fa vp
The vnode of the file to be linked.
Fa 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
Bq Er EMLINK
The file has too many links.
Bq Er EPERM
The file is immutable.
Bq Er EXDEV
A hard link is not possible between different file systems.