vop_create(9)
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) 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 thevnode
* hits the disk before the directory contents arechanged.
*/- 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
HISTORY
The function VOP_CREATE appeared in 4.3BSD.
AUTHORS
- This manual page was written by Doug Rabson.
- BSD July 24, 1996