*参照元 [#u41288d2]
#backlinks

*説明 [#v65b8885]
-パス: [[linux-2.6.33/fs/file_table.c]]

-ファイルディスクリプタからファイル構造体を得る。
--FIXME: 説明
--fput_light() と対にして使う。
--[[linux-2.6.33/fput_light()]]


**引数 [#h1687e98]
-unsigned int fd
--ファイルディスクリプタ
-int *fput_needed
--fput を発行する必要があるか否か、が返ってくる


**返り値 [#wd511462]
-struct file *
--ファイル


**参考 [#n4c6f5b5]


*実装 [#vcd6d128]
 /*
  * Lightweight file lookup - no refcnt increment if fd table isn't shared. 
  * You can use this only if it is guranteed that the current task already 
  * holds a refcnt to that file. That check has to be done at fget() only
  * and a flag is returned to be passed to the corresponding fput_light().
  * There must not be a cloning between an fget_light/fput_light pair.
  */
 struct file *fget_light(unsigned int fd, int *fput_needed)
 {
 	struct file *file;
-ファイル
--[[linux-2.6.33/file]]

 	struct files_struct *files = current->files;
 
-
--[[linux-2.6.33/files_struct]]

 	*fput_needed = 0;
 	if (likely((atomic_read(&files->count) == 1))) {
-現在開いているファイルのテーブルの利用数が、
1だった(=つまり自分しか利用していない)場合。
-多くの場合、こちらに来ることを期待している。
--[[linux-2.6.33/likely()]]
--[[linux-2.6.33/atomic_read()]]

 		file = fcheck_files(files, fd);
-
--[[linux-2.6.33/fcheck_files()]]

 	} else {
 		rcu_read_lock();
-
--[[linux-2.6.33/rcu_read_lock()]]

 		file = fcheck_files(files, fd);
-
--[[linux-2.6.33/fcheck_files()]]

 		if (file) {
 			if (atomic_long_inc_not_zero(&file->f_count))
 				*fput_needed = 1;
 			else
 				/* Didn't get the reference, someone's freed */
 				file = NULL;
-
--[[linux-2.6.33/atomic_long_inc_not_zero()]]

 		}
 		rcu_read_unlock();
-
--[[linux-2.6.33/rcu_read_unlock()]]

 	}
 
 	return file;
 }


*コメント [#s720c8b8]

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS