/* * Handle compatibility ioctls */ static long compat_ipmi_ioctl(struct file *filep, unsigned int cmd, unsigned long arg) { struct ipmi_file_private *priv = filep->private_data; switch(cmd) { case COMPAT_IPMICTL_SEND_COMMAND: { struct ipmi_req rp; struct compat_ipmi_req r32; int retries; unsigned int retry_time_ms; if (copy_from_user(&r32, compat_ptr(arg), sizeof(r32))) return -EFAULT; get_compat_ipmi_req(&rp, &r32); mutex_lock(&priv->recv_mutex); retries = priv->default_retries; retry_time_ms = priv->default_retry_time_ms; mutex_unlock(&priv->recv_mutex); return handle_send_req(priv->user, &rp, retries, retry_time_ms); } case COMPAT_IPMICTL_SEND_COMMAND_SETTIME: { struct ipmi_req_settime sp; struct compat_ipmi_req_settime sp32; if (copy_from_user(&sp32, compat_ptr(arg), sizeof(sp32))) return -EFAULT; get_compat_ipmi_req_settime(&sp, &sp32); return handle_send_req(priv->user, &sp.req, sp.retries, sp.retry_time_ms); } case COMPAT_IPMICTL_RECEIVE_MSG: case COMPAT_IPMICTL_RECEIVE_MSG_TRUNC: { struct ipmi_recv recv64; struct compat_ipmi_recv recv32; if (copy_from_user(&recv32, compat_ptr(arg), sizeof(recv32))) return -EFAULT; get_compat_ipmi_recv(&recv64, &recv32); return handle_recv(priv, cmd == COMPAT_IPMICTL_RECEIVE_MSG_TRUNC, &recv64, copyout_recv32, compat_ptr(arg)); } default: return ipmi_ioctl(filep, cmd, arg); } }
/* * Note: it doesn't make sense to take the BKL here but * not in compat_ipmi_ioctl. -arnd */ static long ipmi_unlocked_ioctl(struct file *file, unsigned int cmd, unsigned long data) { int ret; mutex_lock(&ipmi_mutex); ret = ipmi_ioctl(file, cmd, data); mutex_unlock(&ipmi_mutex); return ret; }
static long ipmi_unlocked_ioctl(struct file *file, unsigned int cmd, unsigned long arg) { int ret; mutex_lock(&ipmi_watchdog_mutex); ret = ipmi_ioctl(file, cmd, arg); mutex_unlock(&ipmi_watchdog_mutex); return ret; }
/* * Note: it doesn't make sense to take the BKL here but * not in compat_ipmi_ioctl. -arnd */ static long ipmi_unlocked_ioctl(struct file *file, unsigned int cmd, unsigned long data) { int ret; lock_kernel(); ret = ipmi_ioctl(file, cmd, data); unlock_kernel(); return ret; }
/* * Handle compatibility ioctls */ static long compat_ipmi_ioctl(struct file *filep, unsigned int cmd, unsigned long arg) { int rc; struct ipmi_file_private *priv = filep->private_data; switch(cmd) { case COMPAT_IPMICTL_SEND_COMMAND: { struct ipmi_req rp; if (get_compat_ipmi_req(&rp, compat_ptr(arg))) return -EFAULT; return handle_send_req(priv->user, &rp, priv->default_retries, priv->default_retry_time_ms); } case COMPAT_IPMICTL_SEND_COMMAND_SETTIME: { struct ipmi_req_settime sp; if (get_compat_ipmi_req_settime(&sp, compat_ptr(arg))) return -EFAULT; return handle_send_req(priv->user, &sp.req, sp.retries, sp.retry_time_ms); } case COMPAT_IPMICTL_RECEIVE_MSG: case COMPAT_IPMICTL_RECEIVE_MSG_TRUNC: { struct ipmi_recv __user *precv64; struct ipmi_recv recv64; if (get_compat_ipmi_recv(&recv64, compat_ptr(arg))) return -EFAULT; precv64 = compat_alloc_user_space(sizeof(recv64)); if (copy_to_user(precv64, &recv64, sizeof(recv64))) return -EFAULT; rc = ipmi_ioctl(filep, ((cmd == COMPAT_IPMICTL_RECEIVE_MSG) ? IPMICTL_RECEIVE_MSG : IPMICTL_RECEIVE_MSG_TRUNC), (unsigned long) precv64); if (rc != 0) return rc; if (copy_from_user(&recv64, precv64, sizeof(recv64))) return -EFAULT; if (put_compat_ipmi_recv(&recv64, compat_ptr(arg))) return -EFAULT; return rc; } default: return ipmi_ioctl(filep, cmd, arg); } }