* we will to add it back at the end of reclaim to its correct
         * position in the tree.
         */
 -      __mem_cgroup_remove_exceeded(mz->memcg, mz, mctz);
 +      __mem_cgroup_remove_exceeded(mz, mctz);
        if (!res_counter_soft_limit_excess(&mz->memcg->res) ||
-               !css_tryget(&mz->memcg->css))
+           !css_tryget_online(&mz->memcg->css))
                goto retry;
  done:
        return mz;
  
        rcu_read_lock();
        do {
 -              memcg = mem_cgroup_from_task(rcu_dereference(mm->owner));
 -              if (unlikely(!memcg))
 +              /*
 +               * Page cache insertions can happen withou an
 +               * actual mm context, e.g. during disk probing
 +               * on boot, loopback IO, acct() writes etc.
 +               */
 +              if (unlikely(!mm))
                        memcg = root_mem_cgroup;
-       } while (!css_tryget(&memcg->css));
 +              else {
 +                      memcg = mem_cgroup_from_task(rcu_dereference(mm->owner));
 +                      if (unlikely(!memcg))
 +                              memcg = root_mem_cgroup;
 +              }
+       } while (!css_tryget_online(&memcg->css));
        rcu_read_unlock();
        return memcg;
  }
  int mem_cgroup_swappiness(struct mem_cgroup *memcg)
  {
        /* root ? */
-       if (mem_cgroup_disabled() || !css_parent(&memcg->css))
 -      if (!memcg->css.parent)
++      if (mem_cgroup_disabled() || !memcg->css.parent)
                return vm_swappiness;
  
        return memcg->swappiness;
                                       struct cftype *cft, u64 val)
  {
        struct mem_cgroup *memcg = mem_cgroup_from_css(css);
 -      struct mem_cgroup *parent = mem_cgroup_from_css(memcg->css.parent);
 -
 -      if (val > 100 || !parent)
 -              return -EINVAL;
  
 -      mutex_lock(&memcg_create_mutex);
 -
 -      /* If under hierarchy, only empty-root can set this value */
 -      if ((parent->use_hierarchy) || memcg_has_children(memcg)) {
 -              mutex_unlock(&memcg_create_mutex);
 +      if (val > 100)
                return -EINVAL;
 -      }
  
-       if (css_parent(css))
 -      memcg->swappiness = val;
 -
 -      mutex_unlock(&memcg_create_mutex);
++      if (css->parent)
 +              memcg->swappiness = val;
 +      else
 +              vm_swappiness = val;
  
        return 0;
  }
        struct cftype *cft, u64 val)
  {
        struct mem_cgroup *memcg = mem_cgroup_from_css(css);
 -      struct mem_cgroup *parent = mem_cgroup_from_css(memcg->css.parent);
  
        /* cannot set to root cgroup and only 0 and 1 are allowed */
-       if (!css_parent(css) || !((val == 0) || (val == 1)))
 -      if (!parent || !((val == 0) || (val == 1)))
++      if (!css->parent || !((val == 0) || (val == 1)))
                return -EINVAL;
  
 -      mutex_lock(&memcg_create_mutex);
 -      /* oom-kill-disable is a flag for subhierarchy. */
 -      if ((parent->use_hierarchy) || memcg_has_children(memcg)) {
 -              mutex_unlock(&memcg_create_mutex);
 -              return -EINVAL;
 -      }
        memcg->oom_kill_disable = val;
        if (!val)
                memcg_oom_recover(memcg);