* [PATCH] proc: revert /proc/uptime to ->read_proc hook
@ 2008-10-27 20:09 Alexey Dobriyan
2008-10-27 21:34 ` Miklos Szeredi
0 siblings, 1 reply; 2+ messages in thread
From: Alexey Dobriyan @ 2008-10-27 20:09 UTC (permalink / raw)
To: vandrove; +Cc: linux-fsdevel, viro, hch
Petr: please confirm.
Al, Christoph: could we please find a way to distinguish reads that
come from pread(2) from reads that come from read(2).
Seqfiles are easily made capable of pread(2) just it's impossible to
figure out in ->read() hook. Otherwise getting rid of ->read_proc
is impossible.
commit 6c87df37dcb9c6c33923707fa5191e0a65874d60
Author: Alexey Dobriyan <adobriyan@gmail.com>
Date: Mon Oct 27 22:38:27 2008 +0300
proc: revert /proc/uptime to ->read_proc hook
Turned out some VMware userspace does pread(2) on /proc/uptime, but
seqfiles currently don't allow pread() resulting in -ESPIPE.
Seqfiles in theory can do pread(), but this can be a long story,
so revert to ->read_proc until then.
http://bugzilla.kernel.org/show_bug.cgi?id=11856
Signed-off-by: Alexey Dobriyan <adobriyan@gmail.com>
diff --git a/fs/proc/uptime.c b/fs/proc/uptime.c
index 0c10a0b..df26aa8 100644
--- a/fs/proc/uptime.c
+++ b/fs/proc/uptime.c
@@ -1,43 +1,45 @@
-#include <linux/fs.h>
#include <linux/init.h>
#include <linux/proc_fs.h>
#include <linux/sched.h>
-#include <linux/seq_file.h>
#include <linux/time.h>
#include <asm/cputime.h>
-static int uptime_proc_show(struct seq_file *m, void *v)
+static int proc_calc_metrics(char *page, char **start, off_t off,
+ int count, int *eof, int len)
+{
+ if (len <= off + count)
+ *eof = 1;
+ *start = page + off;
+ len -= off;
+ if (len > count)
+ len = count;
+ if (len < 0)
+ len = 0;
+ return len;
+}
+
+static int uptime_read_proc(char *page, char **start, off_t off, int count,
+ int *eof, void *data)
{
struct timespec uptime;
struct timespec idle;
+ int len;
cputime_t idletime = cputime_add(init_task.utime, init_task.stime);
do_posix_clock_monotonic_gettime(&uptime);
monotonic_to_bootbased(&uptime);
cputime_to_timespec(idletime, &idle);
- seq_printf(m, "%lu.%02lu %lu.%02lu\n",
+ len = sprintf(page, "%lu.%02lu %lu.%02lu\n",
(unsigned long) uptime.tv_sec,
(uptime.tv_nsec / (NSEC_PER_SEC / 100)),
(unsigned long) idle.tv_sec,
(idle.tv_nsec / (NSEC_PER_SEC / 100)));
- return 0;
+ return proc_calc_metrics(page, start, off, count, eof, len);
}
-static int uptime_proc_open(struct inode *inode, struct file *file)
-{
- return single_open(file, uptime_proc_show, NULL);
-}
-
-static const struct file_operations uptime_proc_fops = {
- .open = uptime_proc_open,
- .read = seq_read,
- .llseek = seq_lseek,
- .release = single_release,
-};
-
static int __init proc_uptime_init(void)
{
- proc_create("uptime", 0, NULL, &uptime_proc_fops);
+ create_proc_read_entry("uptime", 0, NULL, uptime_read_proc, NULL);
return 0;
}
module_init(proc_uptime_init);
^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: [PATCH] proc: revert /proc/uptime to ->read_proc hook
2008-10-27 20:09 [PATCH] proc: revert /proc/uptime to ->read_proc hook Alexey Dobriyan
@ 2008-10-27 21:34 ` Miklos Szeredi
0 siblings, 0 replies; 2+ messages in thread
From: Miklos Szeredi @ 2008-10-27 21:34 UTC (permalink / raw)
To: adobriyan; +Cc: vandrove, linux-fsdevel, viro, hch
On Mon, 27 Oct 2008, Alexey Dobriyan wrote:
> Petr: please confirm.
>
> Al, Christoph: could we please find a way to distinguish reads that
> come from pread(2) from reads that come from read(2).
You can compare the offset with file->f_pos, and if not equal, do an
lseek, read, lseek-back. Or more efficiently, save-state, lseek,
read, restore-state.
Miklos
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2008-10-27 21:34 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-10-27 20:09 [PATCH] proc: revert /proc/uptime to ->read_proc hook Alexey Dobriyan
2008-10-27 21:34 ` Miklos Szeredi
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).