debian: Strip epoch from version number used in directory names.
[openvswitch] / datapath / dp_sysfs_dp.c
index 8214c604e39d5956d7f7002e60dba6e73010f1dd..dc5c42a1d0b25252afcfc1f8a3ab45a78300ca4f 100644 (file)
@@ -6,6 +6,8 @@
  * kernel, by Linus Torvalds and others.
  */
 
+#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
+
 #include <linux/version.h>
 
 /*
 #define DEV_ATTR(NAME) dev_attr_##NAME
 #endif
 
-struct datapath *sysfs_get_dp(struct net_device *netdev)
+static struct datapath *sysfs_get_dp(struct net_device *netdev)
 {
-       return vport_get_dp_port(internal_dev_get_vport(netdev))->dp;
+       struct vport *vport = internal_dev_get_vport(netdev);
+       return vport ? vport->dp : NULL;
 }
-
 /*
  * Common code for storing bridge parameters.
  */
@@ -53,9 +55,9 @@ static ssize_t store_bridge_parm(DEVICE_PARAMS,
                                 const char *buf, size_t len,
                                 void (*set)(struct datapath *, unsigned long))
 {
-       struct datapath *dp = sysfs_get_dp(to_net_dev(d));
        char *endp;
        unsigned long val;
+       ssize_t result = len;
 
        if (!capable(CAP_NET_ADMIN))
                return -EPERM;
@@ -66,14 +68,24 @@ static ssize_t store_bridge_parm(DEVICE_PARAMS,
 
        /* xxx We use a default value of 0 for all fields.  If the caller is
         * xxx attempting to set the value to our default, just silently
-        * xxx ignore the request. 
+        * xxx ignore the request.
         */
        if (val != 0) {
-               printk("%s: xxx writing dp parms not supported yet!\n", 
-                      dp_name(dp));
+               struct datapath *dp;
+
+               rcu_read_lock();
+
+               dp = sysfs_get_dp(to_net_dev(d));
+               if (dp)
+                       pr_warning("%s: xxx writing dp parms not supported yet!\n",
+                              dp_name(dp));
+               else
+                       result = -ENODEV;
+
+               rcu_read_unlock();
        }
 
-       return len;
+       return result;
 }
 
 
@@ -84,7 +96,7 @@ static ssize_t show_forward_delay(DEVICE_PARAMS, char *buf)
 
 static void set_forward_delay(struct datapath *dp, unsigned long val)
 {
-       printk("%s: xxx attempt to set_forward_delay()\n", dp_name(dp));
+       pr_info("%s: xxx attempt to set_forward_delay()\n", dp_name(dp));
 }
 
 static ssize_t store_forward_delay(DEVICE_PARAMS,
@@ -102,7 +114,7 @@ static ssize_t show_hello_time(DEVICE_PARAMS, char *buf)
 
 static void set_hello_time(struct datapath *dp, unsigned long val)
 {
-       printk("%s: xxx attempt to set_hello_time()\n", dp_name(dp));
+       pr_info("%s: xxx attempt to set_hello_time()\n", dp_name(dp));
 }
 
 static ssize_t store_hello_time(DEVICE_PARAMS,
@@ -121,7 +133,7 @@ static ssize_t show_max_age(DEVICE_PARAMS, char *buf)
 
 static void set_max_age(struct datapath *dp, unsigned long val)
 {
-       printk("%s: xxx attempt to set_max_age()\n", dp_name(dp));
+       pr_info("%s: xxx attempt to set_max_age()\n", dp_name(dp));
 }
 
 static ssize_t store_max_age(DEVICE_PARAMS,
@@ -138,7 +150,7 @@ static ssize_t show_ageing_time(DEVICE_PARAMS, char *buf)
 
 static void set_ageing_time(struct datapath *dp, unsigned long val)
 {
-       printk("%s: xxx attempt to set_ageing_time()\n", dp_name(dp));
+       pr_info("%s: xxx attempt to set_ageing_time()\n", dp_name(dp));
 }
 
 static ssize_t store_ageing_time(DEVICE_PARAMS,
@@ -159,11 +171,20 @@ static ssize_t store_stp_state(DEVICE_PARAMS,
                               const char *buf,
                               size_t len)
 {
-       struct datapath *dp = sysfs_get_dp(to_net_dev(d));
+       struct datapath *dp;
+       ssize_t result = len;
+
+       rcu_read_lock();
+
+       dp = sysfs_get_dp(to_net_dev(d));
+       if (dp)
+               pr_info("%s: xxx attempt to set_stp_state()\n", dp_name(dp));
+       else
+               result = -ENODEV;
 
-       printk("%s: xxx attempt to set_stp_state()\n", dp_name(dp));
+       rcu_read_unlock();
 
-       return len;
+       return result;
 }
 static INTERNAL_DEVICE_ATTR(stp_state, S_IRUGO | S_IWUSR, show_stp_state,
                   store_stp_state);
@@ -175,7 +196,7 @@ static ssize_t show_priority(DEVICE_PARAMS, char *buf)
 
 static void set_priority(struct datapath *dp, unsigned long val)
 {
-       printk("%s: xxx attempt to set_priority()\n", dp_name(dp));
+       pr_info("%s: xxx attempt to set_priority()\n", dp_name(dp));
 }
 
 static ssize_t store_priority(DEVICE_PARAMS,
@@ -193,12 +214,25 @@ static INTERNAL_DEVICE_ATTR(root_id, S_IRUGO, show_root_id, NULL);
 
 static ssize_t show_bridge_id(DEVICE_PARAMS, char *buf)
 {
-       struct datapath *dp = sysfs_get_dp(to_net_dev(d));
-       const unsigned char *addr = vport_get_addr(dp->ports[ODPP_LOCAL]->vport);
+       struct vport *vport;
+       ssize_t result;
 
-       /* xxx Do we need a lock of some sort? */
-       return sprintf(buf, "%.2x%.2x.%.2x%.2x%.2x%.2x%.2x%.2x\n",
-                       0, 0, addr[0], addr[1], addr[2], addr[3], addr[4], addr[5]);
+       rcu_read_lock();
+
+       vport = internal_dev_get_vport(to_net_dev(d));
+       if (vport) {
+               const unsigned char *addr;
+
+               addr = vport->ops->get_addr(vport);
+               result = sprintf(buf, "%.2x%.2x.%.2x%.2x%.2x%.2x%.2x%.2x\n",
+                                0, 0, addr[0], addr[1], addr[2], addr[3],
+                                addr[4], addr[5]);
+       } else
+               result = -ENODEV;
+
+       rcu_read_unlock();
+
+       return result;
 }
 static INTERNAL_DEVICE_ATTR(bridge_id, S_IRUGO, show_bridge_id, NULL);
 
@@ -260,10 +294,21 @@ static ssize_t show_group_addr(DEVICE_PARAMS, char *buf)
 static ssize_t store_group_addr(DEVICE_PARAMS,
                                const char *buf, size_t len)
 {
-       struct datapath *dp = sysfs_get_dp(to_net_dev(d));
+       struct datapath *dp;
+       ssize_t result = len;
+
+       rcu_read_lock();
+
+       dp = sysfs_get_dp(to_net_dev(d));
+       if (dp)
+               pr_info("%s: xxx attempt to store_group_addr()\n",
+                      dp_name(dp));
+       else
+               result = -ENODEV;
+
+       rcu_read_unlock();
 
-       printk("%s: xxx attempt to store_group_addr()\n", dp_name(dp));
-       return len;
+       return result;
 }
 
 static INTERNAL_DEVICE_ATTR(group_addr, S_IRUGO | S_IWUSR,
@@ -307,7 +352,8 @@ static struct attribute_group bridge_group = {
  */
 int dp_sysfs_add_dp(struct datapath *dp)
 {
-       struct kobject *kobj = vport_get_kobj(dp->ports[ODPP_LOCAL]->vport);
+       struct vport *vport = rtnl_dereference(dp->ports[OVSP_LOCAL]);
+       struct kobject *kobj = vport->ops->get_kobj(vport);
        int err;
 
        /* Create /sys/class/net/<devname>/bridge directory. */
@@ -322,7 +368,7 @@ int dp_sysfs_add_dp(struct datapath *dp)
        err = kobject_add(&dp->ifobj, kobj, SYSFS_BRIDGE_PORT_SUBDIR);
        if (err) {
                pr_info("%s: can't add kobject (directory) %s/%s\n",
-                       __FUNCTION__, dp_name(dp), kobject_name(&dp->ifobj));
+                       __func__, dp_name(dp), kobject_name(&dp->ifobj));
                goto out2;
        }
        kobject_uevent(&dp->ifobj, KOBJ_ADD);
@@ -336,7 +382,8 @@ int dp_sysfs_add_dp(struct datapath *dp)
 
 int dp_sysfs_del_dp(struct datapath *dp)
 {
-       struct kobject *kobj = vport_get_kobj(dp->ports[ODPP_LOCAL]->vport);
+       struct vport *vport = rtnl_dereference(dp->ports[OVSP_LOCAL]);
+       struct kobject *kobj = vport->ops->get_kobj(vport);
 
        kobject_del(&dp->ifobj);
        sysfs_remove_group(kobj, &bridge_group);
@@ -346,6 +393,6 @@ int dp_sysfs_del_dp(struct datapath *dp)
 #else /* !CONFIG_SYSFS */
 int dp_sysfs_add_dp(struct datapath *dp) { return 0; }
 int dp_sysfs_del_dp(struct datapath *dp) { return 0; }
-int dp_sysfs_add_if(struct dp_port *p) { return 0; }
-int dp_sysfs_del_if(struct dp_port *p) { return 0; }
+int dp_sysfs_add_if(struct vport *p) { return 0; }
+int dp_sysfs_del_if(struct vport *p) { return 0; }
 #endif /* !CONFIG_SYSFS */