static int gpt_stat_read(char *page, char **start, off_t off, int count, int *eof, void *data) { char *p = page; int len = 0; int i = 0; int in_use; int is_counting; p += sprintf(p, "\n(HW Timer) GPT Status :\n"); p += sprintf(p, "=========================================\n"); for (i = 0; i < NR_GPTS; i++) { in_use = gpt_devs[i].flags & GPT_IN_USE; is_counting = gpt_is_counting(i); p += sprintf(p, "[GPT%d]in_use:%s, is_counting:%s\n", i+1, in_use ? "Y" : "N", is_counting ? "Y" : "N"); } *start = page + off; len = p - page; if (len > off) len -= off; else len = 0; *eof = 1; return len < count ? len : count; }
static ssize_t gpt_stat_read(struct file *file, char __user *buf, size_t size, loff_t *ppos) { char *p = NULL; char *page = NULL; int len = 0; int i = 0; int in_use; int is_counting; int err = 0; page = kmalloc(PAGE_SIZE, GFP_KERNEL); if (!page) { kfree(page); return -ENOMEM; } p = page; p += sprintf(p, "\n(HW Timer) GPT Status :\n"); p += sprintf(p, "=========================================\n"); for (i = 0; i < NR_GPTS; i++) { in_use = gpt_devs[i].flags & GPT_IN_USE; is_counting = gpt_is_counting(i); p += sprintf(p, "[GPT%d]in_use:%s, is_counting:%s\n", i + 1, in_use ? "Y" : "N", is_counting ? "Y" : "N"); } len = p - page; if (*ppos >= len) { kfree(page); return 0; } err = copy_to_user(buf, (char *)page, len); *ppos += len; if (err) { kfree(page); return err; } kfree(page); return len; }