読者です 読者をやめる 読者になる 読者になる

linux 3.3のcopy_io()

kernel linux

kernel/fork.cのcopy_io()って3.2.7から多少変わってるんだけど、else if文に入ったときにtsk->io_contextにデータ設定しないのかな? tsk->io_context = new_iocとか。

static int copy_io(unsigned long clone_flags, struct task_struct *tsk)
{
#ifdef CONFIG_BLOCK
        struct io_context *ioc = current->io_context;
        struct io_context *new_ioc;

        if (!ioc)
                return 0;
        /*
         * Share io context with parent, if CLONE_IO is set
         */
        if (clone_flags & CLONE_IO) {
                tsk->io_context = ioc_task_link(ioc);
                if (unlikely(!tsk->io_context))
                        return -ENOMEM;
        } else if (ioprio_valid(ioc->ioprio)) {
                new_ioc = get_task_io_context(tsk, GFP_KERNEL, NUMA_NO_NODE);
                if (unlikely(!new_ioc))
                        return -ENOMEM;

                new_ioc->ioprio = ioc->ioprio;
                put_io_context(new_ioc);
        }
#endif
        return 0;
}

3.2.7だとtsk->io_contextにデータが設定されるようになってるけど。

 } else if (ioprio_valid(ioc->ioprio)) {
                tsk->io_context = alloc_io_context(GFP_KERNEL, -1);
                if (unlikely(!tsk->io_context))
                        return -ENOMEM;

                tsk->io_context->ioprio = ioc->ioprio;
 }