failover
static DEVICE_ATTR_WO(failover);
struct failover *net_failover_create(struct net_device *standby_dev)
struct failover *failover;
failover = failover_register(failover_dev, &net_failover_ops);
if (IS_ERR(failover)) {
err = PTR_ERR(failover);
return failover;
void net_failover_destroy(struct failover *failover)
if (!failover)
failover_dev = rcu_dereference(failover->failover_dev);
failover_unregister(failover);
struct failover *failover;
vi->failover = net_failover_create(vi->dev);
if (IS_ERR(vi->failover)) {
err = PTR_ERR(vi->failover);
net_failover_destroy(vi->failover);
net_failover_destroy(vi->failover);
return sysfs_emit(buf, "%lu\n", atomic_long_read(&ns->failover));
unsigned long failover;
ret = kstrtoul(buf, 0, &failover);
atomic_long_set(&ns->failover, failover);
atomic_long_inc(&ns->failover);
atomic_long_t failover;
struct failover *failover_register(struct net_device *dev,
void failover_unregister(struct failover *failover);
struct failover *net_failover_create(struct net_device *standby_dev);
void net_failover_destroy(struct failover *failover);
struct failover *failover;
struct failover *failover_register(struct net_device *dev,
struct failover *failover;
failover = kzalloc_obj(*failover);
if (!failover)
rcu_assign_pointer(failover->ops, ops);
netdev_hold(dev, &failover->dev_tracker, GFP_KERNEL);
rcu_assign_pointer(failover->failover_dev, dev);
list_add_tail(&failover->list, &failover_list);
list_for_each_entry(failover, &failover_list, list) {
return failover;
failover_dev = rtnl_dereference(failover->failover_dev);
void failover_unregister(struct failover *failover)
failover_dev = rcu_dereference(failover->failover_dev);
netdev_put(failover_dev, &failover->dev_tracker);
list_del(&failover->list);
kfree(failover);
*ops = rtnl_dereference(failover->ops);