Merge branch 'for-3.11-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/tj...
authorLinus Torvalds <torvalds@linux-foundation.org>
Tue, 23 Jul 2013 22:48:35 +0000 (15:48 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Tue, 23 Jul 2013 22:48:35 +0000 (15:48 -0700)
Pull cgroup changes from Tejun Heo:
 "This contains two patches, both of which aren't fixes per-se but I
  think it'd be better to fast-track them.

  One removes bcache_subsys_id which was added without proper review
  through the block tree.  Fortunately, bcache cgroup code is
  unconditionally disabled, so this was never exposed to userland.  The
  cgroup subsys_id is removed.  Kent will remove the affected (disabled)
  code through bcache branch.

  The other simplifies task_group_path_from_hierarchy().  The function
  doesn't currently have in-kernel users but there are external code and
  development going on dependent on the function and making the function
  available for 3.11 would make things go smoother"

* 'for-3.11-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/cgroup:
  cgroup: replace task_cgroup_path_from_hierarchy() with task_cgroup_path()
  cgroup: remove bcache_subsys_id which got added stealthily

1  2 
include/linux/cgroup.h
kernel/cgroup.c

diff --combined include/linux/cgroup.h
@@@ -278,8 -278,6 +278,8 @@@ enum 
         *
         * - memcg: use_hierarchy is on by default and the cgroup file for
         *   the flag is not created.
 +       *
 +       * - blkcg: blk-throttle becomes properly hierarchical.
         */
        CGRP_ROOT_SANE_BEHAVIOR = (1 << 0),
  
@@@ -542,8 -540,7 +542,7 @@@ int cgroup_rm_cftypes(struct cgroup_sub
  bool cgroup_is_descendant(struct cgroup *cgrp, struct cgroup *ancestor);
  
  int cgroup_path(const struct cgroup *cgrp, char *buf, int buflen);
- int task_cgroup_path_from_hierarchy(struct task_struct *task, int hierarchy_id,
-                                   char *buf, size_t buflen);
+ int task_cgroup_path(struct task_struct *task, char *buf, size_t buflen);
  
  int cgroup_task_count(const struct cgroup *cgrp);
  
diff --combined kernel/cgroup.c
@@@ -802,6 -802,7 +802,6 @@@ static struct cgroup *task_cgroup_from_
   */
  
  static int cgroup_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode);
 -static struct dentry *cgroup_lookup(struct inode *, struct dentry *, unsigned int);
  static int cgroup_rmdir(struct inode *unused_dir, struct dentry *dentry);
  static int cgroup_populate_dir(struct cgroup *cgrp, bool base_files,
                               unsigned long subsys_mask);
  EXPORT_SYMBOL_GPL(cgroup_path);
  
  /**
-  * task_cgroup_path_from_hierarchy - cgroup path of a task on a hierarchy
+  * task_cgroup_path - cgroup path of a task in the first cgroup hierarchy
   * @task: target task
-  * @hierarchy_id: the hierarchy to look up @task's cgroup from
   * @buf: the buffer to write the path into
   * @buflen: the length of the buffer
   *
-  * Determine @task's cgroup on the hierarchy specified by @hierarchy_id and
-  * copy its path into @buf.  This function grabs cgroup_mutex and shouldn't
-  * be used inside locks used by cgroup controller callbacks.
+  * Determine @task's cgroup on the first (the one with the lowest non-zero
+  * hierarchy_id) cgroup hierarchy and copy its path into @buf.  This
+  * function grabs cgroup_mutex and shouldn't be used inside locks used by
+  * cgroup controller callbacks.
+  *
+  * Returns 0 on success, fails with -%ENAMETOOLONG if @buflen is too short.
   */
- int task_cgroup_path_from_hierarchy(struct task_struct *task, int hierarchy_id,
-                                   char *buf, size_t buflen)
+ int task_cgroup_path(struct task_struct *task, char *buf, size_t buflen)
  {
        struct cgroupfs_root *root;
-       struct cgroup *cgrp = NULL;
-       int ret = -ENOENT;
+       struct cgroup *cgrp;
+       int hierarchy_id = 1, ret = 0;
+       if (buflen < 2)
+               return -ENAMETOOLONG;
  
        mutex_lock(&cgroup_mutex);
  
-       root = idr_find(&cgroup_hierarchy_idr, hierarchy_id);
+       root = idr_get_next(&cgroup_hierarchy_idr, &hierarchy_id);
        if (root) {
                cgrp = task_cgroup_from_root(task, root);
                ret = cgroup_path(cgrp, buf, buflen);
+       } else {
+               /* if no hierarchy exists, everyone is in "/" */
+               memcpy(buf, "/", 2);
        }
  
        mutex_unlock(&cgroup_mutex);
        return ret;
  }
- EXPORT_SYMBOL_GPL(task_cgroup_path_from_hierarchy);
+ EXPORT_SYMBOL_GPL(task_cgroup_path);
  
  /*
   * Control Group taskset
@@@ -2641,7 -2649,7 +2648,7 @@@ static const struct inode_operations cg
  };
  
  static const struct inode_operations cgroup_dir_inode_operations = {
 -      .lookup = cgroup_lookup,
 +      .lookup = simple_lookup,
        .mkdir = cgroup_mkdir,
        .rmdir = cgroup_rmdir,
        .rename = cgroup_rename,
        .removexattr = cgroup_removexattr,
  };
  
 -static struct dentry *cgroup_lookup(struct inode *dir, struct dentry *dentry, unsigned int flags)
 -{
 -      if (dentry->d_name.len > NAME_MAX)
 -              return ERR_PTR(-ENAMETOOLONG);
 -      d_add(dentry, NULL);
 -      return NULL;
 -}
 -
  /*
   * Check if a file is a control file
   */