スポンサーリンク

VOP_CREATE(9) FreeBSD カーネル開発者マニュアル VOP_CREATE(9)

名称

VOP_CREATE, VOP_MKNOD, VOP_MKDIR, VOP_SYMLINK − ファイル、ソケッ ト、FIFO、デバイス、ディレクトリまたはシンボリックリンクの作成

書式

#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);

解説

これらのエントリポイントは、新しいファイル、ソケット、FIFO、デバイス、 ディレクトリまたはシンボリックリンクを、指定されたディレクトリの中に作成 します。

引数は以下の通りです。

       dvp

ディレクトリのロックされた vnode。

vpp
作成結果のロックされた vnode が格納されるべき、変数のアドレス。

cnp
生成された要素のパス名。

vap
新しいオブジェクトの作成時に使用されるべき属性。

target
シンボリックリンクの対象のパス名。

これらのエントリポイントは、オブジェクトの生成中に VOP_LOOKUP(9) の後に呼 び出されます。

ロック

ディレクトリ dvp は入る時にロックされ、戻る時にもロックされ続けてなければ なりません。呼び出しが成功の場合には、新しいオブジェクトがロックされて返 されます。

戻り値

成功時には、新しいオブジェクトの vnode が *vpp に置かれ、0 が返されます。 そうでない場合には、適切なエラーが返されます。

疑似コード

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;

/*
* 新しい vnode のパーミッションを更新します。
* これには、ディレクトリからのグループのコピーを含みます。
*/
...;

#ifdef QUOTA
/*
* できる限りクォータ情報をチェックします。
*/
...;
#endif

/*
* ディレクトリに新しい vnode を入れ、ディレクトリ内容が変更される
* 前に vnode がディスクをアクセスしない様に注意します。
*/
error = ...;

if (error)

goto bad;

*vpp = vp;

return 0;

bad:
/*
* inode またはディレクトリの更新の試みで書き込みエラーが
* 発生したため inode の割り当てを解放しなければなりません。
*/
vput(vp);

/*
* vp のためのファイルシステム資源を解放。
*/
...;

return error;
}

エラー

       [ENOSPC]

ファイルシステムが一杯です。

[EDQUOT]
そのユーザのファイルシステム空間または inode のクォー タを超過しました。

関連項目

VOP_LOOKUP(9,) vnode(9)

歴史

関数 VOP_CREATE は 4.3BSD で登場しました。

作者

このマニュアルページは Doug Rabson が書きました。

FreeBSD 10.0 July 24, 1996 FreeBSD 10.0

スポンサーリンク