*参照元 [#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]