On Tue, Apr 30, 2019 at 12:45:08PM +0100, rdq@xxxxxxxxxxx wrote: > Greetings, > > My I2C sensor driver has a debugfs entry for development purposes. > Everything works fine with the exception of the read operation. When 'cat' > is used, the read operation is called repeatedly and indefinitely. If the > read() is changed to return 0 then, as expected, nothing is displayed. > > The pattern for the implementation is (AFAICT) right out of the book (shown > below). > > What am I missing? Any thoughts much appreciated. > > TAIA. > > RDQ > > static ssize_t sc031gs_reg_read_file(struct file *file, char __user > *user_buf, > size_t count, loff_t *ppos) > { > char *buf = 0; > ssize_t total = 0; > struct sc031gs_dev *sensor = file->private_data; > if (!sensor) > return -EINVAL; > if (*ppos < 0 || !count) > return -EINVAL; > buf = kmalloc(count, GFP_KERNEL); > if (!buf) > return -ENOMEM; > total = snprintf(buf,count,"Hello world\n"); > if (total >= 0) { > if (copy_to_user(user_buf, buf, total)) { > kfree(buf); > return -EFAULT; > } > *ppos += total; > } > kfree(buf); > return total; > } You are returning a "short" read, and then disallowing ppos to be set to a non-zero value? That's a recipie for disaster :( Also, you allow userspace to allocate as much memory as it asks for? Not good :( Why not just use the simple_read_from_buffer() call? That handles all of the "housekeeping" for you, and your function can be _much_ simpler. good luck! greg k-h _______________________________________________ Kernelnewbies mailing list Kernelnewbies@xxxxxxxxxxxxxxxxx https://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies