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

概要

  • linux2.6/mm/memory.cにて定義
  • 引数で渡されたiノードのファイルサイズを引数で渡されたオフセットまで切り詰める
    • 正常に処理できた場合は0を返す

引数

  • inode--iノード
  • offset--オフセット(inodeのファイルサイズをこの値まで縮める)

実装

/*

* Handle all mappings that got truncated by a "truncate()"
* system call.
*
* NOTE! We have to be ready to update the memory sharing
* between the file and the memory map for a potential last
* incomplete page.  Ugly, but necessary.
*/

int vmtruncate(struct inode * inode, loff_t offset) {

	struct address_space *mapping = inode->i_mapping;
  • アドレス空間オブジェクト
    • ページキャッシュを構成する構造体
      • ページキャッシュはinode番号とファイルオフセットをインデックスとするファイルのキャッシュである
    • address_space/linux2.6を参照
	unsigned long limit;
	if (inode->i_size < offset)
		goto do_expand;
	/*
	 * truncation of in-use swapfiles is disallowed - it would cause
	 * subsequent swapout to scribble on the now-freed blocks.
	 */
	if (IS_SWAPFILE(inode))
		goto out_busy;
	i_size_write(inode, offset);
	unmap_mapping_range(mapping, offset + PAGE_SIZE - 1, 0, 1);
  • アドレス空間から、アンマップ領域( (offset + PAGE_SIZE - 1)から該当するメモリリージョンの最後まで)の物理ページ(ページフレーム)とのマッピングを解除する
	truncate_inode_pages(mapping, offset);
  • アドレス空間オブジェクトmappingのiノードに対応するページ群を、デバイスとのマッピングを解き解放する
	goto out_truncate;

do_expand:

	limit = current->signal->rlim[RLIMIT_FSIZE].rlim_cur;
	if (limit != RLIM_INFINITY && offset > limit)
		goto out_sig;
	if (offset > inode->i_sb->s_maxbytes)
		goto out_big;
	i_size_write(inode, offset);

out_truncate:

	if (inode->i_op && inode->i_op->truncate)
		inode->i_op->truncate(inode);
  • inodeのファイルサイズを切りつめる
	return 0;

out_sig:

	send_sig(SIGXFSZ, current, 0);
  • カレントタスクに対してシグナルを送信する
  • SIGXFSZはファイルサイズの制限を超えたことを意味する

out_big:

	return -EFBIG;

out_busy:

	return -ETXTBSY;

}

EXPORT_SYMBOL(vmtruncate);

呼出元


履歴

  • 作者:ひら
  • 日付:2006/10/6
  • 対象:2.6.10
    更新日更新者更新内容

コメント/タグ?



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