blkcg: simplify blkg_conf_prep()
authorTejun Heo <tj@kernel.org>
Sun, 1 Apr 2012 21:38:43 +0000 (14:38 -0700)
committerTejun Heo <tj@kernel.org>
Sun, 1 Apr 2012 21:38:43 +0000 (14:38 -0700)
blkg_conf_prep() implements "MAJ:MIN VAL" parsing manually, which is
unnecessary.  Just use sscanf("%u:%u %llu").  This might not reject
some malformed input (extra input at the end) but we don't care.

Signed-off-by: Tejun Heo <tj@kernel.org>
block/blk-cgroup.c

index 1e1ee2af7b5fbf97b8942a0ea3bb2fcdfedef717..b07a501839e7be140a32ce599947a45611facede 100644 (file)
@@ -987,57 +987,16 @@ static int blkg_conf_prep(struct blkio_cgroup *blkcg, const char *input,
 {
        struct gendisk *disk;
        struct blkio_group *blkg;
-       char *buf, *s[4], *p, *major_s, *minor_s;
-       unsigned long major, minor;
-       int i = 0, ret = -EINVAL;
-       int part;
-       dev_t dev;
-       u64 temp;
+       unsigned int major, minor;
+       unsigned long long v;
+       int part, ret;
 
-       buf = kstrdup(input, GFP_KERNEL);
-       if (!buf)
-               return -ENOMEM;
-
-       memset(s, 0, sizeof(s));
-
-       while ((p = strsep(&buf, " ")) != NULL) {
-               if (!*p)
-                       continue;
-
-               s[i++] = p;
-
-               /* Prevent from inputing too many things */
-               if (i == 3)
-                       break;
-       }
-
-       if (i != 2)
-               goto out;
-
-       p = strsep(&s[0], ":");
-       if (p != NULL)
-               major_s = p;
-       else
-               goto out;
-
-       minor_s = s[0];
-       if (!minor_s)
-               goto out;
-
-       if (strict_strtoul(major_s, 10, &major))
-               goto out;
-
-       if (strict_strtoul(minor_s, 10, &minor))
-               goto out;
-
-       dev = MKDEV(major, minor);
-
-       if (strict_strtoull(s[1], 10, &temp))
-               goto out;
+       if (sscanf(input, "%u:%u %llu", &major, &minor, &v) != 3)
+               return -EINVAL;
 
-       disk = get_gendisk(dev, &part);
+       disk = get_gendisk(MKDEV(major, minor), &part);
        if (!disk || part)
-               goto out;
+               return -EINVAL;
 
        rcu_read_lock();
 
@@ -1059,16 +1018,13 @@ static int blkg_conf_prep(struct blkio_cgroup *blkcg, const char *input,
                        msleep(10);
                        ret = restart_syscall();
                }
-               goto out;
+               return ret;
        }
 
        ctx->disk = disk;
        ctx->blkg = blkg;
-       ctx->v = temp;
-       ret = 0;
-out:
-       kfree(buf);
-       return ret;
+       ctx->v = v;
+       return 0;
 }
 
 /**