static ssize_t display_crc_ctl_write(struct file *file, const char __user *ubuf, size_t len, loff_t *offp) { struct seq_file *m = file->private_data; struct drm_i915_private *dev_priv = m->private; char *tmpbuf; int ret; if (len == 0) return 0; if (len > PAGE_SIZE - 1) { DRM_DEBUG_DRIVER("expected <%lu bytes into pipe crc control\n", PAGE_SIZE); return -E2BIG; } tmpbuf = memdup_user_nul(ubuf, len); if (IS_ERR(tmpbuf)) return PTR_ERR(tmpbuf); ret = display_crc_ctl_parse(dev_priv, tmpbuf, len); kfree(tmpbuf); if (ret < 0) return ret; *offp += len; return len; }
static ssize_t display_crc_ctl_write(struct file *file, const char __user *ubuf, size_t len, loff_t *offp) { struct seq_file *m = file->private_data; struct drm_i915_private *dev_priv = m->private; char *tmpbuf; int ret; if (len == 0) return 0; if (len > PAGE_SIZE - 1) { DRM_DEBUG_DRIVER("expected <%lu bytes into pipe crc control\n", PAGE_SIZE); return -E2BIG; } tmpbuf = kmalloc(len + 1, GFP_KERNEL); if (!tmpbuf) return -ENOMEM; if (copy_from_user(tmpbuf, ubuf, len)) { ret = -EFAULT; goto out; } tmpbuf[len] = '\0'; ret = display_crc_ctl_parse(dev_priv, tmpbuf, len); out: kfree(tmpbuf); if (ret < 0) return ret; *offp += len; return len; }