--- x/net/ax25/af_ax25.c +++ y/net/ax25/af_ax25.c @@ -694,8 +694,10 @@ static int ax25_setsockopt(struct socket ax25_dev_put(ax25->ax25_dev); } + spin_lock_bh(&ax25_dev_lock); ax25->ax25_dev = ax25_dev_ax25dev(dev); if (!ax25->ax25_dev) { + spin_unlock_bh(&ax25_dev_lock); rcu_read_unlock(); res = -ENODEV; break; @@ -703,6 +705,7 @@ static int ax25_setsockopt(struct socket ax25_fillin_cb(ax25, ax25->ax25_dev); netdev_hold(dev, &ax25->dev_tracker, GFP_ATOMIC); ax25_dev_hold(ax25->ax25_dev); + spin_unlock_bh(&ax25_dev_lock); rcu_read_unlock(); break;