netdev
[Top] [All Lists]

[PATCH 7/10] [bonding 2.6] Consolidate /proc code, add CHANGENAME handle

To: bonding-devel@xxxxxxxxxxxxxxxxxxxxx, netdev@xxxxxxxxxxx
Subject: [PATCH 7/10] [bonding 2.6] Consolidate /proc code, add CHANGENAME handler
From: Amir Noam <amir.noam@xxxxxxxxx>
Date: Thu, 11 Sep 2003 17:41:49 +0300
Sender: netdev-bounce@xxxxxxxxxxx
User-agent: KMail/1.4.3
diff -Nuarp a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c
--- a/drivers/net/bonding/bond_main.c   Thu Sep 11 16:48:33 2003
+++ b/drivers/net/bonding/bond_main.c   Thu Sep 11 16:48:34 2003
@@ -3466,6 +3466,45 @@ static int bond_read_proc(char *buf, cha
 #endif /* CONFIG_PROC_FS */
 
 
+static int bond_create_proc_info(struct bonding *bond)
+{
+#ifdef CONFIG_PROC_FS
+       struct net_device *dev = bond->device;
+
+       bond->bond_proc_dir = proc_mkdir(dev->name, proc_net);
+       if (bond->bond_proc_dir == NULL) {
+               printk(KERN_ERR "%s: Cannot init /proc/net/%s/\n",
+                       dev->name, dev->name);
+               return -ENOMEM;
+       }
+       bond->bond_proc_dir->owner = THIS_MODULE;
+
+       bond->bond_proc_info_file =
+               create_proc_read_entry("info", 0, bond->bond_proc_dir,
+                                       bond_read_proc, bond);
+       if (bond->bond_proc_info_file == NULL) {
+               printk(KERN_ERR "%s: Cannot init /proc/net/%s/info\n",
+                       dev->name, dev->name);
+               remove_proc_entry(dev->name, proc_net);
+               return -ENOMEM;
+       }
+       bond->bond_proc_info_file->owner = THIS_MODULE;
+
+       memcpy(bond->procdir_name, dev->name, IFNAMSIZ);
+#endif /* CONFIG_PROC_FS */
+       return 0;
+}
+
+static void bond_destroy_proc_info(struct bonding *bond)
+{
+#ifdef CONFIG_PROC_FS
+       remove_proc_entry("info", bond->bond_proc_dir);
+       remove_proc_entry(bond->procdir_name, proc_net);
+       memset(bond->procdir_name, 0, IFNAMSIZ);
+       bond->bond_proc_dir = NULL;
+#endif /* CONFIG_PROC_FS */
+}
+
 /*
  * Change HW address
  *
@@ -3614,10 +3653,7 @@ static void bond_deinit(struct net_devic
 
        list_del(&bond->bond_list);
 
-#ifdef CONFIG_PROC_FS
-       remove_proc_entry("info", bond->bond_proc_dir);
-       remove_proc_entry(dev->name, proc_net);
-#endif
+       bond_destroy_proc_info(bond);
 }
 
 static void bond_free_all(void)
@@ -3633,10 +3669,15 @@ static void bond_free_all(void)
        }
 }
 
+/*
+ * Does not allocate but creates a /proc entry.
+ * Allowed to fail.
+ */
 static int __init bond_init(struct net_device *dev)
 {
        struct bonding *bond;
        int count;
+       int err = 0;
 
 #ifdef BONDING_DEBUG
        printk (KERN_INFO "Begin bond_init for %s\n", dev->name);
@@ -3715,30 +3756,26 @@ static int __init bond_init(struct net_d
                printk("out ARP monitoring\n");
        }
 
-#ifdef CONFIG_PROC_FS
-       bond->bond_proc_dir = proc_mkdir(dev->name, proc_net);
-       if (bond->bond_proc_dir == NULL) {
-               printk(KERN_ERR "%s: Cannot init /proc/net/%s/\n", 
-                       dev->name, dev->name);
-               return -ENOMEM;
+       err = bond_create_proc_info(bond);
+       if (err) {
+               printk(KERN_ERR "%s: Failed to create proc entry\n",
+                       dev->name);
+               return err;
        }
-       bond->bond_proc_dir->owner = THIS_MODULE;
 
-       bond->bond_proc_info_file = 
-               create_proc_read_entry("info", 0, bond->bond_proc_dir,
-                                       bond_read_proc, bond);
-       if (bond->bond_proc_info_file == NULL) {
-               printk(KERN_ERR "%s: Cannot init /proc/net/%s/info\n", 
-                       dev->name, dev->name);
-               remove_proc_entry(dev->name, proc_net);
-               return -ENOMEM;
-       }
-       bond->bond_proc_info_file->owner = THIS_MODULE;
-#endif /* CONFIG_PROC_FS */
+       /* Future:
+        * If anything fails beyond this point
+        * make sure to destroy the proc entry
+        */
 
        list_add_tail(&bond->bond_list, &bond_dev_list);
 
        return 0;
+/*
+err_out:
+       bond_destroy_proc_info(bond);
+       return err;
+*/
 }
 
 /*
diff -Nuarp a/drivers/net/bonding/bonding.h b/drivers/net/bonding/bonding.h
--- a/drivers/net/bonding/bonding.h     Thu Sep 11 16:48:33 2003
+++ b/drivers/net/bonding/bonding.h     Thu Sep 11 16:48:34 2003
@@ -103,6 +103,7 @@ typedef struct bonding {
 #ifdef CONFIG_PROC_FS
        struct proc_dir_entry *bond_proc_dir;
        struct proc_dir_entry *bond_proc_info_file;
+       char procdir_name[IFNAMSIZ];
 #endif /* CONFIG_PROC_FS */
        struct list_head bond_list;
        struct net_device *device;



<Prev in Thread] Current Thread [Next in Thread>
  • [PATCH 7/10] [bonding 2.6] Consolidate /proc code, add CHANGENAME handler, Amir Noam <=