team: make team_mode struct const
authorJiri Pirko <jpirko@redhat.com>
Tue, 19 Jun 2012 05:54:03 +0000 (05:54 +0000)
committerDavid S. Miller <davem@davemloft.net>
Tue, 19 Jun 2012 22:00:22 +0000 (15:00 -0700)
Signed-off-by: Jiri Pirko <jpirko@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/team/team.c
drivers/net/team/team_mode_activebackup.c
drivers/net/team/team_mode_loadbalance.c
drivers/net/team/team_mode_roundrobin.c
include/linux/if_team.h

index c61ae35a53ce680125452d43c6af8ed984762d2b..bdf87a971382b2070c4542c656d5a7978056f839 100644 (file)
@@ -371,13 +371,18 @@ static int team_option_set(struct team *team,
 static LIST_HEAD(mode_list);
 static DEFINE_SPINLOCK(mode_list_lock);
 
-static struct team_mode *__find_mode(const char *kind)
+struct team_mode_item {
+       struct list_head list;
+       const struct team_mode *mode;
+};
+
+static struct team_mode_item *__find_mode(const char *kind)
 {
-       struct team_mode *mode;
+       struct team_mode_item *mitem;
 
-       list_for_each_entry(mode, &mode_list, list) {
-               if (strcmp(mode->kind, kind) == 0)
-                       return mode;
+       list_for_each_entry(mitem, &mode_list, list) {
+               if (strcmp(mitem->mode->kind, kind) == 0)
+                       return mitem;
        }
        return NULL;
 }
@@ -392,49 +397,65 @@ static bool is_good_mode_name(const char *name)
        return true;
 }
 
-int team_mode_register(struct team_mode *mode)
+int team_mode_register(const struct team_mode *mode)
 {
        int err = 0;
+       struct team_mode_item *mitem;
 
        if (!is_good_mode_name(mode->kind) ||
            mode->priv_size > TEAM_MODE_PRIV_SIZE)
                return -EINVAL;
+
+       mitem = kmalloc(sizeof(*mitem), GFP_KERNEL);
+       if (!mitem)
+               return -ENOMEM;
+
        spin_lock(&mode_list_lock);
        if (__find_mode(mode->kind)) {
                err = -EEXIST;
+               kfree(mitem);
                goto unlock;
        }
-       list_add_tail(&mode->list, &mode_list);
+       mitem->mode = mode;
+       list_add_tail(&mitem->list, &mode_list);
 unlock:
        spin_unlock(&mode_list_lock);
        return err;
 }
 EXPORT_SYMBOL(team_mode_register);
 
-int team_mode_unregister(struct team_mode *mode)
+void team_mode_unregister(const struct team_mode *mode)
 {
+       struct team_mode_item *mitem;
+
        spin_lock(&mode_list_lock);
-       list_del_init(&mode->list);
+       mitem = __find_mode(mode->kind);
+       if (mitem) {
+               list_del_init(&mitem->list);
+               kfree(mitem);
+       }
        spin_unlock(&mode_list_lock);
-       return 0;
 }
 EXPORT_SYMBOL(team_mode_unregister);
 
-static struct team_mode *team_mode_get(const char *kind)
+static const struct team_mode *team_mode_get(const char *kind)
 {
-       struct team_mode *mode;
+       struct team_mode_item *mitem;
+       const struct team_mode *mode = NULL;
 
        spin_lock(&mode_list_lock);
-       mode = __find_mode(kind);
-       if (!mode) {
+       mitem = __find_mode(kind);
+       if (!mitem) {
                spin_unlock(&mode_list_lock);
                request_module("team-mode-%s", kind);
                spin_lock(&mode_list_lock);
-               mode = __find_mode(kind);
+               mitem = __find_mode(kind);
        }
-       if (mode)
+       if (mitem) {
+               mode = mitem->mode;
                if (!try_module_get(mode->owner))
                        mode = NULL;
+       }
 
        spin_unlock(&mode_list_lock);
        return mode;
@@ -523,7 +544,7 @@ static int __team_change_mode(struct team *team,
 
 static int team_change_mode(struct team *team, const char *kind)
 {
-       struct team_mode *new_mode;
+       const struct team_mode *new_mode;
        struct net_device *dev = team->dev;
        int err;
 
index fd6bd03aaa897b711ef89eda77db98b8395573ac..acd925f070b55fb0724535ddd28a4fd024392433 100644 (file)
@@ -108,7 +108,7 @@ static const struct team_mode_ops ab_mode_ops = {
        .port_leave             = ab_port_leave,
 };
 
-static struct team_mode ab_mode = {
+static const struct team_mode ab_mode = {
        .kind           = "activebackup",
        .owner          = THIS_MODULE,
        .priv_size      = sizeof(struct ab_priv),
index 86e8183c8e3d90129a4887037ea76a15b1d422d1..6452428a1d6c0b0d065fa9a05cccfda8a77d1ce6 100644 (file)
@@ -148,7 +148,7 @@ static const struct team_mode_ops lb_mode_ops = {
        .transmit               = lb_transmit,
 };
 
-static struct team_mode lb_mode = {
+static const struct team_mode lb_mode = {
        .kind           = "loadbalance",
        .owner          = THIS_MODULE,
        .priv_size      = sizeof(struct lb_priv),
index 6abfbdc96be520a53664826655cdf8e13b4b2dc0..daafca2b2da41ed99d4ba91872ba137a5e4664e5 100644 (file)
@@ -81,7 +81,7 @@ static const struct team_mode_ops rr_mode_ops = {
        .port_change_mac        = rr_port_change_mac,
 };
 
-static struct team_mode rr_mode = {
+static const struct team_mode rr_mode = {
        .kind           = "roundrobin",
        .owner          = THIS_MODULE,
        .priv_size      = sizeof(struct rr_priv),
index 8185f57a9c7f6f4a3aea256f991cab7f469d9da7..d45fcd5a188ddf5e0983095db4ba6f8edce68137 100644 (file)
@@ -105,7 +105,6 @@ struct team_option {
 };
 
 struct team_mode {
-       struct list_head list;
        const char *kind;
        struct module *owner;
        size_t priv_size;
@@ -178,8 +177,8 @@ extern int team_options_register(struct team *team,
 extern void team_options_unregister(struct team *team,
                                    const struct team_option *option,
                                    size_t option_count);
-extern int team_mode_register(struct team_mode *mode);
-extern int team_mode_unregister(struct team_mode *mode);
+extern int team_mode_register(const struct team_mode *mode);
+extern void team_mode_unregister(const struct team_mode *mode);
 
 #endif /* __KERNEL__ */