[Ocfs2-commits] smushran commits r1475 - trunk/src

svn-commits at oss.oracle.com svn-commits at oss.oracle.com
Thu Sep 16 16:50:44 CDT 2004


Author: smushran
Date: 2004-09-16 16:50:42 -0500 (Thu, 16 Sep 2004)
New Revision: 1475

Modified:
   trunk/src/ocfs.h
   trunk/src/proc.c
Log:
proc changes
mounts now show up as /proc/fs/ocfs2/<maj_min> 
guid and label also available

Modified: trunk/src/ocfs.h
===================================================================
--- trunk/src/ocfs.h	2004-09-14 01:39:44 UTC (rev 1474)
+++ trunk/src/ocfs.h	2004-09-16 21:50:42 UTC (rev 1475)
@@ -581,6 +581,7 @@
 	int s_clustersize;
 	int s_clustersize_bits;
 	int needs_flush;
+	struct proc_dir_entry *proc_sub_dir; /* points to /proc/fs/ocfs2/<maj_min> */
 
 	ocfs_alloc_bm cluster_bitmap;
 	atomic_t vol_state;
@@ -652,6 +653,7 @@
 	__u64 comm_seq_num;		/* local node seq num used in ipcdlm */
 	ocfs_dlm_stats net_reqst_stats;	/* stats of netdlm vote requests */
 	ocfs_dlm_stats net_reply_stats;	/* stats of netdlm vote reponses */
+	struct proc_dir_entry *proc_root_dir; /* points to /proc/fs/ocfs2 */
 }
 ocfs_global_ctxt;
 

Modified: trunk/src/proc.c
===================================================================
--- trunk/src/proc.c	2004-09-14 01:39:44 UTC (rev 1474)
+++ trunk/src/proc.c	2004-09-16 21:50:42 UTC (rev 1475)
@@ -48,50 +48,69 @@
 /* Tracing */
 #define OCFS_DEBUG_CONTEXT      OCFS_DEBUG_CONTEXT_PROC
 
-#define OCFS2_PROC_BASENAME "fs/ocfs2"
+#define OCFS2_PROC_BASENAME	"fs/ocfs2"
 
 static int ocfs_proc_globalctxt(char *page, char **start, off_t off, int count, int *eof, void *data);
 static int ocfs_proc_dlm_stats(char *page, char **start, off_t off, int count, int *eof, void *data);
 static int ocfs_proc_version (char *page, char **start, off_t off, int count, int *eof, void *data);
+static int ocfs_proc_nodenum (char *page, char **start, off_t off, int count, int *eof, void *data);
 static int ocfs_proc_nodename (char *page, char **start, off_t off, int count, int *eof, void *data);
 static int ocfs_proc_mountpoint (char *page, char **start, off_t off, int count, int *eof, void *data);
 static int ocfs_proc_statistics (char *page, char **start, off_t off, int count, int *eof, void *data);
 static int ocfs_proc_device (char *page, char **start, off_t off, int count, int *eof, void *data);
 static int ocfs_proc_nodes (char *page, char **start, off_t off, int count, int *eof, void *data);
 static int ocfs_proc_net_vote_obj (char *page, char **start, off_t off, int count, int *eof, void *data);
-static int ocfs_proc_alloc_stat(char *page, char **start, off_t off,
-				int count, int *eof, void *data);
+static int ocfs_proc_alloc_stat(char *page, char **start, off_t off, int count, int *eof, void *data);
+static int ocfs_proc_guid (char *page, char **start, off_t off, int count, int *eof, void *data);
+static int ocfs_proc_label (char *page, char **start, off_t off, int count, int *eof, void *data);
 
+typedef struct _ocfs_proc_list
+{
+	char *name;
+	char *data;
+	int (*read_proc) (char *, char **, off_t, int, int *, void *);
+} ocfs_proc_list;
+
+ocfs_proc_list top_dir[] = {
+	{ "version", NULL, ocfs_proc_version },
+	{ "nodename", NULL, ocfs_proc_nodename },
+	{ "globalctxt", NULL, ocfs_proc_globalctxt },
+	{ "lockstat", NULL, ocfs_proc_dlm_stats },
+	{ NULL } };
+
+ocfs_proc_list sub_dir[] = {
+	{ "nodenum", NULL, ocfs_proc_nodenum },
+	{ "mountpoint", NULL, ocfs_proc_mountpoint },
+	{ "statistics", NULL, ocfs_proc_statistics },
+	{ "lockstat", NULL, ocfs_proc_dlm_stats },
+	{ "device", NULL, ocfs_proc_device },
+	{ "nodes", NULL, ocfs_proc_nodes },
+	{ "sent-votes", NULL, ocfs_proc_net_vote_obj },
+	{ "allocstat", NULL, ocfs_proc_alloc_stat },
+	{ "guid", NULL, ocfs_proc_guid },
+	{ "label", NULL, ocfs_proc_label },
+	{ NULL } };
+
 /*
  * ocfs_proc_init()
  *
  */
 int ocfs_proc_init (void)
 {
-	static struct
-	{
-		char *name;
-		char *data;
-		int (*read_proc) (char *, char **, off_t, int, int *, void *);
-	}
-	*p, ProcList[] =
-	{
-		{ OCFS2_PROC_BASENAME "/version", NULL, ocfs_proc_version },
-		{ OCFS2_PROC_BASENAME "/nodename", NULL, ocfs_proc_nodename },
-		{ OCFS2_PROC_BASENAME "/globalctxt", NULL, ocfs_proc_globalctxt },
-		{ OCFS2_PROC_BASENAME "/lockstat", NULL, ocfs_proc_dlm_stats },
-		{ NULL, }
-	};
+	struct proc_dir_entry *parent = NULL;
+	ocfs_proc_list *p;
 
 	LOG_ENTRY ();
 
-	proc_mkdir (OCFS2_PROC_BASENAME, 0);
+	parent = proc_mkdir (OCFS2_PROC_BASENAME, 0);
+	if (parent) {
+		OcfsGlobalCtxt.proc_root_dir = parent;
+		for (p = top_dir; p->name; p++)
+			create_proc_read_entry (p->name, 0, parent,
+						p->read_proc, p->data);
+	}
 
-	for (p = ProcList; p->name; p++)
-		create_proc_read_entry (p->name, 0, NULL, p->read_proc,
-					p->data);
-
-	LOG_EXIT_INT (0);
+	LOG_EXIT ();
 	return 0;
 }				/* ocfs_proc_init */
 
@@ -101,16 +120,19 @@
  */
 void ocfs_proc_deinit (void)
 {
+	struct proc_dir_entry *parent = OcfsGlobalCtxt.proc_root_dir;
+	ocfs_proc_list *p;
+
 	LOG_ENTRY ();
 
-	remove_proc_entry (OCFS2_PROC_BASENAME "/version", NULL);
-	remove_proc_entry (OCFS2_PROC_BASENAME "/nodename", NULL);
-	remove_proc_entry (OCFS2_PROC_BASENAME "/globalctxt", NULL);
-	remove_proc_entry (OCFS2_PROC_BASENAME "/lockstat", NULL);
-	remove_proc_entry (OCFS2_PROC_BASENAME, NULL);
+	if (parent) {
+		for (p = top_dir; p->name; p++)
+			remove_proc_entry (p->name, parent);
+		remove_proc_entry (OCFS2_PROC_BASENAME, 0);
+	}
 
 	LOG_EXIT ();
-	return;
+	return ;
 }				/* ocfs_proc_deinit */
 
 /*
@@ -332,71 +354,31 @@
 	return ret;
 }				/* ocfs_proc_nodename */
 
-typedef struct _ocfs_proc_list
-{
-	char *name;
-	char *data;
-	int (*read_proc) (char *, char **, off_t, int, int *, void *);
-} ocfs_proc_list;
-
-static ocfs_proc_list ProcList[] =
-{
-	{ "nodenum", NULL, ocfs_proc_nodenum },
-	{ "mountpoint", NULL, ocfs_proc_mountpoint },
-	{ "statistics", NULL, ocfs_proc_statistics },
-	{ "lockstat", NULL, ocfs_proc_dlm_stats },
-	{ "device", NULL, ocfs_proc_device },
-	{ "nodes", NULL, ocfs_proc_nodes },
-	{ "sent-votes", NULL, ocfs_proc_net_vote_obj },
-	{ "allocstat", NULL, ocfs_proc_alloc_stat }, 
-	{ NULL, }
-};
-
 /*
  * ocfs_proc_add_volume()
  *
  */
 void ocfs_proc_add_volume (ocfs_super * osb)
 {
-	char *newdir = NULL;
-	char *tmp = NULL;
+	char newdir[20];
+	struct proc_dir_entry *parent = NULL;
 	ocfs_proc_list *p;
 
 	LOG_ENTRY ();
 
-	newdir = ocfs_malloc (32);
-	tmp = ocfs_malloc (100);
-	if (!newdir || !tmp) {
-		LOG_ERROR_STATUS (-ENOMEM);
-		goto bail;
-	}
+	snprintf (newdir, sizeof(newdir), "%u_%u", MAJOR(osb->sb->s_dev),
+		  MINOR(osb->sb->s_dev));
+	parent = proc_mkdir (newdir, OcfsGlobalCtxt.proc_root_dir);
+	osb->proc_sub_dir = parent;
 
-	ProcList[0].data = (char *) osb;
-#warning fix proc mountpoint
-	ProcList[1].data = "unknown";
-	ProcList[2].data = (char *) osb;
-	ProcList[3].data = (char *) osb;
-	ProcList[4].data = (char *) osb;
-	ProcList[5].data = (char *) osb;
-	ProcList[6].data = (char *) osb;
-	ProcList[7].data = (char *) osb;
-	ProcList[8].data = (char *) osb;
-
-	sprintf (newdir, OCFS2_PROC_BASENAME "/%-d", osb->osb_id);
-	proc_mkdir (newdir, 0);
-
-	for (p = ProcList; p->name; p++) {
-		sprintf (tmp, "%s/%s", newdir, p->name);
-		create_proc_read_entry (tmp, 0, NULL, p->read_proc, p->data);
+	if (parent) {
+		for (p = sub_dir; p->name; p++)
+			create_proc_read_entry (p->name, 0, parent,
+						p->read_proc, (char *)osb);
 	}
 
-bail:
-	if (tmp)
-    		kfree(tmp);
-	if (newdir)
-    		kfree(newdir);
 	LOG_EXIT ();
-	return;
+	return ;
 }				/* ocfs_proc_add_volume */
 
 /*
@@ -405,28 +387,20 @@
  */
 void ocfs_proc_remove_volume (ocfs_super * osb)
 {
-	char *tmp = NULL;
 	ocfs_proc_list *p;
+	char dir[20];
 
 	LOG_ENTRY ();
 
-	tmp = ocfs_malloc (100);
-	if (!tmp) {
-		LOG_ERROR_STATUS (-ENOMEM);
-		goto bail;
+	if (osb->proc_sub_dir) {
+		for (p = sub_dir; p->name; p++)
+			remove_proc_entry (p->name, osb->proc_sub_dir);
+
+		snprintf (dir, sizeof(dir), "%u_%u", MAJOR(osb->sb->s_dev),
+			  MINOR(osb->sb->s_dev));
+		remove_proc_entry (dir, OcfsGlobalCtxt.proc_root_dir);
 	}
-	
-	for (p = ProcList; p->name; p++) {
-		sprintf (tmp, OCFS2_PROC_BASENAME "/%-d/%s", osb->osb_id, p->name);
-		remove_proc_entry (tmp, NULL);
-	}
 
-	sprintf (tmp, OCFS2_PROC_BASENAME "/%-d", osb->osb_id);
-	remove_proc_entry (tmp, NULL);
-
-bail:
-	if (tmp)
-		kfree(tmp);
 	LOG_EXIT ();
 	return;
 }				/* ocfs_proc_remove_volume */
@@ -443,9 +417,7 @@
 
 	LOG_ENTRY ();
 
-	strcpy (page, data);
-	strcat (page, "\n");
-	len = strlen (page);
+	len = sprintf (page, "%s\n", "unknown");
 
 	ret = ocfs_proc_calc_metrics (page, start, off, count, eof, len);
 
@@ -607,3 +579,56 @@
 	return ret;
 }				/* ocfs_proc_net_vote_obj */
 
+/*
+ * ocfs_proc_guid()
+ *
+ */
+static int ocfs_proc_guid (char *page, char **start, off_t off,
+			   int count, int *eof, void *data)
+{
+	int len;
+	int ret;
+	ocfs_super *osb;
+	char *p;
+	int i;
+
+	LOG_ENTRY ();
+
+	osb = (ocfs_super *) data;
+
+	for (i = 0, p = page; i < MAX_VOL_ID_LENGTH; i++, p += 2)
+		sprintf(p, "%02X", osb->uuid[i]);
+	*p = '\n'; ++p; *p = '\0';
+
+	len = strlen (page);
+
+	ret = ocfs_proc_calc_metrics (page, start, off, count, eof, len);
+
+	LOG_EXIT_INT (ret);
+	return ret;
+}				/* ocfs_proc_guid */
+
+
+/*
+ * ocfs_proc_label()
+ *
+ */
+static int ocfs_proc_label (char *page, char **start, off_t off,
+			    int count, int *eof, void *data)
+{
+	int len;
+	int ret;
+	ocfs_super *osb;
+
+	LOG_ENTRY ();
+
+	osb = (ocfs_super *) data;
+
+	len = sprintf (page, "%s\n", osb->vol_label);
+
+	ret = ocfs_proc_calc_metrics (page, start, off, count, eof, len);
+
+	LOG_EXIT_INT (ret);
+	return ret;
+}				/* ocfs_proc_label */
+



More information about the Ocfs2-commits mailing list