DragonFly On-Line Manual Pages

VOP_LINK(9)	      DragonFly Kernel Developer's Manual	   VOP_LINK(9)


VOP_LINK -- create a new name for a file


#include <sys/param.h> #include <sys/vnode.h> int VOP_LINK(struct vnode *dvp, struct vnode *vp, struct componentname *cnp);


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 must be released on exit. The directory and file vnodes should NOT be released on exit.


The directory, dvp is locked on entry and should remain locked on return. The file vp is not locked on entry and should remain that way on return. If your VOP code locks vp, it must be sure to unlock prior to returning.


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


int vop_link(struct vnode *dvp, struct vnode *vp, struct componentname *cnp) { int error = 0; if (vp->v_mount != dvp->v_mount) { VOP_ABORTOP(dvp, cnp); error = EXDEV; goto out2; } if (vp != dvp && (error = VOP_LOCK(vp))) { VOP_ABORTOP(dvp, cnp); goto out2; } /* * now that we've locked vp, we have to use out1 instead of out2 */ if (vp would have too many links) { VOP_ABORTOP(dvp, cnp); error = EMLINK; goto out1; } if (vp is immutable) { VOP_ABORTOP(dvp, cnp); error = EPERM; goto out1; } /* * Increment link count of vp and write back the on-disc version of it. */ ...; if (!error) { /* * Add the new name to the directory. */ ...; } kfree(cnp->cn_pnbuf, M_NAMEI); out1: if (vp != dvp) VOP_UNLOCK(vp); out2: return error; }


[EPERM] the file is immutable


vnode(9), vn_lock(9)


This man page was originally written by Doug Rabson. DragonFly 3.7 July 24, 1996 DragonFly 3.7