lkml.org 
[lkml]   [2015]   [Oct]   [20]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 3.19.y-ckt 154/156] batman-adv: Make NC capability changes atomic
    Date
    3.19.8-ckt8 -stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: =?UTF-8?q?Linus=20L=C3=BCssing?= <linus.luessing@c0d3.blue>

    commit 4635469f5c617282f18c69643af36cd8c0acf707 upstream.

    Bitwise OR/AND assignments in C aren't guaranteed to be atomic. One
    OGM handler might undo the set/clear of a specific bit from another
    handler run in between.

    Fix this by using the atomic set_bit()/clear_bit()/test_bit() functions.

    Fixes: 3f4841ffb336 ("batman-adv: tvlv - add network coding container")
    Signed-off-by: Linus Lüssing <linus.luessing@c0d3.blue>
    Signed-off-by: Marek Lindner <mareklindner@neomailbox.ch>
    Signed-off-by: Antonio Quartulli <antonio@meshcoding.com>
    [ luis: backported to 3.16: adjusted context ]
    Signed-off-by: Luis Henriques <luis.henriques@canonical.com>

    Signed-off-by: Kamal Mostafa <kamal@canonical.com>
    ---
    net/batman-adv/network-coding.c | 7 ++++---
    net/batman-adv/types.h | 2 +-
    2 files changed, 5 insertions(+), 4 deletions(-)

    diff --git a/net/batman-adv/network-coding.c b/net/batman-adv/network-coding.c
    index fab47f1..65adf30 100644
    --- a/net/batman-adv/network-coding.c
    +++ b/net/batman-adv/network-coding.c
    @@ -15,6 +15,7 @@
    * along with this program; if not, see <http://www.gnu.org/licenses/>.
    */

    +#include <linux/bitops.h>
    #include <linux/debugfs.h>

    #include "main.h"
    @@ -105,9 +106,9 @@ static void batadv_nc_tvlv_ogm_handler_v1(struct batadv_priv *bat_priv,
    uint16_t tvlv_value_len)
    {
    if (flags & BATADV_TVLV_HANDLER_OGM_CIFNOTFND)
    - orig->capabilities &= ~BATADV_ORIG_CAPA_HAS_NC;
    + clear_bit(BATADV_ORIG_CAPA_HAS_NC, &orig->capabilities);
    else
    - orig->capabilities |= BATADV_ORIG_CAPA_HAS_NC;
    + set_bit(BATADV_ORIG_CAPA_HAS_NC, &orig->capabilities);
    }

    /**
    @@ -871,7 +872,7 @@ void batadv_nc_update_nc_node(struct batadv_priv *bat_priv,
    goto out;

    /* check if orig node is network coding enabled */
    - if (!(orig_node->capabilities & BATADV_ORIG_CAPA_HAS_NC))
    + if (!test_bit(BATADV_ORIG_CAPA_HAS_NC, &orig_node->capabilities))
    goto out;

    /* accept ogms from 'good' neighbors and single hop neighbors */
    diff --git a/net/batman-adv/types.h b/net/batman-adv/types.h
    index 3d316c8..1b0b053 100644
    --- a/net/batman-adv/types.h
    +++ b/net/batman-adv/types.h
    @@ -299,7 +299,7 @@ struct batadv_orig_node {
    */
    enum batadv_orig_capabilities {
    BATADV_ORIG_CAPA_HAS_DAT,
    - BATADV_ORIG_CAPA_HAS_NC = BIT(1),
    + BATADV_ORIG_CAPA_HAS_NC,
    BATADV_ORIG_CAPA_HAS_TT = BIT(2),
    BATADV_ORIG_CAPA_HAS_MCAST = BIT(3),
    };
    --
    1.9.1


    \
     
     \ /
      Last update: 2015-10-21 00:01    [W:5.353 / U:0.624 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site