[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