Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
[sfrench/cifs-2.6.git] / net / batman-adv / sysfs.c
index 208655cf67179b5c2bbcfb8330993b42ca70109f..80fc3253c3368e3cc356176c5ba961542de0a8c9 100644 (file)
@@ -2,23 +2,12 @@
 /* Copyright (C) 2010-2019  B.A.T.M.A.N. contributors:
  *
  * Marek Lindner
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, see <http://www.gnu.org/licenses/>.
  */
 
 #include "sysfs.h"
 #include "main.h"
 
+#include <asm/current.h>
 #include <linux/atomic.h>
 #include <linux/compiler.h>
 #include <linux/device.h>
@@ -34,6 +23,7 @@
 #include <linux/rculist.h>
 #include <linux/rcupdate.h>
 #include <linux/rtnetlink.h>
+#include <linux/sched.h>
 #include <linux/slab.h>
 #include <linux/stddef.h>
 #include <linux/string.h>
 #include "network-coding.h"
 #include "soft-interface.h"
 
+/**
+ * batadv_sysfs_deprecated() - Log use of deprecated batadv sysfs access
+ * @attr: attribute which was accessed
+ */
+static void batadv_sysfs_deprecated(struct attribute *attr)
+{
+       pr_warn_ratelimited(DEPRECATED "%s (pid %d) Use of sysfs file \"%s\".\nUse batadv genl family instead",
+                           current->comm, task_pid_nr(current), attr->name);
+}
+
 static struct net_device *batadv_kobj_to_netdev(struct kobject *obj)
 {
        struct device *dev = container_of(obj->parent, struct device, kobj);
@@ -114,22 +114,6 @@ batadv_kobj_to_vlan(struct batadv_priv *bat_priv, struct kobject *obj)
        return vlan;
 }
 
-#define BATADV_UEV_TYPE_VAR    "BATTYPE="
-#define BATADV_UEV_ACTION_VAR  "BATACTION="
-#define BATADV_UEV_DATA_VAR    "BATDATA="
-
-static char *batadv_uev_action_str[] = {
-       "add",
-       "del",
-       "change",
-       "loopdetect",
-};
-
-static char *batadv_uev_type_str[] = {
-       "gw",
-       "bla",
-};
-
 /* Use this, if you have customized show and store functions for vlan attrs */
 #define BATADV_ATTR_VLAN(_name, _mode, _show, _store)  \
 struct batadv_attribute batadv_attr_vlan_##_name = {   \
@@ -157,6 +141,7 @@ ssize_t batadv_store_##_name(struct kobject *kobj,                  \
        struct batadv_priv *bat_priv = netdev_priv(net_dev);            \
        ssize_t length;                                                 \
                                                                        \
+       batadv_sysfs_deprecated(attr);                                  \
        length = __batadv_store_bool_attr(buff, count, _post_func, attr,\
                                          &bat_priv->_name, net_dev);   \
                                                                        \
@@ -171,6 +156,7 @@ ssize_t batadv_show_##_name(struct kobject *kobj,                   \
 {                                                                      \
        struct batadv_priv *bat_priv = batadv_kobj_to_batpriv(kobj);    \
                                                                        \
+       batadv_sysfs_deprecated(attr);                                  \
        return sprintf(buff, "%s\n",                                    \
                       atomic_read(&bat_priv->_name) == 0 ?             \
                       "disabled" : "enabled");                         \
@@ -194,6 +180,7 @@ ssize_t batadv_store_##_name(struct kobject *kobj,                  \
        struct batadv_priv *bat_priv = netdev_priv(net_dev);            \
        ssize_t length;                                                 \
                                                                        \
+       batadv_sysfs_deprecated(attr);                                  \
        length = __batadv_store_uint_attr(buff, count, _min, _max,      \
                                          _post_func, attr,             \
                                          &bat_priv->_var, net_dev,     \
@@ -210,6 +197,7 @@ ssize_t batadv_show_##_name(struct kobject *kobj,                   \
 {                                                                      \
        struct batadv_priv *bat_priv = batadv_kobj_to_batpriv(kobj);    \
                                                                        \
+       batadv_sysfs_deprecated(attr);                                  \
        return sprintf(buff, "%i\n", atomic_read(&bat_priv->_var));     \
 }                                                                      \
 
@@ -234,6 +222,7 @@ ssize_t batadv_store_vlan_##_name(struct kobject *kobj,                     \
                                              attr, &vlan->_name,       \
                                              bat_priv->soft_iface);    \
                                                                        \
+       batadv_sysfs_deprecated(attr);                                  \
        if (vlan->vid)                                                  \
                batadv_netlink_notify_vlan(bat_priv, vlan);             \
        else                                                            \
@@ -254,6 +243,7 @@ ssize_t batadv_show_vlan_##_name(struct kobject *kobj,                      \
                             atomic_read(&vlan->_name) == 0 ?           \
                             "disabled" : "enabled");                   \
                                                                        \
+       batadv_sysfs_deprecated(attr);                                  \
        batadv_softif_vlan_put(vlan);                                   \
        return res;                                                     \
 }
@@ -275,6 +265,7 @@ ssize_t batadv_store_##_name(struct kobject *kobj,                  \
        struct batadv_priv *bat_priv;                                   \
        ssize_t length;                                                 \
                                                                        \
+       batadv_sysfs_deprecated(attr);                                  \
        hard_iface = batadv_hardif_get_by_netdev(net_dev);              \
        if (!hard_iface)                                                \
                return 0;                                               \
@@ -302,6 +293,7 @@ ssize_t batadv_show_##_name(struct kobject *kobj,                   \
        struct batadv_hard_iface *hard_iface;                           \
        ssize_t length;                                                 \
                                                                        \
+       batadv_sysfs_deprecated(attr);                                  \
        hard_iface = batadv_hardif_get_by_netdev(net_dev);              \
        if (!hard_iface)                                                \
                return 0;                                               \
@@ -446,6 +438,7 @@ static ssize_t batadv_show_bat_algo(struct kobject *kobj,
 {
        struct batadv_priv *bat_priv = batadv_kobj_to_batpriv(kobj);
 
+       batadv_sysfs_deprecated(attr);
        return sprintf(buff, "%s\n", bat_priv->algo_ops->name);
 }
 
@@ -462,6 +455,8 @@ static ssize_t batadv_show_gw_mode(struct kobject *kobj, struct attribute *attr,
        struct batadv_priv *bat_priv = batadv_kobj_to_batpriv(kobj);
        int bytes_written;
 
+       batadv_sysfs_deprecated(attr);
+
        /* GW mode is not available if the routing algorithm in use does not
         * implement the GW API
         */
@@ -496,6 +491,8 @@ static ssize_t batadv_store_gw_mode(struct kobject *kobj,
        char *curr_gw_mode_str;
        int gw_mode_tmp = -1;
 
+       batadv_sysfs_deprecated(attr);
+
        /* toggling GW mode is allowed only if the routing algorithm in use
         * provides the GW API
         */
@@ -570,6 +567,8 @@ static ssize_t batadv_show_gw_sel_class(struct kobject *kobj,
 {
        struct batadv_priv *bat_priv = batadv_kobj_to_batpriv(kobj);
 
+       batadv_sysfs_deprecated(attr);
+
        /* GW selection class is not available if the routing algorithm in use
         * does not implement the GW API
         */
@@ -590,6 +589,8 @@ static ssize_t batadv_store_gw_sel_class(struct kobject *kobj,
        struct batadv_priv *bat_priv = batadv_kobj_to_batpriv(kobj);
        ssize_t length;
 
+       batadv_sysfs_deprecated(attr);
+
        /* setting the GW selection class is allowed only if the routing
         * algorithm in use implements the GW API
         */
@@ -620,6 +621,8 @@ static ssize_t batadv_show_gw_bwidth(struct kobject *kobj,
        struct batadv_priv *bat_priv = batadv_kobj_to_batpriv(kobj);
        u32 down, up;
 
+       batadv_sysfs_deprecated(attr);
+
        down = atomic_read(&bat_priv->gw.bandwidth_down);
        up = atomic_read(&bat_priv->gw.bandwidth_up);
 
@@ -635,6 +638,8 @@ static ssize_t batadv_store_gw_bwidth(struct kobject *kobj,
        struct net_device *net_dev = batadv_kobj_to_netdev(kobj);
        ssize_t length;
 
+       batadv_sysfs_deprecated(attr);
+
        if (buff[count - 1] == '\n')
                buff[count - 1] = '\0';
 
@@ -659,6 +664,7 @@ static ssize_t batadv_show_isolation_mark(struct kobject *kobj,
 {
        struct batadv_priv *bat_priv = batadv_kobj_to_batpriv(kobj);
 
+       batadv_sysfs_deprecated(attr);
        return sprintf(buff, "%#.8x/%#.8x\n", bat_priv->isolation_mark,
                       bat_priv->isolation_mark_mask);
 }
@@ -682,6 +688,8 @@ static ssize_t batadv_store_isolation_mark(struct kobject *kobj,
        u32 mark, mask;
        char *mask_ptr;
 
+       batadv_sysfs_deprecated(attr);
+
        /* parse the mask if it has been specified, otherwise assume the mask is
         * the biggest possible
         */
@@ -937,6 +945,8 @@ static ssize_t batadv_show_mesh_iface(struct kobject *kobj,
        ssize_t length;
        const char *ifname;
 
+       batadv_sysfs_deprecated(attr);
+
        hard_iface = batadv_hardif_get_by_netdev(net_dev);
        if (!hard_iface)
                return 0;
@@ -1041,6 +1051,8 @@ static ssize_t batadv_store_mesh_iface(struct kobject *kobj,
        struct net_device *net_dev = batadv_kobj_to_netdev(kobj);
        struct batadv_store_mesh_work *store_work;
 
+       batadv_sysfs_deprecated(attr);
+
        if (buff[count - 1] == '\n')
                buff[count - 1] = '\0';
 
@@ -1072,6 +1084,8 @@ static ssize_t batadv_show_iface_status(struct kobject *kobj,
        struct batadv_hard_iface *hard_iface;
        ssize_t length;
 
+       batadv_sysfs_deprecated(attr);
+
        hard_iface = batadv_hardif_get_by_netdev(net_dev);
        if (!hard_iface)
                return 0;
@@ -1123,6 +1137,8 @@ static ssize_t batadv_store_throughput_override(struct kobject *kobj,
        u32 old_tp_override;
        bool ret;
 
+       batadv_sysfs_deprecated(attr);
+
        hard_iface = batadv_hardif_get_by_netdev(net_dev);
        if (!hard_iface)
                return -EINVAL;
@@ -1165,6 +1181,8 @@ static ssize_t batadv_show_throughput_override(struct kobject *kobj,
        struct batadv_hard_iface *hard_iface;
        u32 tp_override;
 
+       batadv_sysfs_deprecated(attr);
+
        hard_iface = batadv_hardif_get_by_netdev(net_dev);
        if (!hard_iface)
                return -EINVAL;
@@ -1250,57 +1268,3 @@ void batadv_sysfs_del_hardif(struct kobject **hardif_obj)
        kobject_put(*hardif_obj);
        *hardif_obj = NULL;
 }
-
-/**
- * batadv_throw_uevent() - Send an uevent with batman-adv specific env data
- * @bat_priv: the bat priv with all the soft interface information
- * @type: subsystem type of event. Stored in uevent's BATTYPE
- * @action: action type of event. Stored in uevent's BATACTION
- * @data: string with additional information to the event (ignored for
- *  BATADV_UEV_DEL). Stored in uevent's BATDATA
- *
- * Return: 0 on success or negative error number in case of failure
- */
-int batadv_throw_uevent(struct batadv_priv *bat_priv, enum batadv_uev_type type,
-                       enum batadv_uev_action action, const char *data)
-{
-       int ret = -ENOMEM;
-       struct kobject *bat_kobj;
-       char *uevent_env[4] = { NULL, NULL, NULL, NULL };
-
-       bat_kobj = &bat_priv->soft_iface->dev.kobj;
-
-       uevent_env[0] = kasprintf(GFP_ATOMIC,
-                                 "%s%s", BATADV_UEV_TYPE_VAR,
-                                 batadv_uev_type_str[type]);
-       if (!uevent_env[0])
-               goto out;
-
-       uevent_env[1] = kasprintf(GFP_ATOMIC,
-                                 "%s%s", BATADV_UEV_ACTION_VAR,
-                                 batadv_uev_action_str[action]);
-       if (!uevent_env[1])
-               goto out;
-
-       /* If the event is DEL, ignore the data field */
-       if (action != BATADV_UEV_DEL) {
-               uevent_env[2] = kasprintf(GFP_ATOMIC,
-                                         "%s%s", BATADV_UEV_DATA_VAR, data);
-               if (!uevent_env[2])
-                       goto out;
-       }
-
-       ret = kobject_uevent_env(bat_kobj, KOBJ_CHANGE, uevent_env);
-out:
-       kfree(uevent_env[0]);
-       kfree(uevent_env[1]);
-       kfree(uevent_env[2]);
-
-       if (ret)
-               batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
-                          "Impossible to send uevent for (%s,%s,%s) event (err: %d)\n",
-                          batadv_uev_type_str[type],
-                          batadv_uev_action_str[action],
-                          (action == BATADV_UEV_DEL ? "NULL" : data), ret);
-       return ret;
-}