スポンサーリンク

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

名称

VOP_GETPAGES, VOP_PUTPAGES − ファイルから VM ページへの読み込みまたは書き 込み

書式

#include <sys/param.h>
#include <sys/vnode.h>
#include <vm/vm.h>

int

VOP_GETPAGES(struct vnode *vp, vm_page_t *m, int count, int reqpage, vm_ooffset_t offset);

int

VOP_PUTPAGES(struct vnode *vp, vm_page_t *m, int count, int sync, int *rtvals, vm_ooffset_t offset);

解説

VOP_GETPAGES() メソッドは、通常のファイルが背後にある仮想メモリのページの 読み込みのために、呼び出されます。他の隣接したページの背後に同じファイル の隣接した領域がある場合には、 VOP_GETPAGES() は同様にそれらのページを読 み込ませるために要求されますが、そうすることが必須なわけではありません。 VOP_PUTPAGES() メソッドは反対のことを行います。すなわち、仮想メモリの隣接 したダーティなページを書き出させます。

入る時に、vnode のロックは保持されますが、ページキューと VM オブジェクト のロックはどちらも保持されません。両方のメソッドは、成功して戻る時とエ ラーで戻る時と両方とも、そのままの状態で戻ります。

引数は以下の通りです。

       vp

アクセスするファイル。

m
読み込まれるまたは書き込まれるべきファイルの連続した領域を表現す る連続したページの配列の最初の要素へのポインタです。

count
その配列の中のページ数です。

sync
書き込みが同期されるべき場合には VM_PAGER_PUT_SYNC です。

rtvals
VOP_PUTPAGES
() によって書き込まれたそれぞれのページの状態を示し ている VM システムの結果コードの配列です。

reqpage
ページ配列の中の要求されたページのインデックスです。すなわち、こ のメソッドの実装が取り扱わなければならない、1 ページです。

offset
ファイルの中のそのマップされたページが始まる場所へのオフセットで す。

VOP_PUTPAGES() メソッドの状態は、配列 rtvals[] の中に、個々のページごとに 返されます。起こり得る状態値は以下の通りです。

VM_PAGER_OK
そのページは成功して書き込まれました。実装はそのページが クリーンであることを記録するために vm_pager_undirty(9) を 呼び出さなければなりません。

VM_PAGER_PEND
そのページは非同期に書き込まれるようにスケジュールされま した。書き込みが完了した時には、完了コールバックはビジー フラグをクリアし、このページをウェイトしている他のスレッ ドを起こすために、 vm_object_pip_wakeup(9) および vm_page_io_finish(9) を呼び出すべきです。さらに vm_page_undirty(9) を呼び出します。

VM_PAGER_BAD
このページは完全に背後にあるファイルの終端を越えていまし た。その vnode のファイルシステムが正しく実装されている場 合には、この状態は起こり得るべきではありません。

VM_PAGER_ERROR
下位の保存メディアまたはプロトコルのエラーのため、この ページは書き込まれることが出来ませんでした。

VM_PAGER_FAIL
VM_PAGER_ERROR と同様に取り扱われました。 VM_PAGER_ERROR

VM_PAGER_AGAIN
そのページはこの要求によって取り扱われませんでした。

戻り値

成功して m[reqpage] を読み込んだ場合には VOP_GETPAGES() は VM_PAGER_OK を 返し、そうでない場合には VM_PAGER_ERROR を返します。慣習で、 VOP_PUTPAGES() の戻り値は rtvals[0] です。

関連項目

vm_object_pip_wakeup(9), vm_page_free(9), vm_page_io_finish(9), vm_page_undirty(9), vm_page_wakeup(9), vnode(9)

作者

このマニュアルページは Doug Rabson が書き、その後実質上
Garrett Wollman が書き直しました。

FreeBSD 10.0 September 27, 2003 FreeBSD 10.0

スポンサーリンク