Commit 50c790a0 authored by Benjamin Coddington's avatar Benjamin Coddington Committed by Trond Myklebust
Browse files

NFSv4: use unique client identifiers in network namespaces



In order to differentiate client state, assign a random uuid to the
uniquifing portion of the client identifier when a network namespace is
created.  Containers may still override this value if they wish to maintain
stable client identifiers by writing to /sys/fs/nfs/net/client/identifier,
either by udev rules or other means.

Signed-off-by: default avatarBenjamin Coddington <bcodding@redhat.com>
Signed-off-by: default avatarTrond Myklebust <trond.myklebust@hammerspace.com>
parent 43245eca
Loading
Loading
Loading
Loading
+14 −0
Original line number Diff line number Diff line
@@ -151,6 +151,18 @@ static struct kobj_type nfs_netns_client_type = {
	.namespace = nfs_netns_client_namespace,
};

static void assign_unique_clientid(struct nfs_netns_client *clp)
{
	unsigned char client_uuid[16];
	char *uuid_str = kmalloc(UUID_STRING_LEN + 1, GFP_KERNEL);

	if (uuid_str) {
		generate_random_uuid(client_uuid);
		sprintf(uuid_str, "%pU", client_uuid);
		rcu_assign_pointer(clp->identifier, uuid_str);
	}
}

static struct nfs_netns_client *nfs_netns_client_alloc(struct kobject *parent,
		struct net *net)
{
@@ -158,6 +170,8 @@ static struct nfs_netns_client *nfs_netns_client_alloc(struct kobject *parent,

	p = kzalloc(sizeof(*p), GFP_KERNEL);
	if (p) {
		if (net != &init_net)
			assign_unique_clientid(p);
		p->net = net;
		p->kobject.kset = nfs_client_kset;
		if (kobject_init_and_add(&p->kobject, &nfs_netns_client_type,