+}
+
+static int patch_set_options(struct vport *vport, struct nlattr *options)
+{
+ struct patch_vport *patch_vport = patch_vport_priv(vport);
+ struct patch_config *patchconf;
+ int err;
+
+ patchconf = kmemdup(rtnl_dereference(patch_vport->patchconf),
+ sizeof(struct patch_config), GFP_KERNEL);
+ if (!patchconf) {
+ err = -ENOMEM;
+ goto error;
+ }
+
+ err = patch_set_config(vport, options, patchconf);
+ if (err)
+ goto error_free;
+
+ assign_config_rcu(vport, patchconf);
+
+ hlist_del(&patch_vport->hash_node);
+
+ rcu_assign_pointer(patch_vport->peer, vport_locate(patchconf->peer_name));
+ hlist_add_head(&patch_vport->hash_node, hash_bucket(patchconf->peer_name));