From 49e5b0c0d7c09bef5b9bfecaaac3f0ea2cf24e43 Mon Sep 17 00:00:00 2001 From: "Bjoern B. Brandenburg" Date: Sat, 23 Jul 2011 23:06:20 -0400 Subject: ftdev: remove event activation hack Instead of doing the hackisch 'write commands to device' thing, let's just use a real ioctl() interface. --- litmus/ftdev.c | 59 +++++++++++++++++++++------------------------------------- 1 file changed, 21 insertions(+), 38 deletions(-) (limited to 'litmus') diff --git a/litmus/ftdev.c b/litmus/ftdev.c index 4a4b2e3e56c2..216dc0b4cb94 100644 --- a/litmus/ftdev.c +++ b/litmus/ftdev.c @@ -250,64 +250,47 @@ out: return err; } -typedef uint32_t cmd_t; - -static ssize_t ftdev_write(struct file *filp, const char __user *from, - size_t len, loff_t *f_pos) +static long ftdev_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) { + long err = -ENOIOCTLCMD; struct ftdev_minor* ftdm = filp->private_data; - ssize_t err = -EINVAL; - cmd_t cmd; - cmd_t id; - - if (len % sizeof(cmd) || len < 2 * sizeof(cmd)) - goto out; - - if (copy_from_user(&cmd, from, sizeof(cmd))) { - err = -EFAULT; - goto out; - } - len -= sizeof(cmd); - from += sizeof(cmd); - - if (cmd != FTDEV_ENABLE_CMD && cmd != FTDEV_DISABLE_CMD) - goto out; if (mutex_lock_interruptible(&ftdm->lock)) { err = -ERESTARTSYS; goto out; } - err = sizeof(cmd); - while (len) { - if (copy_from_user(&id, from, sizeof(cmd))) { - err = -EFAULT; - goto out_unlock; - } - /* FIXME: check id against list of acceptable events */ - len -= sizeof(cmd); - from += sizeof(cmd); - if (cmd == FTDEV_DISABLE_CMD) - deactivate(&ftdm->events, id); - else if (activate(&ftdm->events, id) != 0) { + /* FIXME: check id against list of acceptable events */ + + switch (cmd) { + case FTDEV_ENABLE_CMD: + if (activate(&ftdm->events, arg)) err = -ENOMEM; - goto out_unlock; - } - err += sizeof(cmd); - } + else + err = 0; + break; + + case FTDEV_DISABLE_CMD: + deactivate(&ftdm->events, arg); + err = 0; + break; + + default: + printk(KERN_DEBUG "ftdev: strange ioctl (%u, %lu)\n", cmd, arg); + }; -out_unlock: mutex_unlock(&ftdm->lock); out: return err; } + struct file_operations ftdev_fops = { .owner = THIS_MODULE, .open = ftdev_open, .release = ftdev_release, - .write = ftdev_write, .read = ftdev_read, + .unlocked_ioctl = ftdev_ioctl, }; int ftdev_init( struct ftdev* ftdev, struct module* owner, -- cgit v1.2.2