From: Jeremy Fitzhardinge Date: Thu, 29 Jan 2009 00:50:20 +0000 (-0800) Subject: xen: make sysfs files behave as their names suggest X-Git-Tag: v2.6.28.4~32 X-Git-Url: https://git.karo-electronics.de/?a=commitdiff_plain;h=06332b60cc1565fcc7d78a277007530842772a5c;p=karo-tx-linux.git xen: make sysfs files behave as their names suggest commit 618b2c8db24522ae273d8299c6a936ea13793c4d upstream. 1: make "target_kb" only accept and produce a memory size in kilobytes. 2: add a second "target" file which produces output in bytes, and will accept memparse input (scaled bytes) This fixes the rather irritating problem that writing the same value read back into target_kb would end up shrinking the domain by a factor of 1024, with generally bad results. Signed-off-by: Jeremy Fitzhardinge Cc: "dan.magenheimer@oracle.com" Signed-off-by: Ingo Molnar Signed-off-by: Greg Kroah-Hartman --- diff --git a/drivers/xen/balloon.c b/drivers/xen/balloon.c index 526c191e84ea..ae2e3f8c83b6 100644 --- a/drivers/xen/balloon.c +++ b/drivers/xen/balloon.c @@ -488,7 +488,7 @@ static ssize_t store_target_kb(struct sys_device *dev, if (!capable(CAP_SYS_ADMIN)) return -EPERM; - target_bytes = memparse(buf, &endchar); + target_bytes = simple_strtoull(buf, &endchar, 0) * 1024; balloon_set_new_target(target_bytes >> PAGE_SHIFT); @@ -498,8 +498,39 @@ static ssize_t store_target_kb(struct sys_device *dev, static SYSDEV_ATTR(target_kb, S_IRUGO | S_IWUSR, show_target_kb, store_target_kb); + +static ssize_t show_target(struct sys_device *dev, struct sysdev_attribute *attr, + char *buf) +{ + return sprintf(buf, "%llu\n", + (u64)balloon_stats.target_pages << PAGE_SHIFT); +} + +static ssize_t store_target(struct sys_device *dev, + struct sysdev_attribute *attr, + const char *buf, + size_t count) +{ + char *endchar; + unsigned long long target_bytes; + + if (!capable(CAP_SYS_ADMIN)) + return -EPERM; + + target_bytes = memparse(buf, &endchar); + + balloon_set_new_target(target_bytes >> PAGE_SHIFT); + + return count; +} + +static SYSDEV_ATTR(target, S_IRUGO | S_IWUSR, + show_target, store_target); + + static struct sysdev_attribute *balloon_attrs[] = { &attr_target_kb, + &attr_target, }; static struct attribute *balloon_info_attrs[] = {