block: make ioc get/put interface more conventional and fix race on alloction
[linux-2.6-block.git] / block / blk-cgroup.c
index 8f630cec906e83f35b85df1a7437997dab9aae3d..4b001dcd85b0d903936a129197504ff82cd27669 100644 (file)
@@ -1645,11 +1645,12 @@ static void blkiocg_attach_task(struct cgroup *cgrp, struct task_struct *tsk)
 {
        struct io_context *ioc;
 
-       task_lock(tsk);
-       ioc = tsk->io_context;
-       if (ioc)
+       /* we don't lose anything even if ioc allocation fails */
+       ioc = get_task_io_context(tsk, GFP_ATOMIC, NUMA_NO_NODE);
+       if (ioc) {
                ioc->cgroup_changed = 1;
-       task_unlock(tsk);
+               put_io_context(ioc);
+       }
 }
 
 void blkio_policy_register(struct blkio_policy_type *blkiop)