|
@@ -13,6 +13,7 @@
|
|
|
#include <linux/slab.h>
|
|
|
#include <linux/res_counter.h>
|
|
|
#include <linux/uaccess.h>
|
|
|
+#include <linux/mm.h>
|
|
|
|
|
|
void res_counter_init(struct res_counter *counter)
|
|
|
{
|
|
@@ -102,44 +103,37 @@ u64 res_counter_read_u64(struct res_counter *counter, int member)
|
|
|
return *res_counter_member(counter, member);
|
|
|
}
|
|
|
|
|
|
-ssize_t res_counter_write(struct res_counter *counter, int member,
|
|
|
- const char __user *userbuf, size_t nbytes, loff_t *pos,
|
|
|
- int (*write_strategy)(char *st_buf, unsigned long long *val))
|
|
|
+int res_counter_memparse_write_strategy(const char *buf,
|
|
|
+ unsigned long long *res)
|
|
|
{
|
|
|
- int ret;
|
|
|
- char *buf, *end;
|
|
|
- unsigned long flags;
|
|
|
- unsigned long long tmp, *val;
|
|
|
-
|
|
|
- buf = kmalloc(nbytes + 1, GFP_KERNEL);
|
|
|
- ret = -ENOMEM;
|
|
|
- if (buf == NULL)
|
|
|
- goto out;
|
|
|
+ char *end;
|
|
|
+ /* FIXME - make memparse() take const char* args */
|
|
|
+ *res = memparse((char *)buf, &end);
|
|
|
+ if (*end != '\0')
|
|
|
+ return -EINVAL;
|
|
|
|
|
|
- buf[nbytes] = '\0';
|
|
|
- ret = -EFAULT;
|
|
|
- if (copy_from_user(buf, userbuf, nbytes))
|
|
|
- goto out_free;
|
|
|
+ *res = PAGE_ALIGN(*res);
|
|
|
+ return 0;
|
|
|
+}
|
|
|
|
|
|
- ret = -EINVAL;
|
|
|
+int res_counter_write(struct res_counter *counter, int member,
|
|
|
+ const char *buf, write_strategy_fn write_strategy)
|
|
|
+{
|
|
|
+ char *end;
|
|
|
+ unsigned long flags;
|
|
|
+ unsigned long long tmp, *val;
|
|
|
|
|
|
- strstrip(buf);
|
|
|
if (write_strategy) {
|
|
|
- if (write_strategy(buf, &tmp)) {
|
|
|
- goto out_free;
|
|
|
- }
|
|
|
+ if (write_strategy(buf, &tmp))
|
|
|
+ return -EINVAL;
|
|
|
} else {
|
|
|
tmp = simple_strtoull(buf, &end, 10);
|
|
|
if (*end != '\0')
|
|
|
- goto out_free;
|
|
|
+ return -EINVAL;
|
|
|
}
|
|
|
spin_lock_irqsave(&counter->lock, flags);
|
|
|
val = res_counter_member(counter, member);
|
|
|
*val = tmp;
|
|
|
spin_unlock_irqrestore(&counter->lock, flags);
|
|
|
- ret = nbytes;
|
|
|
-out_free:
|
|
|
- kfree(buf);
|
|
|
-out:
|
|
|
- return ret;
|
|
|
+ return 0;
|
|
|
}
|