s390/appldata: reuse generic proc handler functions
authorVasily Gorbik <gor@linux.ibm.com>
Sun, 1 Jul 2018 14:59:44 +0000 (16:59 +0200)
committerMartin Schwidefsky <schwidefsky@de.ibm.com>
Fri, 6 Jul 2018 06:48:08 +0000 (08:48 +0200)
Simplify appldata proc handlers by reusing generic proc handler functions.

Tested-by: Gerald Schaefer <gerald.schaefer@de.ibm.com>
Reviewed-by: Gerald Schaefer <gerald.schaefer@de.ibm.com>
Signed-off-by: Vasily Gorbik <gor@linux.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
arch/s390/appldata/appldata_base.c

index 25c1399..9bf8489 100644 (file)
@@ -206,34 +206,28 @@ static int
 appldata_timer_handler(struct ctl_table *ctl, int write,
                           void __user *buffer, size_t *lenp, loff_t *ppos)
 {
-       unsigned int len;
-       char buf[2];
+       int timer_active = appldata_timer_active;
+       int zero = 0;
+       int one = 1;
+       int rc;
+       struct ctl_table ctl_entry = {
+               .procname       = ctl->procname,
+               .data           = &timer_active,
+               .maxlen         = sizeof(int),
+               .extra1         = &zero,
+               .extra2         = &one,
+       };
+
+       rc = proc_douintvec_minmax(&ctl_entry, write, buffer, lenp, ppos);
+       if (rc < 0 || !write)
+               return rc;
 
-       if (!*lenp || *ppos) {
-               *lenp = 0;
-               return 0;
-       }
-       if (!write) {
-               memcpy(buf, appldata_timer_active ? "1\n" : "0\n", ARRAY_SIZE(buf));
-               len = strnlen(buf, ARRAY_SIZE(buf));
-               if (len > *lenp)
-                       len = *lenp;
-               if (copy_to_user(buffer, buf, len))
-                       return -EFAULT;
-               goto out;
-       }
-       len = *lenp;
-       if (copy_from_user(buf, buffer, len > sizeof(buf) ? sizeof(buf) : len))
-               return -EFAULT;
        spin_lock(&appldata_timer_lock);
-       if (buf[0] == '1')
+       if (timer_active)
                __appldata_vtimer_setup(APPLDATA_ADD_TIMER);
-       else if (buf[0] == '0')
+       else
                __appldata_vtimer_setup(APPLDATA_DEL_TIMER);
        spin_unlock(&appldata_timer_lock);
-out:
-       *lenp = len;
-       *ppos += len;
        return 0;
 }
 
@@ -247,37 +241,24 @@ static int
 appldata_interval_handler(struct ctl_table *ctl, int write,
                           void __user *buffer, size_t *lenp, loff_t *ppos)
 {
-       unsigned int len;
-       int interval;
-       char buf[16];
+       int interval = appldata_interval;
+       int one = 1;
+       int rc;
+       struct ctl_table ctl_entry = {
+               .procname       = ctl->procname,
+               .data           = &interval,
+               .maxlen         = sizeof(int),
+               .extra1         = &one,
+       };
 
-       if (!*lenp || *ppos) {
-               *lenp = 0;
-               return 0;
-       }
-       if (!write) {
-               len = sprintf(buf, "%i\n", appldata_interval);
-               if (len > *lenp)
-                       len = *lenp;
-               if (copy_to_user(buffer, buf, len))
-                       return -EFAULT;
-               goto out;
-       }
-       len = *lenp;
-       if (copy_from_user(buf, buffer, len > sizeof(buf) ? sizeof(buf) : len))
-               return -EFAULT;
-       interval = 0;
-       sscanf(buf, "%i", &interval);
-       if (interval <= 0)
-               return -EINVAL;
+       rc = proc_dointvec_minmax(&ctl_entry, write, buffer, lenp, ppos);
+       if (rc < 0 || !write)
+               return rc;
 
        spin_lock(&appldata_timer_lock);
        appldata_interval = interval;
        __appldata_vtimer_setup(APPLDATA_MOD_TIMER);
        spin_unlock(&appldata_timer_lock);
-out:
-       *lenp = len;
-       *ppos += len;
        return 0;
 }
 
@@ -292,10 +273,17 @@ appldata_generic_handler(struct ctl_table *ctl, int write,
                           void __user *buffer, size_t *lenp, loff_t *ppos)
 {
        struct appldata_ops *ops = NULL, *tmp_ops;
-       unsigned int len;
-       int rc, found;
-       char buf[2];
        struct list_head *lh;
+       int rc, found;
+       int active;
+       int zero = 0;
+       int one = 1;
+       struct ctl_table ctl_entry = {
+               .data           = &active,
+               .maxlen         = sizeof(int),
+               .extra1         = &zero,
+               .extra2         = &one,
+       };
 
        found = 0;
        mutex_lock(&appldata_ops_mutex);
@@ -316,31 +304,15 @@ appldata_generic_handler(struct ctl_table *ctl, int write,
        }
        mutex_unlock(&appldata_ops_mutex);
 
-       if (!*lenp || *ppos) {
-               *lenp = 0;
+       active = ops->active;
+       rc = proc_douintvec_minmax(&ctl_entry, write, buffer, lenp, ppos);
+       if (rc < 0 || !write) {
                module_put(ops->owner);
-               return 0;
-       }
-       if (!write) {
-               memcpy(buf, ops->active ? "1\n" : "0\n", ARRAY_SIZE(buf));
-               len = strnlen(buf, ARRAY_SIZE(buf));
-               if (len > *lenp)
-                       len = *lenp;
-               if (copy_to_user(buffer, buf, len)) {
-                       module_put(ops->owner);
-                       return -EFAULT;
-               }
-               goto out;
-       }
-       len = *lenp;
-       if (copy_from_user(buf, buffer,
-                          len > sizeof(buf) ? sizeof(buf) : len)) {
-               module_put(ops->owner);
-               return -EFAULT;
+               return rc;
        }
 
        mutex_lock(&appldata_ops_mutex);
-       if ((buf[0] == '1') && (ops->active == 0)) {
+       if (active && (ops->active == 0)) {
                // protect work queue callback
                if (!try_module_get(ops->owner)) {
                        mutex_unlock(&appldata_ops_mutex);
@@ -358,7 +330,7 @@ appldata_generic_handler(struct ctl_table *ctl, int write,
                        module_put(ops->owner);
                } else
                        ops->active = 1;
-       } else if ((buf[0] == '0') && (ops->active == 1)) {
+       } else if (!active && (ops->active == 1)) {
                ops->active = 0;
                rc = appldata_diag(ops->record_nr, APPLDATA_STOP_REC,
                                (unsigned long) ops->data, ops->size,
@@ -369,9 +341,6 @@ appldata_generic_handler(struct ctl_table *ctl, int write,
                module_put(ops->owner);
        }
        mutex_unlock(&appldata_ops_mutex);
-out:
-       *lenp = len;
-       *ppos += len;
        module_put(ops->owner);
        return 0;
 }