+ struct hello_buffer *hello = fp->private_data;
+ int r;
+ if (sz + *pos > hello->len)
+ sz = hello->len - *pos;
+ r = copy_to_user(buf, hello->buffer + *pos, sz);
+ if (r)
+ return -EFAULT;
+ *pos += sz;
+ return sz;
+}
+
+static ssize_t hello_write(struct file *fp, const char __user *buf, size_t sz,
+ loff_t *pos)
+{
+ struct hello_buffer *hello = fp->private_data;
+ int r;
+ if (sz + *pos > MAXLEN)
+ sz = MAXLEN - *pos;
+ r = copy_from_user(hello->buffer + *pos, buf, sz);
+ if (r)
+ return -EFAULT;
+ *pos += sz;
+ if (hello->len < *pos)
+ hello->len = *pos;
+ return sz;