Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael...
authorLinus Torvalds <torvalds@linux-foundation.org>
Fri, 27 May 2011 21:27:34 +0000 (14:27 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Fri, 27 May 2011 21:27:34 +0000 (14:27 -0700)
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/suspend-2.6:
  PM: Fix PM QOS's user mode interface to work with ASCII input
  PM / Hibernate: Update kerneldoc comments in hibernate.c
  PM / Hibernate: Remove arch_prepare_suspend()
  PM / Hibernate: Update some comments in core hibernate code

1  2 
kernel/pm_qos_params.c

diff --combined kernel/pm_qos_params.c
@@@ -40,6 -40,7 +40,7 @@@
  #include <linux/string.h>
  #include <linux/platform_device.h>
  #include <linux/init.h>
+ #include <linux/kernel.h>
  
  #include <linux/uaccess.h>
  
@@@ -385,7 -386,7 +386,7 @@@ static ssize_t pm_qos_power_read(struc
        s32 value;
        unsigned long flags;
        struct pm_qos_object *o;
 -      struct pm_qos_request_list *pm_qos_req = filp->private_data;;
 +      struct pm_qos_request_list *pm_qos_req = filp->private_data;
  
        if (!pm_qos_req)
                return -EINVAL;
@@@ -404,24 -405,36 +405,36 @@@ static ssize_t pm_qos_power_write(struc
                size_t count, loff_t *f_pos)
  {
        s32 value;
-       int x;
-       char ascii_value[11];
        struct pm_qos_request_list *pm_qos_req;
  
        if (count == sizeof(s32)) {
                if (copy_from_user(&value, buf, sizeof(s32)))
                        return -EFAULT;
-       } else if (count == 11) { /* len('0x12345678/0') */
-               if (copy_from_user(ascii_value, buf, 11))
+       } else if (count <= 11) { /* ASCII perhaps? */
+               char ascii_value[11];
+               unsigned long int ulval;
+               int ret;
+               if (copy_from_user(ascii_value, buf, count))
                        return -EFAULT;
-               if (strlen(ascii_value) != 10)
-                       return -EINVAL;
-               x = sscanf(ascii_value, "%x", &value);
-               if (x != 1)
+               if (count > 10) {
+                       if (ascii_value[10] == '\n')
+                               ascii_value[10] = '\0';
+                       else
+                               return -EINVAL;
+               } else {
+                       ascii_value[count] = '\0';
+               }
+               ret = strict_strtoul(ascii_value, 16, &ulval);
+               if (ret) {
+                       pr_debug("%s, 0x%lx, 0x%x\n", ascii_value, ulval, ret);
                        return -EINVAL;
-               pr_debug("%s, %d, 0x%x\n", ascii_value, x, value);
-       } else
+               }
+               value = (s32)lower_32_bits(ulval);
+       } else {
                return -EINVAL;
+       }
  
        pm_qos_req = filp->private_data;
        pm_qos_update_request(pm_qos_req, value);