@@ -4,6 +4,7 @@
*/
#include <linux/sunrpc/clnt.h>
#include <linux/sunrpc/addr.h>
+#include <linux/sunrpc/xprtsock.h>
#include <net/sock.h>
#include "sysfs.h"
@@ -70,6 +71,20 @@ static ssize_t rpc_netns_address_show(struct kobject *kobj,
static ssize_t rpc_netns_address_store(struct kobject *kobj,
struct kobj_attribute *attr, const char *buf, size_t count)
{
+ struct rpc_netns_client *c = container_of(kobj,
+ struct rpc_netns_client, kobject);
+ struct rpc_clnt *clnt = c->clnt;
+ struct rpc_xprt *xprt = rcu_dereference(clnt->cl_xprt);
+ struct sockaddr *saddr = (struct sockaddr *)&xprt->addr;
+ int port = rpc_get_port(saddr);
+
+ xprt->addrlen = rpc_pton(xprt->xprt_net, buf, count - 1, saddr, sizeof(*saddr));
+ rpc_set_port(saddr, port);
+
+ kfree(xprt->address_strings[RPC_DISPLAY_ADDR]);
+ xprt->address_strings[RPC_DISPLAY_ADDR] = kstrndup(buf, count - 1, GFP_KERNEL);
+
+ xprt->ops->connect(xprt, NULL);
return count;
}