このページを編集する際は、編集に関する方針に従ってください。

概要

引数

  • root--radixツリーのroot
  • index--ページのインデックス
  • tag--タグインデックス
    • 以下の2つの状態を取る
      状態説明
      PAGECACHE_TAG_DIRTY0更新済みなページキャッシュ
      PAGECACHE_TAG_WRITEBACK1ライトバックなページキャッシュ

実装

/**

*	radix_tree_tag_set - set a tag on a radix tree node
*	@root:		radix tree root
*	@index:		index key
*	@tag: 		tag index
*
*	Set the search tag corresponging to @index in the radix tree.  From
*	the root all the way down to the leaf node.
*
*	Returns the address of the tagged item.   Setting a tag on a not-present
*	item is a bug.
*/

void *radix_tree_tag_set(struct radix_tree_root *root,

			unsigned long index, int tag)

{

	unsigned int height, shift;
	struct radix_tree_node **slot;
	height = root->height;
  • radixツリーの高さをheightに設定する
	if (index > radix_tree_maxindex(height))
		return NULL;
	shift = (height - 1) * RADIX_TREE_MAP_SHIFT;
  • ノードの高さによってindexをシフトさせる数を変える
    • 0.6,12,18,24・・・とshiftは6の倍数をとる
  • RADIX_TREE_MAP_SHIFTは6と定義されている
	slot = &root->rnode;
  • slotにrootノードを設定する
	while (height > 0) {
  • rootノードの高さが0以上である(つまり底ではない)場合
		int offset;
		offset = (index >> shift) & RADIX_TREE_MAP_MASK;
  • radixノードの(子ノードが登録されている)スロットのオフセットを割り出す
  • RADIX_TREE_MAP_MASKは(0000 0000 0000 0000 0000 0000 0011 1111)と定義
		tag_set(*slot, tag, offset);
  • タグ情報の更新
    • つまり子ノードの存在を登録する
  • ノードslotのタグtagのoffsetをセットする
		slot = (struct radix_tree_node **)((*slot)->slots + offset);
  • 子ノードを取得しslotに設定する
		BUG_ON(*slot == NULL);
  • 子ノードがNULLであればバグである
		shift -= RADIX_TREE_MAP_SHIFT;
  • shiftから6引く
    • RADIX_TREE_MAP_SHIFTは6と定義されている
		height--;
  • 高さを1下げる
    • 高いほどrootに近づく
	}
	return *slot;

}

EXPORT_SYMBOL(radix_tree_tag_set);

呼出元


履歴

  • 作者:ひら
  • 日付:2005/9/5
  • 対象:2.6.10
    更新日更新者更新内容

コメント



トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2009-11-24 (火) 07:17:32 (3129d)