[DRBD-cvs] r1915 - branches/drbd-0.7/drbd
drbd-cvs at lists.linbit.com
drbd-cvs at lists.linbit.com
Mon Aug 22 16:11:42 CEST 2005
Author: phil
Date: 2005-08-22 16:11:41 +0200 (Mon, 22 Aug 2005)
New Revision: 1915
Modified:
branches/drbd-0.7/drbd/drbd_int.h
branches/drbd-0.7/drbd/drbd_main.c
branches/drbd-0.7/drbd/drbd_proc.c
Log:
Changed proc_drbd.c to use the seq_file interface insted of the single
page buffer. The single page was apparently too small if you configure
more than 30 devices or so...
Modified: branches/drbd-0.7/drbd/drbd_int.h
===================================================================
--- branches/drbd-0.7/drbd/drbd_int.h 2005-08-10 12:46:43 UTC (rev 1914)
+++ branches/drbd-0.7/drbd/drbd_int.h 2005-08-22 14:11:41 UTC (rev 1915)
@@ -1078,7 +1078,7 @@
// drbd_proc.c
extern struct proc_dir_entry *drbd_proc;
-extern int drbd_proc_get_info(char *, char **, off_t, int, int *, void *);
+extern struct file_operations drbd_proc_fops;
extern const char* cstate_to_name(Drbd_CState s);
extern const char* nodestate_to_name(Drbd_State s);
Modified: branches/drbd-0.7/drbd/drbd_main.c
===================================================================
--- branches/drbd-0.7/drbd/drbd_main.c 2005-08-10 12:46:43 UTC (rev 1914)
+++ branches/drbd-0.7/drbd/drbd_main.c 2005-08-22 14:11:41 UTC (rev 1915)
@@ -1852,13 +1852,15 @@
/*
* register with procfs
*/
- // XXX maybe move to a seq_file interface
- drbd_proc = create_proc_read_entry("drbd", 0, &proc_root,
- drbd_proc_get_info, NULL);
+ drbd_proc = create_proc_entry("drbd", S_IFREG | S_IRUGO | S_IWUSR,
+ &proc_root);
+
if (!drbd_proc) {
printk(KERN_ERR DEVICE_NAME": unable to register proc file\n");
goto Enomem;
}
+
+ drbd_proc->proc_fops = &drbd_proc_fops;
drbd_proc->owner = THIS_MODULE;
#else
# error "Currently drbd depends on the proc file system (CONFIG_PROC_FS)"
Modified: branches/drbd-0.7/drbd/drbd_proc.c
===================================================================
--- branches/drbd-0.7/drbd/drbd_proc.c 2005-08-10 12:46:43 UTC (rev 1914)
+++ branches/drbd-0.7/drbd/drbd_proc.c 2005-08-22 14:11:41 UTC (rev 1915)
@@ -35,12 +35,21 @@
#include <linux/file.h>
#include <linux/slab.h>
#include <linux/proc_fs.h>
+#include <linux/seq_file.h>
#include <linux/drbd.h>
#include "drbd_int.h"
-int drbd_proc_get_info(char *, char **, off_t, int, int *, void *);
+STATIC int drbd_proc_open(struct inode *inode, struct file *file);
+
struct proc_dir_entry *drbd_proc;
+struct file_operations drbd_proc_fops = {
+ .owner = THIS_MODULE,
+ .open = drbd_proc_open,
+ .read = seq_read,
+ .llseek = seq_lseek,
+ .release = single_release,
+};
/*lge
* progress bars shamelessly adapted from driver/md/md.c
@@ -48,9 +57,8 @@
* [=====>..............] 33.5% (23456/123456)
* finish: 2:20:20 speed: 6,345 (6,456) K/sec
*/
-STATIC int drbd_syncer_progress(struct Drbd_Conf* mdev,char *buf)
+STATIC void drbd_syncer_progress(struct Drbd_Conf* mdev, struct seq_file *seq)
{
- int sz = 0;
unsigned long res , db, dt, dbdt, rt, rs_left;
/* the whole sector_div thingy was wrong (did overflow,
@@ -82,23 +90,23 @@
}
{
int i, y = res/50, x = 20-y;
- sz += sprintf(buf + sz, "\t[");
+ seq_printf(seq, "\t[");
for (i = 1; i < x; i++)
- sz += sprintf(buf + sz, "=");
- sz += sprintf(buf + sz, ">");
+ seq_printf(seq, "=");
+ seq_printf(seq, ">");
for (i = 0; i < y; i++)
- sz += sprintf(buf + sz, ".");
- sz += sprintf(buf + sz, "] ");
+ seq_printf(seq, ".");
+ seq_printf(seq, "] ");
}
res = 1000L - res;
- sz+=sprintf(buf+sz,"sync'ed:%3lu.%lu%% ", res / 10, res % 10);
+ seq_printf(seq,"sync'ed:%3lu.%lu%% ", res / 10, res % 10);
/* if more than 1 GB display in MB */
if (mdev->rs_total > 0x100000L) {
- sz+=sprintf(buf+sz,"(%lu/%lu)M\n\t",
+ seq_printf(seq,"(%lu/%lu)M\n\t",
(unsigned long) Bit2KB(rs_left) >> 10,
(unsigned long) Bit2KB(mdev->rs_total) >> 10 );
} else {
- sz+=sprintf(buf+sz,"(%lu/%lu)K\n\t",
+ seq_printf(seq,"(%lu/%lu)K\n\t",
(unsigned long) Bit2KB(rs_left),
(unsigned long) Bit2KB(mdev->rs_total) );
}
@@ -117,16 +125,16 @@
db = mdev->rs_mark_left - rs_left;
rt = (dt * (rs_left / (db/100+1)))/100; /* seconds */
- sz += sprintf(buf + sz, "finish: %lu:%02lu:%02lu",
+ seq_printf(seq, "finish: %lu:%02lu:%02lu",
rt / 3600, (rt % 3600) / 60, rt % 60);
/* current speed average over (SYNC_MARKS * SYNC_MARK_STEP) jiffies */
dbdt = Bit2KB(db/dt);
if (dbdt > 1000)
- sz += sprintf(buf + sz, " speed: %ld,%03ld",
+ seq_printf(seq, " speed: %ld,%03ld",
dbdt/1000,dbdt % 1000);
else
- sz += sprintf(buf + sz, " speed: %ld", dbdt);
+ seq_printf(seq, " speed: %ld", dbdt);
/* mean speed since syncer started
* we do account for PausedSync periods */
@@ -135,14 +143,12 @@
db = mdev->rs_total - rs_left;
dbdt = Bit2KB(db/dt);
if (dbdt > 1000)
- sz += sprintf(buf + sz, " (%ld,%03ld)",
+ seq_printf(seq, " (%ld,%03ld)",
dbdt/1000,dbdt % 1000);
else
- sz += sprintf(buf + sz, " (%ld)", dbdt);
+ seq_printf(seq, " (%ld)", dbdt);
- sz += sprintf(buf+sz," K/sec\n");
-
- return sz;
+ seq_printf(seq," K/sec\n");
}
const char* cstate_to_name(Drbd_CState s) {
@@ -183,16 +189,14 @@
: state_names[s];
}
-/* FIXME we should use snprintf, we only have guaranteed room for one page...
- * we should eventually use seq_file for this */
-int drbd_proc_get_info(char *buf, char **start, off_t offset,
- int len, int *unused, void *data)
+
+STATIC int drbd_seq_show(struct seq_file *seq, void *v)
{
- int rlen, i;
+ int i;
const char *sn;
- rlen = sprintf(buf, "version: " REL_VERSION " (api:%d/proto:%d)\n%s\n",
- API_VERSION,PRO_VERSION, drbd_buildtag());
+ seq_printf(seq, "version: " REL_VERSION " (api:%d/proto:%d)\n%s\n",
+ API_VERSION,PRO_VERSION, drbd_buildtag());
/*
cs .. connection state
@@ -216,10 +220,9 @@
sn = "ServerForDLess";
}
if ( drbd_conf[i].cstate == Unconfigured )
- rlen += sprintf( buf + rlen,
- "%2d: cs:Unconfigured\n", i);
+ seq_printf( seq, "%2d: cs:Unconfigured\n", i);
else
- rlen += sprintf( buf + rlen,
+ seq_printf( seq,
"%2d: cs:%s st:%s/%s ld:%s\n"
" ns:%u nr:%u dw:%u dr:%u al:%u bm:%u "
"lo:%d pe:%d ua:%d ap:%d\n",
@@ -244,12 +247,15 @@
if ( drbd_conf[i].cstate == SyncSource ||
drbd_conf[i].cstate == SyncTarget )
- rlen += drbd_syncer_progress(drbd_conf+i,buf+rlen);
+ drbd_syncer_progress(drbd_conf+i,seq);
}
- /* DEBUG & profile stuff end */
+ return 0;
+}
- return rlen;
+STATIC int drbd_proc_open(struct inode *inode, struct file *file)
+{
+ return single_open(file, drbd_seq_show, PDE(inode)->data);
}
/* PROC FS stuff end */
More information about the drbd-cvs
mailing list