*参照元 [#ffaac8d8]
#backlinks

*説明 [#x26b62d5]
-パス: [[linux-2.6.33/mm/filemap.c]]

-FIXME: これは何?
--説明


**引数 [#c26bab74]
-read_descriptor_t *desc
--
--[[linux-2.6.33/read_descriptor_t]]
-struct page *page
--
--[[linux-2.6.33/page]]
-unsigned long offset
--
-unsigned long size
--


**返り値 [#d52dff5f]
-int
--


**参考 [#n38c9717]


*実装 [#gb8a6a80]
 int file_read_actor(read_descriptor_t *desc, struct page *page,
 			unsigned long offset, unsigned long size)
 {
 	char *kaddr;
 	unsigned long left, count = desc->count;
 
 	if (size > count)
 		size = count;
 
 	/*
 	 * Faults on the destination of a read are common, so do it before
 	 * taking the kmap.
 	 */
 	if (!fault_in_pages_writeable(desc->arg.buf, size)) {
-
--[[linux-2.6.33/fault_in_pages_writeable()]]

 		kaddr = kmap_atomic(page, KM_USER0);
 		left = __copy_to_user_inatomic(desc->arg.buf,
 						kaddr + offset, size);
 		kunmap_atomic(kaddr, KM_USER0);
-
--[[linux-2.6.33/kmap_atomic()]]
--[[linux-2.6.33/__copy_to_user_inatomic()]]
--[[linux-2.6.33/kunmap_atomic()]]

 		if (left == 0)
 			goto success;
 	}
 
 	/* Do it the slow way */
 	kaddr = kmap(page);
 	left = __copy_to_user(desc->arg.buf, kaddr + offset, size);
 	kunmap(page);
 
-
--[[linux-2.6.33/kmap()]]
--[[linux-2.6.33/__copy_to_user()]]
--[[linux-2.6.33/kunmap()]]

 	if (left) {
 		size -= left;
 		desc->error = -EFAULT;
 	}
 success:
 	desc->count = count - size;
 	desc->written += size;
 	desc->arg.buf += size;
 	return size;
 }


*コメント [#z06d1b52]


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