patch-2.3.99-pre3 linux/kernel/sysctl.c

Next file: linux/mm/filemap.c
Previous file: linux/kernel/signal.c
Back to the patch index
Back to the overall index

diff -u --recursive --new-file v2.3.99-pre2/linux/kernel/sysctl.c linux/kernel/sysctl.c
@@ -14,6 +14,8 @@
  * Added proc_doulongvec_minmax, 09/08/99, Carlos H. Bauer.
  * Changed linked lists to use list.h instead of lists.h, 02/24/00, Bill
  *  Wendling.
+ * The list_for_each() macro wasn't appropriate for the sysctl loop.
+ *  Removed it and replaced it with older style, 03/23/00, Bill Wendling
  */
 
 #include <linux/config.h>
@@ -84,9 +86,9 @@
 static int proc_doutsstring(ctl_table *table, int write, struct file *filp,
 		  void *buffer, size_t *lenp);
 
-
 static ctl_table root_table[];
-static LIST_HEAD(root_table_header);
+static struct ctl_table_header root_table_header =
+	{ root_table, LIST_HEAD_INIT(root_table_header.ctl_entry) };
 
 static ctl_table kern_table[];
 static ctl_table vm_table[];
@@ -99,7 +101,6 @@
 static ctl_table dev_table[];
 extern ctl_table random_table[];
 
-
 /* /proc declarations: */
 
 #ifdef CONFIG_PROC_FS
@@ -108,14 +109,12 @@
 static ssize_t proc_writesys(struct file *, const char *, size_t, loff_t *);
 static int proc_sys_permission(struct inode *, int);
 
-struct file_operations proc_sys_file_operations =
-{
+struct file_operations proc_sys_file_operations = {
 	read:		proc_readsys,
 	write:		proc_writesys,
 };
 
-static struct inode_operations proc_sys_inode_operations =
-{
+static struct inode_operations proc_sys_inode_operations = {
 	permission:	proc_sys_permission,
 };
 
@@ -124,6 +123,7 @@
 static void register_proc_table(ctl_table *, struct proc_dir_entry *);
 static void unregister_proc_table(ctl_table *, struct proc_dir_entry *);
 #endif
+
 extern int inodes_stat[];
 extern int dentry_stat[];
 
@@ -294,39 +294,33 @@
 	register_proc_table(root_table, proc_sys_root);
 	init_irq_proc();
 #endif
-
 }
 
-int do_sysctl (int *name, int nlen,
-	       void *oldval, size_t *oldlenp,
+int do_sysctl(int *name, int nlen, void *oldval, size_t *oldlenp,
 	       void *newval, size_t newlen)
 {
-	int error;
 	struct list_head *tmp;
-	void *context;
-	
+
 	if (nlen == 0 || nlen >= CTL_MAXNAME)
 		return -ENOTDIR;
-	
-	if (oldval) 
-	{
+	if (oldval) {
 		int old_len;
-		if (!oldlenp)
-			return -EFAULT;
-		if(get_user(old_len, oldlenp))
+		if (!oldlenp || get_user(old_len, oldlenp))
 			return -EFAULT;
 	}
-	list_for_each(tmp, &root_table_header) {
+	tmp = &root_table_header.ctl_entry;
+	do {
 		struct ctl_table_header *head =
 			list_entry(tmp, struct ctl_table_header, ctl_entry);
-		context = NULL;
-		error = parse_table(name, nlen, oldval, oldlenp, 
-				    newval, newlen, head->ctl_table, &context);
+		void *context = NULL;
+		int error = parse_table(name, nlen, oldval, oldlenp, 
+					newval, newlen, head->ctl_table,
+					&context);
 		if (context)
 			kfree(context);
 		if (error != -ENOTDIR)
 			return error;
-	}
+	} while (tmp != &root_table_header.ctl_entry);
 	return -ENOTDIR;
 }
 
@@ -335,7 +329,7 @@
 	struct __sysctl_args tmp;
 	int error;
 
-	if(copy_from_user(&tmp, args, sizeof(tmp)))
+	if (copy_from_user(&tmp, args, sizeof(tmp)))
 		return -EFAULT;
 		
 	lock_kernel();
@@ -345,9 +339,10 @@
 	return error;
 }
 
-
-/* ctl_perm does NOT grant the superuser all rights automatically, because
-   some sysctl variables are readonly even to root. */
+/*
+ * ctl_perm does NOT grant the superuser all rights automatically, because
+ * some sysctl variables are readonly even to root.
+ */
 
 static int test_perm(int mode, int op)
 {
@@ -370,17 +365,16 @@
 		       void *newval, size_t newlen,
 		       ctl_table *table, void **context)
 {
-	int error;
 repeat:
 	if (!nlen)
 		return -ENOTDIR;
 
 	for ( ; table->ctl_name; table++) {
 		int n;
-		if(get_user(n,name))
+		if (get_user(n, name))
 			return -EFAULT;
-		if (n == table->ctl_name ||
-		    table->ctl_name == CTL_ANY) {
+		if (n == table->ctl_name || table->ctl_name == CTL_ANY) {
+			int error;
 			if (table->child) {
 				if (ctl_perm(table, 001))
 					return -EPERM;
@@ -389,8 +383,8 @@
 						table, name, nlen,
 						oldval, oldlenp,
 						newval, newlen, context);
-				if (error)
-					return error;
+					if (error)
+						return error;
 				}
 				name++;
 				nlen--;
@@ -465,9 +459,9 @@
 	tmp->ctl_table = table;
 	INIT_LIST_HEAD(&tmp->ctl_entry);
 	if (insert_at_head)
-		list_add(&tmp->ctl_entry, &root_table_header);
+		list_add(&tmp->ctl_entry, &root_table_header.ctl_entry);
 	else
-		list_add_tail(&tmp->ctl_entry, &root_table_header);
+		list_add_tail(&tmp->ctl_entry, &root_table_header.ctl_entry);
 #ifdef CONFIG_PROC_FS
 	register_proc_table(table, proc_sys_root);
 #endif
@@ -694,6 +688,7 @@
 #define OP_OR	2
 #define OP_MAX	3
 #define OP_MIN	4
+
 static int do_proc_dointvec(ctl_table *table, int write, struct file *filp,
 		  void *buffer, size_t *lenp, int conv, int op)
 {
@@ -812,7 +807,6 @@
 		(current->pid == 1) ? OP_SET : OP_AND);
 }
 
-
 int proc_dointvec_minmax(ctl_table *table, int write, struct file *filp,
 		  void *buffer, size_t *lenp)
 {
@@ -910,7 +904,6 @@
 	filp->f_pos += *lenp;
 	return 0;
 }
-
 
 /*
  * an unsigned long function version

FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)